孫鵬
摘要:隨著信息技術(shù)的發(fā)展,越來(lái)越多的電子設(shè)備開始變得智能化。對(duì)于傳統(tǒng)pid控制法,在一些簡(jiǎn)單,精度要求低的場(chǎng)所下,起著很重要的作用,本文介紹實(shí)習(xí)過程中做pid電機(jī)調(diào)速的一些心得。 一題目要求:本題是以8/16位微控制器為基礎(chǔ),實(shí)現(xiàn)小型直流電機(jī)閉環(huán)調(diào)速功能,設(shè)計(jì)PID數(shù)字控制器。 具體設(shè)計(jì)要求:熟悉微控制器,選擇適合的微控制器芯片;設(shè)計(jì)轉(zhuǎn)速編碼檢測(cè)、驅(qū)動(dòng)調(diào)節(jié)設(shè)計(jì);實(shí)現(xiàn)PID閉環(huán)控制設(shè)計(jì),電機(jī)速度由按鍵分段給定或電位器連續(xù)給定,數(shù)碼管跟蹤顯示當(dāng)前給定速度和電機(jī)實(shí)際運(yùn)行速度,實(shí)現(xiàn)PID參數(shù)在線顯示和修改;完成硬件電路設(shè)計(jì)和測(cè)控程序的設(shè)計(jì);文擋整理,撰寫報(bào)告。
二題目理解:因?yàn)橹昂噶肆?font face="Times New Roman">stm8開發(fā)板,而stm8作為意法半導(dǎo)體的一款8位mcu,自帶ad,定時(shí)器,捕獲,電機(jī)控制pwm波,完全能夠滿足題目8位微處理器的要求。實(shí)現(xiàn)直流電機(jī)閉環(huán)控制,即需要用pid 控制,因?yàn)橹帮L(fēng)馳電掣比賽上有看過,所以代碼也很簡(jiǎn)單。 我選用的是stm103k3t6,8kflash,1kram,640bitepprom.內(nèi)置高級(jí)定時(shí)器time1,通用定時(shí)器(16位)timer2,8位定時(shí)器time4.電機(jī)使用廢棄的剃須刀上的馬達(dá),傳感器是用100k的光敏電阻和100mw的激光頭,電機(jī)驅(qū)動(dòng)使用航模通用nmos管st2302.使用鋰電池供電,lcd1602作為顯示模塊,紅外遙控作為控制鍵盤。 三硬件設(shè)計(jì)3.1CPU選擇因?yàn)?font face="Times New Roman">stm32是32位單片機(jī),而430是16位單片機(jī),c51為8位單片機(jī)。用stm32和430均可實(shí)現(xiàn)本題的要求,但用c51來(lái)完成本題恐怕有些挑戰(zhàn)性。為了用最簡(jiǎn)單的方法完成本題,我選用了stm8103k3t6.8位單片機(jī)中性價(jià)比之王。其內(nèi)部結(jié)構(gòu)如圖一所示:
圖一 3.2顯示模塊: 因?yàn)轭}目要求顯示模塊需要顯示當(dāng)前速度和設(shè)定速度外,還需要能夠修改pid的參數(shù),所以選擇了最通用的顯示屏幕lcd1602.
3.3控制模塊因?yàn)橹坝眠^按鍵掃描和按鍵中斷的函數(shù),但發(fā)現(xiàn)按鍵需要延時(shí),很浪費(fèi)CPU資源,所以選擇用紅外發(fā)射接收模塊。既可拓展功能,又可節(jié)省CPU資源,最大的好處就是不用觸摸按鍵,桌面的抖動(dòng)可能導(dǎo)致光電傳感器檢測(cè)到的計(jì)數(shù)脈沖不準(zhǔn)確。 3.4電源部分電源為自己手機(jī)電池,系統(tǒng)工作電流120ma-200ma,待機(jī)電流80ma左右。而電池的電量為2100ma/h。實(shí)際在帶電機(jī)工作情況下可以工作5小時(shí)上。 為了方便電池充電,本系統(tǒng)自帶鋰電池專用充電芯片tp4056. 為了給系統(tǒng)提供穩(wěn)定的5v電源,本系統(tǒng)采用了專用700ma5v升壓模塊,實(shí)際測(cè)得升壓模塊輸出電壓為5.1-5.2v?梢越o系統(tǒng)大部分電路供電。 3.5驅(qū)動(dòng)模塊為了給電機(jī)添上驅(qū)動(dòng),我開始考慮到lm298,但其體積龐大,需要7v以上電源。但我發(fā)現(xiàn)了一款實(shí)用的nmos管st2302,航模經(jīng)典驅(qū)動(dòng)芯片,3.3v就可以驅(qū)動(dòng)。所以按照網(wǎng)上的電路圖給焊接起來(lái),發(fā)現(xiàn)確實(shí)管用。 3.6傳感器因?yàn)槭稚嫌屑す忸^和光敏電阻,所以選擇了激光頭打在光敏電阻上產(chǎn)生脈沖波,實(shí)現(xiàn)轉(zhuǎn)速測(cè)量。由邏輯器件產(chǎn)生電壓比較輸出脈沖波,由穩(wěn)壓二極管1n4733產(chǎn)生3.3v電壓,供單片機(jī)采集脈沖。 四軟件設(shè)計(jì)4.1pwm波生成 Pwm波由定時(shí)器2產(chǎn)生,初始化為1khz的spwm波,占空比設(shè)置為1/10.通過在程序中調(diào)節(jié)定時(shí)器相關(guān)寄存器值可以改變pwm波的占空比。
4.2lcd顯示 因?yàn)槭怯眠b控控制lcd1602的翻頁(yè)和相關(guān)參數(shù)的設(shè)置,所以我選擇每1.4slcd屏幕上字幕刷新一次。如果刷新時(shí)間太短,紅外遙控可能無(wú)法工作。當(dāng)刷新時(shí)間太快時(shí),字幕跳的太快會(huì)看不清字幕。
4.3脈沖捕獲 我采用的是stm8外部中斷源,當(dāng)pc1捕獲到上升沿時(shí),改為下降沿捕獲,連續(xù)一次上升沿和一次下降沿為一個(gè)周期,通過定時(shí)器4算出10個(gè)周期內(nèi)時(shí)間,這樣算10次,去掉最高值和最低值,即為平均值。
4.4pid算法 因?yàn)?font face="Times New Roman">pi,pk,pd均為float值,而系統(tǒng)時(shí)鐘只用16MHZ,用c語(yǔ)言編寫需要消耗上百條指令周期,所以我將pid算法放入定時(shí)器4運(yùn)算,每200ms運(yùn)算一次。
程序是我一個(gè)一個(gè)敲進(jìn)去的
#pragma vector=0x07 // 這里很關(guān)鍵!看下面說(shuō)明。
__interrupt void EXTI_PC1(void)
{
asm("sim");
switch(EXTI_CR1)
{
case 0x10:EXTI_CR1=0x20;exit_flag=1;break;
case 0x20:EXTI_CR1=0x10;exit_flag=2;break;
default :exit_flag=0;break;
}
if(exit_flag==2)
{
t++;
exit_flag=0;
if(t%10==0)
{
ulong chaju;
now_nus=TIM4_CNTR;
now_ms=cishu;
chaju_ms=now_ms-last_ms;
if(cishu_flag==1)
{
cishu_flag=0;
chaju_ms=30000+now_ms-last_ms;
}
chaju_nus=now_nus-last_nus;
chaju=chaju_ms*250+chaju_nus;
now_rads=(1250000/chaju);
last_nus=now_nus;
last_ms=now_ms;
last_rads[rads_flag++]=now_rads;
if(rads_flag==10)
rads_flag=0;
pid_error1=pid_error;
pid_error=set_rads-now_rads;
pid_dt2=pid_dt1;
pid_dt1=pid_error-pid_error1;
last_radsss=last_radss;
last_radss =now_rads;
}
}
asm("rim");
}
#pragma vector=TIM4_OVR_UIF_vector//0x19
__interrupt void TIM4_OVR_UIF_IRQHandler(void)//對(duì)應(yīng)IAP的中斷地址:0x8060
{
++cishu;
TIM4_SR=0x00;
if(cishu==29999)
{
cishu_flag=1;
cishu=0;
minute++;
ds1820_flag=0;
}
if(cishu%100==0)
pid_caculate();
}
//pid算法核心
void pid_caculate()
{
int ppk,ppi,ppd;
ppk=(int)((long)(((int)(pk*100))*(pid_error))/100);
ppi=(int)((long)(((int)(pi*100))*(pid_error-pid_error1))/100);
ppd=(int)((long)(((int)(pd*100))*(pid_dt1-pid_dt2))/100);
pid_out+=ppk-ppi+ppd;
if(pid_out>2000)pid_out=2000;
if(pid_out<800)pid_out=800;
TIM2_CCR1H =pid_out/256;
TIM2_CCR1L = pid_out%256;
}
|