商 林 鐘 雷
(武漢交通職業(yè)學(xué)院,湖北 武漢 430065)
在2018 年全國(guó)電子設(shè)計(jì)競(jìng)賽備賽過(guò)程中,教練組選擇了2015 年全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽高職組控制類題——風(fēng)板控制裝置為控制類訓(xùn)練題,目的在于讓參賽選手了解控制類題目的特點(diǎn),訓(xùn)練隊(duì)員如何使用定時(shí)器、PWM、液晶顯示模塊,如何對(duì)PID 算法中的參數(shù)進(jìn)行整定等。參賽隊(duì)員查找相關(guān)資料,其內(nèi)容多為如何用PID 算法去控制風(fēng)板的系統(tǒng)設(shè)計(jì)方案,包括PID 原理、硬件的選擇、算法的流程等[1-3],但很難找到介紹控制風(fēng)板穩(wěn)定的方法。在訓(xùn)練過(guò)程中,系統(tǒng)設(shè)計(jì)方案、PID基本算法參賽隊(duì)員都能理解,但在實(shí)際調(diào)試過(guò)程中主要問(wèn)題表現(xiàn)在:(1)PID 的三個(gè)參數(shù)整定困難,調(diào)試時(shí)效果不好,花了大量時(shí)間,達(dá)不到預(yù)期目的;(2)干擾過(guò)大,不能滿足控制角度誤差不大于5 度的要求。為了解決上述問(wèn)題,教練組使用了歸一參數(shù)整定法來(lái)選擇PID 的參數(shù),使用防脈沖干擾平均濾波法來(lái)消除噪聲干擾,從而達(dá)到控制角度誤差不大于5 度的要求。文中選擇風(fēng)板保持90度角為實(shí)驗(yàn)任務(wù),要求正負(fù)誤差不超過(guò)5度,自制系統(tǒng)如圖1 所示。系統(tǒng)包括STC15W 單片機(jī)、數(shù)字電位器、按鍵、L298N 電機(jī)控制器、2 個(gè)風(fēng)機(jī)、12864LCD 屏、UART_Oscilloscope 等,系統(tǒng)結(jié)構(gòu)如圖2 所示[4]。該系統(tǒng)首先通過(guò)數(shù)字電位器采集風(fēng)板當(dāng)前的角度,STC15W 單片機(jī)采集供電電壓,經(jīng)過(guò)濾波消除干擾,再通過(guò)PID 算法去調(diào)整風(fēng)機(jī)的轉(zhuǎn)速,從而控制風(fēng)板保持在設(shè)定的角度。
圖1 自制風(fēng)板模型
圖2 系統(tǒng)框圖
對(duì)于風(fēng)板穩(wěn)定運(yùn)行的條件,文獻(xiàn)介紹甚少,教練組從研究風(fēng)板穩(wěn)定運(yùn)行的影響因素、PID 算法的改進(jìn)、軟件濾波等方面著手,最后實(shí)現(xiàn)了風(fēng)板穩(wěn)定停留在設(shè)定的角度,誤差控制在要求范圍內(nèi)。
根據(jù)香農(nóng)采樣定理,系統(tǒng)采樣頻率的下限為fs=2fmax,此時(shí)系統(tǒng)可真實(shí)地恢復(fù)到原來(lái)的連續(xù)信號(hào)。從風(fēng)板控制系統(tǒng)的隨動(dòng)和風(fēng)機(jī)抗干擾的性能來(lái)看,風(fēng)板系統(tǒng)要求采樣周期短些,訓(xùn)練中,隊(duì)員使用UART_Oscilloscope 軟件測(cè)量角度傳感器波動(dòng)的頻率,軟件顯示角度傳感器波動(dòng)頻率為10HZ左右,根據(jù)香農(nóng)采樣定理,可以選擇50ms 的定時(shí)器T0為基準(zhǔn)采樣定時(shí)器。
采樣周期也不能過(guò)短,過(guò)短的采樣周期導(dǎo)致風(fēng)機(jī)的轉(zhuǎn)速由于采樣干擾導(dǎo)致的誤差使風(fēng)機(jī)轉(zhuǎn)速頻繁調(diào)節(jié)變動(dòng),也不利于系統(tǒng)的穩(wěn)定。
對(duì)于角度的測(cè)量,角度傳感器選用了數(shù)字電位器,最大電壓為5V,通過(guò)測(cè)量角度和實(shí)際電壓之間的關(guān)系,經(jīng)過(guò)大量數(shù)據(jù)驗(yàn)證,角度和電壓的關(guān)系為:angle=-85.51*AD_data+309.9,其中angle為風(fēng)板的角度,AD_data 為當(dāng)前角度時(shí)數(shù)字電位器A/D值。
對(duì)于風(fēng)機(jī)的控制,為了便于控制風(fēng)板,如果風(fēng)板角度小于90 度,選擇右邊風(fēng)機(jī)為定速,它的PWM 值為100 到150 之間;如果風(fēng)板角度大于90度,選擇左邊風(fēng)機(jī)為定速,PWM 值為100 到150 之間。這是控制風(fēng)板穩(wěn)定方法之一,該方法避免了兩個(gè)風(fēng)機(jī)一起調(diào)速,有利于風(fēng)板的穩(wěn)定。
由于供電電壓不穩(wěn)定,即數(shù)字電位器的參考電壓發(fā)生了改變,A/D采樣后的AD_data值雖然準(zhǔn)確,但通過(guò)公式angle=-85.51*AD_data+309.9 轉(zhuǎn)換后,并不是真實(shí)的角度。供電電壓增大,換算出的angle也增大;供電電壓減小,換算出的angle也減小。為了解決電源電壓不穩(wěn)帶來(lái)的測(cè)量誤差,訓(xùn)練時(shí)另外開(kāi)了一個(gè)通道,采集數(shù)字電位器供電電壓,即通道5 采集數(shù)字電位器電源電壓A/D 值,通道7 采集數(shù)字電位器輸出A/D 值。關(guān)鍵代碼如下所示:
AD_temp1=ADC_Read(5);
AD_temp2 = ADC_Read(7)。根據(jù)STC15W單片機(jī)I/O 口的A/D 采集原理,可計(jì)算出AD_data=AD_temp2*2.5/AD_temp1,通過(guò)采集數(shù)字電位器電源電壓A/D 值,并為分母,作為參考電壓,理論上消除了電源電壓不穩(wěn)導(dǎo)致?lián)Q算出的角度誤差,經(jīng)過(guò)換算角度為:angle=-85.51*AD_data+309.9,并放在get_AD()采集函數(shù)中。該方法克服了過(guò)去由于數(shù)字電位器的電壓不穩(wěn)定導(dǎo)致的測(cè)量誤差,是控制風(fēng)板穩(wěn)定方法之二。
文中省去了PID 的結(jié)構(gòu)體、PID 的初始化、A/D 采集等定義,歸一參數(shù)整定法——自校正PID控制器算法如圖3所示。
圖3 歸一參數(shù)整定法
int pwm;
float PID_realize(float speed)
{
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;/
/歸一參數(shù)整定法——自校正PID 控制器
pid.incrementSpeed=pid.Kp* (2.45*pid.err +3.5*pid.err_next+1.25*pid.err_last);
pid.ActualSpeed+=pid.incrementSpeed;
pid.err_last=pid.err_next;
pid.err_next=pid.err;
returnpid.ActualSpeed;
}
由圖3 可知,只需確定一個(gè)參數(shù)pid.Kp 就能計(jì)算出增量PID 算法的增量值,減少了調(diào)試工作量。實(shí)際效果如圖4 所示,設(shè)定值為200,pid.Kp=0.095,經(jīng)過(guò)20 次的運(yùn)算,能收斂到200.436386,誤差為0.2181%。其他參數(shù)不變,調(diào)整pid.Kp 值能控制收斂速度和誤差,達(dá)到任務(wù)要求的精度[5-6]。
圖4 歸一參數(shù)整定法仿真結(jié)果
在數(shù)據(jù)采集中存在著多種干擾,濾除干擾的方法有很多,既有軟件濾波器,也有模擬濾波器。針對(duì)采集數(shù)字電位器輸出電壓過(guò)程中出現(xiàn)的隨機(jī)干擾,采用了防脈沖干擾平均濾波法消除干擾,對(duì)于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣偏差。該濾波方法是連續(xù)采樣N個(gè)數(shù)據(jù),去掉一個(gè)最大值和一個(gè)最小值,然后計(jì)算N-2個(gè)數(shù)據(jù)的算術(shù)平均值。雖然防脈沖干擾平均濾波法把N 次采樣值按大小排列,要消耗單片機(jī)的內(nèi)存,排序時(shí)也比較費(fèi)時(shí),但訓(xùn)練時(shí),隊(duì)員選擇的是STC15W 系列單片機(jī),它有24MHZ 的晶振,24K 的SRAM。使用中N 值為7,對(duì)N 次采樣值排序時(shí),使用插入排序算法,它的空間復(fù)雜度為O(1),算法穩(wěn)定,最壞情況O(n2)的時(shí)間復(fù)雜度,可以通過(guò)修改N 的值來(lái)改變算法的復(fù)雜度,STC15W 系列單片機(jī)能滿足該算法的要求[6-7]。算法關(guān)鍵代碼如下:
#define N 7
void InsertionSort(int A[],int n);//插入排序
int filter(int value_buf[N],N)
{ int count,sum;
InsertionSort(value_buf[N],N);
for(count=1;count<N-1;count++)
sum+=value[count];
//濾波結(jié)果發(fā)串口1,使用UART_Oscilloscope軟件看波形
SendUART1((int)sum/(N-2));
return(int)(sum/(N-2));
}
filter 函數(shù)的返回值,即是防脈沖干擾平均濾波法得到的數(shù)字電位器當(dāng)前角度的采樣值,是控制風(fēng)板穩(wěn)定方法之三。
主函數(shù)中使用了50ms 的定時(shí)器,即每隔50ms 采集一次數(shù)字電位器角度,采集N 次做一次濾波,濾波的結(jié)果做PID 運(yùn)算,得到新的增量,再通過(guò)計(jì)算出新的PID 增量去調(diào)節(jié)PWM 的參數(shù),改變電機(jī)的轉(zhuǎn)速,達(dá)到角度穩(wěn)定在設(shè)定的角度,并保證5 度的誤差,本訓(xùn)練選擇風(fēng)板穩(wěn)定在90 度[8-9]。關(guān)鍵代碼如下所示,流程圖如圖5所示。
圖5 PID運(yùn)行流程
#define N 7
int PWM=0;
int num1=0,flag=0,filter_AD;
int value_AD[N];//存放采集的值
int filter(intvalue_buf[N],N);
void PWM_SET(int pwmvalue_left,int pwmvalue_right);//風(fēng)機(jī)轉(zhuǎn)速調(diào)節(jié)
float PID_realize(float speed);//歸一參數(shù)整定法PID
main()
{ ……省略代碼(包含PID的初始化等)
while(1)
{
if(flag==1)
{
filter_AD=filter(value_AD,N);
pid.ActualSpeed = filter_AD;//角度采集濾波后真實(shí)值
PWM_SET(PID_realize(90),120);
flag=0;
}
……
}}
void T0()interrupt 1 //定 時(shí) 器T0,每 隔50ms采集一次角度
{ ……省略代碼
value_AD[num1]= get_AD();//采集當(dāng)前電壓
num1++;
if(num1==N)
{
num1=0;
flag=1;
}
}
測(cè)試過(guò)程中,采集角度時(shí),使用了防脈沖干擾平均濾波法,消除了干擾,保證了采集角度的穩(wěn)定,經(jīng)過(guò)濾波后,使用了參數(shù)整定法計(jì)算了PID 算法的增量,最后去做PWM調(diào)速。
隊(duì)員用手轉(zhuǎn)動(dòng)風(fēng)板,放在90 度,再找一硬物支撐固定住風(fēng)板,減少用手扶住風(fēng)板時(shí)人為晃動(dòng)引起的干擾,觀察液晶屏上顯示的角度值,是90度左右,在誤差范圍內(nèi)。打開(kāi)UART_Oscilloscope軟件,用USB 轉(zhuǎn)換線連接PC 與開(kāi)發(fā)板,設(shè)置UART_Oscilloscope 為串口1 獲取數(shù)據(jù),可以看到UART_Oscilloscope 軟件中的波形平滑度非常高,幾乎是條平直的直線。移走硬物,用手移動(dòng)風(fēng)板,移動(dòng)瞬間,UART_Oscilloscope 中的波形跟隨變化,不動(dòng)風(fēng)板,幾乎又是平直的直線,波形看不到過(guò)沖和毛刺。用UART_Oscilloscope 軟件來(lái)測(cè)試顯示采樣的值是不是有干擾,使用軟件濾波能不能抗干擾,效果很直觀。
設(shè)定風(fēng)板的控制角為90 度,風(fēng)板停靠在左邊,啟動(dòng)程序后,左邊風(fēng)機(jī)全速旋轉(zhuǎn),風(fēng)板被吹起,往右快速移動(dòng),隨著風(fēng)板右移,左邊風(fēng)機(jī)的轉(zhuǎn)速變慢,風(fēng)板慢慢靠近90 度角,并有輕微的擺動(dòng),但滿足5 度偏差的要求。用手掌輕輕接近離右邊風(fēng)機(jī)進(jìn)風(fēng)口3 到5 厘米的位置,可以看到風(fēng)板右移,但左邊風(fēng)機(jī)迅速減慢了轉(zhuǎn)速,風(fēng)板又回到90度左右。
文中采用了防脈沖干擾平均濾波法濾除了采樣時(shí)的干擾,并用UART_Oscilloscope 軟件觀察到采樣濾波后的波形,把濾波后的數(shù)據(jù)送到歸一參數(shù)整定法PID 算法中修改pid.ActualSpeed 值,并設(shè)定風(fēng)板的角度為90 度,觀察結(jié)果滿足角度誤差的要求,達(dá)到了訓(xùn)練目的。PID 調(diào)節(jié)器參數(shù)整定方法有多種,常見(jiàn)的有:(1)理論計(jì)算整定法。它主要是依據(jù)系統(tǒng)的數(shù)學(xué)模型,經(jīng)過(guò)理論計(jì)算確定控制器參數(shù);(2)工程整定方法。它主要依賴工程經(jīng)驗(yàn),直接在控制系統(tǒng)的試驗(yàn)中進(jìn)行,在工程實(shí)際中被常常采用,它要求使用者有豐富的工程經(jīng)驗(yàn),并要做大量的工程測(cè)試;(3)文中使用的是歸一參數(shù)整定法,根據(jù)經(jīng)驗(yàn)數(shù)據(jù),對(duì)多變量、相互耦合較強(qiáng)的系數(shù),人為地設(shè)定“約束條件”,以減少變量的個(gè)數(shù),達(dá)到減少整定參數(shù)數(shù)目,簡(jiǎn)易、快速調(diào)節(jié)參數(shù)的目的。對(duì)比上述三種方式,歸一參數(shù)整定法有簡(jiǎn)單、快速的優(yōu)勢(shì)。