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