1.采用全控型的開關功率元件進行脈寬調制(PulseWidth Modulation,簡稱PWM)已成為直流電機新的調速方式。
2.本設計采用由單片機控制實現的脈沖計數法。
3.本設計在硬件電路上共分為5個部分,單片機部分、按鍵輸入、PWM斬波電路、測速電路以及模擬負載
4.單片機接口電路
本設計采用的是STC的89C52單片機
工作電壓范圍為5.5V-3.4V
晶振選用石英晶振,頻率為20MHz
采用的是12V直流通過7805三端穩壓器穩壓到5V,給單片機和顯示部分供電。
在第9腳-RST,復位腳外,加了一個復位按鍵和復位電路,復位原理為:
第一次上電時,+5V通過給電容充電,于是此時電容相當于短路,+5V直接加到RST腳上,單片機自動復位。過了極短的時間,電容充電完畢,此時電容則相當于開路,于是RST腳被電阻R113拉為低,單片機開始正常工作。
當RESET鍵按下時,+5V通過按鍵加到RST腳上,單片機復位,RESET鍵彈起之后,RST腳重新被R113拉為低,單片機開始正常工作。
5.按鍵輸入電路
6.PWM驅動電路
如圖所示,R21為P1.1口的上拉電阻10k,R20為限流電阻。
當P1.1口為低時,8050的基極電平被拉低,此時8050截止,所以9012的基極為高,9012截止,電機兩端沒有電壓。
當P1.1口為高時,8050基極電壓也為高,于是8050導通, 8050的集電極電壓為低,此時9012的基極也為低,9012導通,+12V加到電機兩端,電機開始轉動。
所以,當P1.1口為高時,電機兩端電壓也為高;P1.1口為低時,電機兩端電壓也為低。于是當P1.1口產生PWM信號輸出時,電機兩端會產生同樣的PWM波形,從而達到調節電機轉速的目的。
7.測速電路
R25=510 R22=10K R24=10K
8.軟件編程 按鍵系統
其對應程序如下:
voidclear_shake()
{
if(nn ==0)
{n = 0;}
if(nn1 == 0)
{
nn = 1;
if(shake == 0&&n >= 100)//shake就是被按下的鍵
{
shake_1 = 1;
nn1 = 1;
nn = 0;
}
}
9.PWM
PWM調速子程序是放在定時器0中斷中進行的,中斷設置如下:
//------T0-----------T0用作斬波
ET0 = 1;//中斷允許位
time0_set = 300;
time0_tmp = 65536-(time0_set)*fosc/12;//
TH0 = (time0_tmp/256);
TL0 = (time0_tmp%256);
TF0 = 0;//CLR TF0
TR0 =1;//SETB TR0
PT0 = 1; //高優先級
下面是PWM的中斷子程序:
void time0_int(void) interrupt 1
{
TH0=(time0_tmp/256);
TL0=(time0_tmp%256);
if(cut== 1)
{
time0_tmp= 65536-time0_set*20/12;
cut= 0;
}
else
{
time0_tmp= 65536-(time0 - time0_set)*20/12;
cut= 1;
}
}
10.測速系統
//-------外部中斷1--------用做測速
IT1= 1; //為跳沿觸發方式,引腳INT1上的電平從高到低的負跳變有效。
IE1= 0; //中斷請求標志
EX1= 0; //外部中斷1允許位
PX1= 0; //為高優先級
//------T1-----------T1用做計數
TH1= 0;
TL1= 0;
TF1= 0;//中斷請求位
TR1= 0;//計數器1關閉
ET1= 0; //禁止T1溢出中斷
//--------------------------------
IE = 0xaa;//
TMOD = 0x91;//
//---------------------------
外部中斷1中斷服務子程序如下:
void out1_int(void) interrupt 2
{
IE1 = 0;
EX1 = 0;
TR1 = 0;
TH1_1 = TH1;
TL1_1 = TL1;
TH1 = 0;
TL1 = 0;
m = 1;
}
獲取脈沖寬度值子函數如下:
void getwidth_1()
{
TH1 = 0;
TL1 = 0;
n = 0;
n1 = n;
while(INT1==1&&((n-n1)<30))//n為每1MS +2
{}
if(INT1==0)
TR1 = 1; //計數器1打開
else
goto out;
//IE1 = 0;//中斷請求標志
EX1 = 1;//外部中斷1啟動
n = 0;
n1 = n;
while(m==0&&((n-n1)<30))
{}
if(m==0)//M=1,則已經進入out_int1中斷,若等于0,則說明30MS延時已過
{
TH1_1= 0;
TL1_1= 0;
}
out:
IE1 = 0;//中斷請求標志
m = 0;
EX1 = 0;//外部中斷允許位
TR1 = 0;
width_1 = (TH1_1*256+TL1_1);//timepr=脈沖寬度 /μS
}
此外,為了穩定測得的轉速值,在程序中加了一個取平均值的函數:
void getwidth()
{
int gw,gw1;
width = 0;
gw1 = 0;
for(gw=0;gw<6;gw++)
{
GG: getwidth_1();
if(width_1!= 0)
widthbuf[gw]= width_1;
else
gotoGG;
}
width= (widthbuf[0] + widthbuf[1] + widthbuf[2] + widthbuf[3] + widthbuf[4] +widthbuf[5])/6;
這段函數的意思就是,將測得的連續6個不為零的脈沖寬度取平均值,以消除偶然的不穩定因素,使轉速顯示更加穩定。
11.PID調節系統 即精確誤差
void PI()
{
EK1 = EK;
EK = speed_set - speed;
EK2 = EK - EK1;
if(PIn == 0)
{
EK2 = 1000;
PIn++;
}
YK = KP*EK + KI*EK2;
|