基于单片机AT89S52的直流电机PWM调速控制系统文档格式.docx
《基于单片机AT89S52的直流电机PWM调速控制系统文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机AT89S52的直流电机PWM调速控制系统文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
電動機所處速度級以速度檔級數顯示。
正轉時最高位顯示“三”,其他三位為電機轉速;
反轉時最高位顯示“F”,其他三位為電機轉速。
每次電動機啟動後開始顯示,停止時數碼管顯示出“0000”。
1、系統的硬體電路設計與分析
電動機PWM驅動模組的電路設計與實現具體電路見下圖。
本電路採用的是基於PWM原理的H型橋式驅動電路。
PWM電路由複合體管組成H型橋式電路構成,四部分電晶體以對角組合分為兩組:
根據兩個輸入端的高低電平決定電晶體的導通和截止。
4個二極體在電路中起防止電晶體產生反向電壓的保護作用,防止電動機兩端的電流和電晶體上的電流過大的保護作用。
在實驗中的控制系統電壓統一為5v電源,因此若複合管基極由控制系統直接控制,則控制電壓最高為5V,再加上三極管本身壓降,加到電動機兩端的電壓就只有4V左右,嚴重減弱了電動機的驅動力。
基於上述考慮,我們運用了TLP521-2光耦集成塊,將控制部分與電動機的驅動部分隔離開來。
輸入端各通過一個三極管增大光耦的驅動電流;
電動機驅動部分通過外接12V電源驅動。
這樣不僅增加了各系統模組之間的隔離度,也使驅動電流得到了大大的增強。
在電動機驅動信號方面,我們採用了占空比可調的週期矩形信號控制。
脈衝頻率對電動機轉速有影響,脈衝頻率高連續性好,但帶帶負載能力差脈衝頻率低則反之。
經實驗發現,當電動機轉動平穩,但加負載後,速度下降明顯,低速時甚至會停轉;
脈衝頻率在10Hz以下,電動機轉動有明顯跳動現象。
而具體採用的頻率可根據個別電動機性能在此範圍內調節。
通過P10輸入高電平信號,P11輸入低電平,電機正轉;
通過P10輸入低電平信號,P11輸入高電平,電機反轉;
P10、P11同時為高電平或低電平時,電機不轉。
通過對信號占空比的調整來對電機轉速進行調節。
2、系統的軟體設計
本系統編程部分工作採用KELI-C51語言完成,採用模組化的設計方法,與各副程式做為實現各部分功能和過程的入口,完成鍵盤輸入、按鍵識別和功能、PWM脈寬控制和數碼管顯示等部分的設計。
單片機資源分配如下表:
P0
顯示模組介面
鍵盤中斷
P1
鍵盤模組介面
P1.0/P1.1
PWM電機驅動介面
系統時鐘
①PWM脈寬控制:
本設計中採用軟體延時方式對脈衝寬度進行控制,延時程式函數如下:
/*****************延時函數*************************/
delays()
{
uchari;
for(i=5000;
i>
0;
i--);
}
②鍵盤中斷處理副程式:
採用中斷方式,按下鍵,完成延時去抖動、鍵碼識別、按鍵功能執行。
要實現按住加/減速鍵不放時恒加或恒減速直到放開停止,就需在判斷是否鬆開該按鍵時,每進行一次增加/減少一定的占空比。
③顯示副程式:
利用數組方式定義顯示緩存區,緩存區有8位,分別存放各個數碼管要顯示的值。
④定時中斷處理程式:
採用定時方式1,因為單片機使用12M晶振,可產生最高約為65.5ms的延時。
對定時器置初值B1E0H可定時20ms,即系統時鐘精度可達0.02s。
當20ms定時時間到,定時器溢出則回應該定時中斷處理程式,完成對定時器的再次賦值,並對全局變數time加1,這樣,通過變數time可計算出系統的運行時間。
3、軟體設計中的特點:
對於電機的啟停,在PWM控制上使用漸變的脈寬調整,即開啟後由停止勻加速到默認速度,停止則由於當前速度逐漸降至零。
這樣有利於保護電機。
鍵盤處理上採用中斷方式,不必使程式對鍵盤反復掃描,提高了程式的效率。
第三章:
系統硬體電路設計
整體框圖如下:
第四章:
系統功能調試
仿真整體圖如下:
直流電機的調試功能仿真如下圖:
1、正轉時,電機正轉,數碼管最高位顯示“三”,其他三位先所給定頻率,如下圖:
2、反轉時,電機反轉,數碼管最高位顯示“F”,其他三位先所給定頻率,如下圖:
3、輸出波形如下:
4、加速分5檔,波形依次如下:
5、減速分5檔,波形如下:
第五章:
程式
見附件1
第六章:
PCB圖
見附件2
第七章:
元件清單
見附件3
第8章:
心得體會
略
附件1
/***************基於單片機AT89C51的直流電機PWM調速控制系統*************/
/*******************地點:
廣東松山職業技術學院************************/
/****************班級:
2009級檢測技術及應用****************************/
/*****************指導老師:
張軍濤***********************************/
/***************時間:
2011年7月1日***********************************/
/************頭檔*********/
#include<
reg51.h>
absacc.h>
#include<
intrins.h>
/**************************/
/********自定義變數********/
#defineuintunsignedint//自定義變數
#defineucharunsignedchar
chargw,sw,bw,qw;
ucharj;
//定時次數,每次20ms
ucharf=5;
//計數的次數
sbitP10=P1^0;
//PWM輸出波形1
sbitP11=P1^1;
//PWM輸出波形2
sbitP12=P1^2;
//正反轉
sbitP13=P1^3;
//加速
sbitP14=P1^4;
//減速
sbitP15=P1^5;
//停止
sbitP16=P1^6;
//啟動
uchark;
uchart;
//脈衝加減
/**************************/*
/*********控制位定義********************/
ucharcodesmg[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x73,0x71};
//程式存儲區定義字型碼表
chardataled[4]={0x08,0x04,0x02,0x01};
//位碼
uintx;
//數碼管顯示的數值
display();
//數碼管顯示
delays();
//延時函數
key();
displays();
/*****************************************/
/***************主函數********************/
main(void)
{
TMOD=0x51;
//T0方式1定時計數T1方式1計數
TH0=0xb1;
//裝入初值20MS
TL0=0xe0;
TH1=0x00;
//計數567
TL1=0x00;
TR0=1;
//啟動t0
TR1=1;
//啟動t1
gw=sw=bw=qw=0;
//數碼管初始化
P0=0xc0;
P2=1;
while
(1)//無限迴圈
{
display();
//數碼管顯示
key();
}
/***************數碼管顯示****************/
display()
gw=x%10;
//求速度個位值,送到個位顯示緩衝區
sw=(x/10)%10;
//求速度十位值,送到十位顯示緩衝區
bw=(x/100)%10;
//求速度百位值,送到百位顯示緩衝區
qw=x/1000;
//求速度千位值,送到千位顯示緩衝區
for(i=0;
i<
4;
)
{
P2=led[i];
if(i==0)//顯示個位
P0=smg[gw];
delays();
}
elseif(i==1)//顯示十位
{
P0=smg[sw];
}
elseif(i==2)//顯示百位
{
P0=smg[bw];
delays();
}
elseif(i==3)//顯示千位
if(k==0)//正轉時顯示"
三"
P0=0x49;
else
P0=0x71;
//反轉時顯示"
F"
}
}
i++;
/*******************************************************/
/************************************************/
/*********t0定時*中斷函數*************/
voidt0()interrupt1using2
//重裝t0
f--;
if(k==0)
if(f<
t)
P10=1;
else
P10=0;
P11=0;
if(f<
P11=1;
else
P11=0;
P10=0;
if(f==0)
f=5;
}
j++;
if(j==50)
j=0;
x=TH1*256+TL1;
//t1方式1計數,讀入計數值
x++;
display();
/****************按鍵掃描**************/
key()
if(P12==0)//如果按下,
while(!
P12)//去抖動
k=~k;
}
if(P16==0)//啟動
while(P16==0);
IE=0x8a;
}
if(P13==0)//加速
while(P13==0);
t++;
if(t>
=5)
t=5;
if(P14==0)//減速
while(P14==0);
t--;
if(t<
1)
t=1;
if(P15==0)//停止
while(P15==0);
EA=0;
}
/******************************************************/
附件2:
附件3:
元件
數量(個)
光電耦合器:
TLP521-2
1
三極管8550
4
按鍵
5
三極管8050
自鎖按鍵
1N4007
At89s52
四位一體數碼管
12M晶振
電容104
Led
直流電機
電阻1K
3
電容22P
2
電阻10K
電解電容47P/16V
74LS04
下載口