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;
}
}
2、測速系統(tǒng)的工作原理為:利用電機(jī)軸上帶的圓盤的缺口,引起光電開關(guān)產(chǎn)生高電平脈沖,單片機(jī)就采集此脈沖的寬度,加以計算,得出其實時速度。
獲取脈沖寬度值子函數(shù)如下:
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; //計數(shù)器1打開
else
goto out;
//IE1 = 0;//中斷請求標(biāo)志
EX1 = 1;//外部中斷1啟動
n = 0;
n1 = n;
while(m==0&&((n-n1)<30))
{}
if(m==0)//M=1,則已經(jīng)進(jìn)入out_int1中斷,若等于0,則說明30MS延時已過
{
TH1_1 = 0;
TL1_1 = 0;
}
out:
IE1 = 0;//中斷請求標(biāo)志
m = 0;
EX1 = 0;//外部中斷允許位
TR1 = 0;
width_1 = (TH1_1*256+TL1_1);//timepr=脈沖寬度 /μS
}
另外為了穩(wěn)定測得的轉(zhuǎn)速值,在程序中加了一個取平均值的函數(shù)(幾乎在整個程序中都有感覺,程序?qū)懙貌痪珶挘悬c累贅,呵呵,但總算功能是能實現(xiàn)嘛~反正畢業(yè)設(shè)計對程序執(zhí)行效率沒要求。)
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
goto GG;
}
width = (widthbuf[0] + widthbuf[1] + widthbuf[2] + widthbuf[3] + widthbuf[4] + widthbuf[5])/6;將測得的連續(xù)6個不為零的脈沖寬度取平均值,以消除偶然的不穩(wěn)定因素,使轉(zhuǎn)速顯示更加穩(wěn)定
3、PI調(diào)節(jié)
PI調(diào)節(jié)計算公式如下[5]:
YK = KP*EK + KI*EK2
YK:要輸出的數(shù)據(jù)增量
EK:設(shè)定值和實測值的差值
EK1:上次的EK值
EK2:EK-EK1的差值
KP:比例系數(shù)(本程序中設(shè)KP=1.6)經(jīng)反復(fù)湊試的結(jié)果
KI:積分系數(shù)(本程序中設(shè)KI=1.5)經(jīng)反復(fù)湊試的結(jié)果
當(dāng)KP和KI為以上值時,系統(tǒng)處于最佳運行狀態(tài),實驗中表現(xiàn)為:電機(jī)原來速度為2000,當(dāng)設(shè)置為4500轉(zhuǎn)時,可以在2秒之內(nèi)迅速上升并穩(wěn)定于4500±20,而超調(diào)量也僅為+300轉(zhuǎn)/分,出現(xiàn)在第一次上升的時候,下來之后便穩(wěn)定了。
速度變化曲線:
實物圖:



嘿嘿,希望對廣大單片機(jī)初學(xué)者有那么點幫助~順便再做做廣告,有興趣購買的
可以+QQ:54281963(注明畢業(yè)設(shè)計),或者發(fā)郵件至:upssure@126.com
或者,本人也可代做51單片機(jī)系列的設(shè)計,詳談。
沒學(xué)其他,呵呵,能把一樣做精也很不錯了,反正現(xiàn)在51系列單片機(jī)功能已經(jīng)是今非昔比了,什么看門狗,PWM,AD,EEPROM,雙串口,N外部中斷口的,一應(yīng)俱全。STC剛出一款速度號稱是經(jīng)典51速度的480倍的單指令周期單片機(jī)呢。
對研究啊,創(chuàng)新啊什么的,當(dāng)然是AVR,DSP好,但是對于做產(chǎn)品來說,就當(dāng)然是價格低廉的51系列好啦~只要51能實現(xiàn)的,就盡量用51,對產(chǎn)品來說,成品很重要啊~^_^!