[提要] 從我構(gòu)思圓夢小車的第一天起,我就把實現(xiàn)小車速度PID控制作為目標(biāo)之一,前面雖做過多次嘗試,但均不滿意,故無意示人,此次總算是基本如愿了,在此與大家分享。
一、背景
從我構(gòu)思圓夢小車的第一天起,我就把實現(xiàn)小車速度PID控制作為目標(biāo)之一,也許是我出身于自動控制專業(yè)的情結(jié)吧。
在我寫的第一組關(guān)于智能小車的文章中(“尋跡小車 FollowMe”),就期望能實現(xiàn)小車 PID 調(diào)速,并且參照《電動機(jī)的單片機(jī)控制》一書寫了相應(yīng)的測速和控制程序,但不幸的是,沒有實現(xiàn) ,當(dāng)初以為是測速的分辨率過低(只有10個脈沖/輪子轉(zhuǎn)一圈)。
后來將小車升級,用開模具方式大大提高了測速的精度,推出了圓夢小車第一代。測速精度達(dá)到了每轉(zhuǎn) 50個脈沖(如果用前后沿檢測,可以達(dá)到100個脈沖),但略作嘗試后還是沒有實現(xiàn),似乎沒有找到問題的根源。
準(zhǔn)確的說應(yīng)該是我沒有掌握PID控制程序,我雖是學(xué)習(xí)自動控制出身,但畢業(yè)后從未實際應(yīng)用過PID控制,所有知識局限于當(dāng)初學(xué)校的實驗,這也是我一直想在小車上實現(xiàn)PID的動機(jī)之一:一個學(xué)自控的居然沒有在現(xiàn)實中運用PID的能力,汗顏啊!
因為無力而為,所以在“圓夢小車StepByStep”系列文章中,就跳過了這一段內(nèi)容。但心未死,想借助小車客戶中的高手之力完成之,為我打破這個僵局,可小車倒是送出去幾套,PID調(diào)速還是杳無音訊,無語!
隨著小車進(jìn)化至第三代(輪式驅(qū)動單元)、第四代(FIRA小車),將PID調(diào)速的夢想實現(xiàn)的愿望越加強(qiáng)烈!為此,還找了朋友介紹個熟人幫忙,本來信心滿滿,因為朋友說這個人參加了 Freescale 智能車大賽,其中就用到了PID調(diào)速。為此我又送出了一套第四代圓夢小車,更令我失望,連回音都沒有,郁悶!
這一切迫使我自己去嘗試!看來這種沒有多少經(jīng)濟(jì)利益的事少有人問津,但愿是這個原因,而不是由于無能。
轉(zhuǎn)機(jī)緣于一個買了“輪式驅(qū)動單元”的客戶(現(xiàn)在是朋友了),他告訴我,參考 Arduino 所提供的 PID 庫函數(shù)實現(xiàn)了“輪式驅(qū)動單元”的調(diào)速,而且效果不錯。(Arduino 是一個基于AVR單片機(jī)的開源平臺,經(jīng)過幾年發(fā)展,目前資源十分豐富)
我急切的下載了 Arduino 的PID 庫函數(shù) ,發(fā)現(xiàn)很有價值,就著手嘗試了,以下便是實施的過程。
二、PID庫函數(shù)的消化和移植 (由于排版麻煩,略,有興趣可下載 PDF 文檔) 三、嵌入程序前的準(zhǔn)備 …… 因為PID控制的基礎(chǔ)是以周期T測量,計算出偏差后修正輸出。而測量周期不能太長,那樣響應(yīng)將滯后;但過短也沒有意義,因為對象的慣性特征,導(dǎo)致極小的時間間隔中不會有變化。
根據(jù)小車電機(jī)的驅(qū)動特性,100ms左右的周期比較合適。
但小車的測速碼盤是直接設(shè)計在輪轂上的,雖說每轉(zhuǎn)有100個脈沖(輪式驅(qū)動單元),但相對于那些設(shè)計在電機(jī)輸出軸上的高級編碼器而言,分辨率遠(yuǎn)遠(yuǎn)不夠。按 目前小車的減速箱設(shè)計,對于1:48減速箱,最快時100ms 約34個脈沖,而1:120減速箱才不到14個脈沖,如果調(diào)速范圍設(shè)置為50% 到 100% ,則脈沖數(shù)更少,分辨率無法滿足控制的要求,如果再降低周期,則更無法得到可靠的控制反饋了。
為此,首先得解決測速的分辨率問題,因為控制速度屬于運轉(zhuǎn)穩(wěn)態(tài)時的任務(wù),在起、停過程通常不需要。而正常運轉(zhuǎn)時,相鄰2個脈沖的周期不會變化很大,故可以 據(jù)此利用前一周期的數(shù)值作為倍頻的依據(jù),詳細(xì)算法此處不再贅述,有興趣者可以到我在GoogleCode上設(shè)立的開源項目:http://code.google.com/p/fira-mirosot-robot/ 中下載:
http://code.google.com/p/fira-mirosot-robot/downloads/detail?name=Introduction%20B%20-%20Hardware%20of%20the%20Smart%20Car.pdf&can=2&q=
其原理示意如下圖:
四、將PID計算嵌入程序 …… 五、PID參數(shù)整定前的準(zhǔn)備 從搜集的PID參數(shù)整定方法的資料看,多數(shù)需要能記錄速度變化的趨勢,也就是所謂的“對象動態(tài)特性”測量,或者說是“沖擊響應(yīng)”測量。
既然小車內(nèi)部已經(jīng)實現(xiàn)了數(shù)字化的速度檢測,且有通訊接口,為何不將速度送到PC機(jī)上,利用PC機(jī)顯示速度變化曲線,從而得到整定參數(shù)的依據(jù)。
可我PC機(jī)上的圖形編程能力太菜,虧得有個好友幫忙,為我寫了一個圖形顯示程序,使速度顯示成為現(xiàn)實。(由衷表示感謝!)
為了配合這個功能,在小車控制程序中增加了速度輸出,每次測量(20ms)都將速度結(jié)果送出,PC機(jī)根據(jù)這些速度數(shù)據(jù)繪出速度隨時間的變化曲線:
六、參數(shù)整定過程 輪式驅(qū)動單元第二版驅(qū)動很方便,用串口可以容易的控制,為了簡化操作,是空載方式測試的,我用無線方式試驗過,有載(裝在小車上)效果更好。下圖為空載調(diào)試方式:
從各類參數(shù)整定方式中,我感覺那個“齊格勒—尼克爾斯經(jīng)驗法”比較容易實施,就按那個進(jìn)行了參數(shù)調(diào)整,先關(guān)閉積分和微分作用,只保留P,在電機(jī)可以工作的 下限速度進(jìn)行整定(因為我試過,如果在偏高的速度整定,則在低速工作時會振蕩,還無能力解釋),逐漸加大P使速度發(fā)生振蕩,如下圖:
此時得到臨界比例系數(shù)Pd,從圖上得到振蕩周期T ,根據(jù)“齊格勒—尼克爾斯經(jīng)驗法”:
Kp Ki Kd
P 控制: 0.5Pd
PI控制: 0.45Pd 0.83T
PID控制: 0.6Pd 0.5T 0.125T 計算出PID系數(shù),Pd = 22 ,T = 300ms ,按PID控制計算,得到:
Kp = 1.3, Ki = 0.15秒 Kd = 0.03秒 設(shè)置到程序中后,基本可以了,只是微分系數(shù)需要略作調(diào)整(降低到0.02秒,否則有些振蕩),設(shè)置后的速度曲線為:
七、結(jié)語
當(dāng)時得到這個結(jié)果時,我倍感很神奇!
因為早期的一件事讓我對PID系數(shù)的配比感到神秘莫測:曾經(jīng)按照老外的示例做了個LEGO的兩輪平衡車,他也是用的PID控制,區(qū)區(qū)幾行程序,小車就站起來了。可是我將他的三個系數(shù)隨便一改,哪怕是略作調(diào)整,小車就趴下了,很是靈驗。
那時我就對PID系數(shù)的整定心存敬畏,同時也一直想嘗試?yán)贸绦蚴蛊渥兊貌荒敲瓷衩亍?br />
這次嘗試總算了結(jié)了我的心愿,爽!
借助這個工具,應(yīng)該可以解決許多需要PID控制的問題,如兩輪平衡、差分驅(qū)動小車走直線等,只要程序中能測出偏差;而這是必須的,否則PID控制也無從談起。
但愿此嘗試能起到拋磚引玉作用,使我們的愛好者們、多數(shù)大學(xué)生們所做的小車也能像那個外國人做的繞著茶杯轉(zhuǎn)的小車那樣流暢:
而不是只有參加FreeScale智能車大賽的同學(xué)才能做到。
————————————————
南京嵌入之夢工作室
2011年4月23日星期六 用 CamStudio 錄制的 PID 調(diào)速動態(tài)過程: 使用 1:120 減速箱:
|