單片機PID調(diào)速控制直流無刷電機附部分源碼
目前正在學習pid調(diào)速控制直流無刷電機,留下筆記。
具備知識,stm32基礎(chǔ),了解無刷直流電機原理,pid控制原理
工具:
無刷直流電機:12v電源驅(qū)動,50HZ,占空比為5%的pwm波2秒以上解鎖電調(diào),再將占空比改為6%,則電機正常運行,改變占空比到9%接近全速轉(zhuǎn)動。
。(在網(wǎng)上摸索了一上午此信息,因為沒有直接參考資料,標簽都沒有)
電調(diào):電調(diào)接收了pwm信號,根據(jù)信號控制電機的電壓,由此控制轉(zhuǎn)速。
12v電源:供電
stm32單片機:輸出pwm波
st-link調(diào)試模塊:調(diào)試用,主要調(diào)pwm波和pid參數(shù)
usb轉(zhuǎn)串口模塊:可獲取單片機打印的串口信息(可有可無)
霍爾測速傳感器:測轉(zhuǎn)速,5v供電,信號線為方波,捕獲單位時間方波個數(shù)可測轉(zhuǎn)速,由于其他條件一定,方波頻率與轉(zhuǎn)速為線性關(guān)系,可直接用頻率代替。
檢測設(shè)備:萬能表或者示波器,主要檢測pwm波和故障時候的電壓。
步驟:
1,stm32中配置pwm,延時函數(shù),外部中斷(捕捉信號用),系統(tǒng)rtc時鐘(用于較精確確定時間)等
2,電調(diào)接好電機和12v電源,電調(diào)信號接單片機,注意電調(diào)別用12v供電,所有設(shè)備共地,程序正常運行
3,若不轉(zhuǎn),則按以下方式調(diào)試,
1)用示波器或萬能表檢測單片機是否發(fā)出符合要求的pwm波。
2)檢測連線是否正確,
3)測電機電壓是否是12v左右。
4,若電機能轉(zhuǎn)動,則可以在電機上安裝霍爾傳感器,離里面的磁鐵大概1-2毫米,太遠了測不到信號,(這個問題又摸索了半天)。
5,用示波器測霍爾傳感器的信號,顯示為方波,記錄此時的頻率
6,將霍爾傳感器的信號線接到單片機的外部中斷引腳上,捕獲其頻率。
此時電機配置及測速基本完成。
PID參數(shù)整定
具體原理可自行百度。說說個人的理解,比如給出pwm占空比為6%,此時測出頻率穩(wěn)定在600,我想讓霍爾元件傳回來的頻率變?yōu)?000,當然是加大pwm的占空比,但是加大多少呢,其頻率與占空比又不是線性關(guān)系,不能一次解決,但可以用差值逐次逼近,如
誤差=設(shè)定速度(1000)-實際速度(600)
占空比=占空比+P*誤差(400);
。。。。。。。
如此循環(huán)下去,會發(fā)現(xiàn)速度在1000左右抖動,而且從600到接近1000的這段時間比較長。因此加入積分,將每次的誤差對時間積分,
如
Integral=Σ誤差
則占空比更正為
占空比=占空比+P*誤差+I*Σ誤差;
但是還是有一定的震蕩,當需要其平穩(wěn)時,還需要加入誤差的微分,阻止其超調(diào)的變化,有超前調(diào)節(jié)的作用。
則
占空比=占空比+P*誤差+I*Σ誤差+D*(本次誤差-上次誤差)
PID初步調(diào)試就到這里了,由于條件有限,我就沒有繼續(xù)整定PID的值。
err[0]=setv-v;//設(shè)定速度-當前速度 isum+=err[0]*0.2;//積分值 dd=err[0]-err[1];//微分 pwm=p*err[0]+i*isum+d*dd;//計算變化值 currentpwm+=pwm;//換算成占空比 currentpwm=currentpwm>=1800?1800:currentpwm;//極限速度限制,測得高速運行時占空比為1800/20000=9% err[1]=err[0];//保存本次誤差,下次使用新手上路,留下筆記,多多指教!交流qq313947881
電子發(fā)燒友App





評論