李全民 賈林鋒
(廣州理工學院,廣東 廣州 510540)
智能汽車是未來汽車的發展方向,在減少交通事故、發展自動化技術、提高舒適性等許多方面發揮很重要的作用[1],而電磁導航技術相對于其他技術有穩定性強、成本低且原理簡單等特點。電磁導航是指在道路中線鋪設有漆包線并通有20kHz、100mA交變電流,因而在導線周圍產生磁場,智能小車上的電感傳感器在磁場中產生感應電動勢,靠檢測電動勢值來確定小車在道路上相對位置。算法和編程是智能汽車控制核心,決定了小車的行駛速度和方向。本文在信號歸一化處理、差比和算法、速度控制等方面對傳統控制方法進行改進,使智能小車控制更加線性化,小車的運行狀態也更穩定和高速,從而優化了控制策略,并且實現了C 語言編程。最后完成的智能小車實現了自動起跑與停車、上下坡、沿道路自動行駛及轉向等多種功能。
控制算法建立在硬件基礎之上,一般智能小車硬件包括機械系統、含有最小系統的主板、電源模塊、電機控制模塊、信號檢測與處理模塊等部分。在信號檢測和處理部分,本文采用兩個10MH工字電感作為傳感器,電感采用對稱于小車中線的水平放置[2],且其軸線與漆包線垂直,離地高度15cm,距離中線12cm;采集的感應電動勢經過LC選頻和OPA2350運算放大后傳給單片機AD接口;單片機采用由恩智浦公司生產的S9KEAZ128AMLK,它具有32 位MCU 內核、48MHz的CPU 頻率、12 位16 通道的模數轉換(ADC)及一個脈寬調制(PWM)定時器[3],由輸出的PWM信號控制電機轉速,進而控制智能小車的方向和速度。
經過單片機模數轉換后,兩個水平電感產生的感應電動勢模擬信號分別轉換成數字信號進行編程計算。為了防止干擾,首先采用軟件均值濾波進行第一步的信號處理,對每個電感產生的感應電動勢連續采集10次并求平均值作為當前控制周期的傳感器信號;其次通過歸一化算法處理兩電感產生的電動勢值,使其數字信號在一定范圍內變化,如0~200;再次,對歸一化處理后數值進行差比和計算,得到小車相對于道路中線的相對位置和偏差距離;最后將偏差輸入PID控制器,得到當前控制周期的輸出。方向控制通常利用單片機的定時器接口,輸出PWM 信號對電機轉速進行控制(本文研究的是三輪小車,通過兩后輪的轉速差來控制行駛方向)。
在速度控制方面,首先通過編碼器采集目前速度信號,并輸入單片機后轉化為脈沖計數;然后判斷直道還是彎道,前者高速后者低速;最后,將設定速度輸入PID控制器,得到當前控制周期的速度輸出,通過PWM 信號對電機進行速度控制。
控制流程如圖1 所示,其中,中斷子程序每1ms 執行一次,方向每2.5ms 控制一次,速度控制是每10ms 控制一次,速度控制的時間相對長一點,主要為了降低對方向控制的影響。因為對于三輪車來說,前輪是沒有動力的隨動輪,不論是方向控制還是速度控制,都是通過改變兩后輪轉速來實現的。

圖1 程序控制流程圖
歸一化算法的目的是為了解決電感因加工質量不同帶來的誤差,將電感傳感器輸出的感應電動勢的絕對值(因為C 語言定義時數據類型為無符號型,故這里只討論絕對值)轉換成相對值,以便于同時處理多個電動勢數據。傳統的歸一化算法如公式1所示。

其中a表示電感歸一后的值;b表示每次平均濾波后得到的值;c是轉換系數,取決于設定的電動勢參數范圍,本文參數范圍設在0~200,故c取200;公式中的Max和Min是單個電感在工作環境下采集到的最大電動勢值和最小電動勢值。歸一化算法只能對單個電感進行計算,每個電感的Max和Min都不同,這取決于運算放大電路的增益倍數和電感的加工質量。一般在使用歸一化算法前,都需要預先采集每個電感輸出電動勢的最大值和最小值。在實際的操作中,往往需要人工移動電感遠離和靠近漆包線來取值,不僅操作繁瑣,而且預先采集時電感高度與小車行駛時的實際高度也有誤差。
對傳統歸一化算法進行分析可以發現,預先采集的最大最小值是感應電動勢在當前磁場環境的變化區間,而每一次采集到的值都與最小值相減并與區間長度相除。上述的處理方法實質上是將電動勢實際變化值轉換成相對于最小值的一個變化率,利用了變化率來解決電感加工質量帶來的誤差。
現假設小車先直線行駛然后轉彎,小車每次轉向產生的電動勢變化值都是根據偏離中線的距離得來的,因而電動勢的變化值則反映了小車偏離中線的距離。因此可以把小車處于直道中心位置時的電動勢值作為中值,行駛后采集到的值與中值相減并算出相對誤差,將原先相對于最小值的變化率轉換成了相對于中值的變化率,歸一化算法如下:

其中△d表示單個電感產生的電動勢相對于中值的變化率;Z是歸一化前采集到的小車位于跑道中間的電感中值;b是每次采集后平均濾波的電感值;c是轉換系數,表示偏差變化的范圍。在實際操作時只需要將小車放在跑道中間就能上電自動采集,用單次采集代替多次采集,操作上簡單了好多,也較好解決了高度誤差帶來的采集精度問題。
由于小車的左右轉向,電動勢值會在中值左右變化,因此△d值也會出現負值,可以在歸一后加上一個起點變化系數來避免負值,便于直接用于計算。C 語言代碼實現如圖2所示,110是電感的起點變化系數,通過限幅使感應電動勢的變化率在0~200范圍內。

圖2 改進歸一化C語言代碼實現
單個電感輸出的電動勢變化可以反映小車偏離中線的距離變化,但不能判斷偏離中線的左右方向。因此在循跡中至少需要分別位于小車中線左右側的兩個電感,利用兩個感應電動勢的差值來判斷方向。在實際布置時,為了對道路進行提前預測,電感一般靠支架布置在距小車頭部前沿還有一段距離的前部。因此當小車轉彎時,有可能兩個電感都位于道路外面,兩個電感的感應電動勢都同時變小,其絕對誤差也變得更小,不能達到驅動小車轉向的要求,所以引進了差比和的概念,其算法如下:

其中e表示計算后的相對誤差;L和R分別表示左右電感歸一后的電動勢值;c是系數,決定相對誤差的變化范圍。實際上即使這樣處理,當轉彎的角度很大時e還是很小,不能滿足大轉向要求,這時就需要丟線處理(又稱“鎖差值”),給小車一恒定的大偏差轉向(舵機打死)。
這種處理方法比較簡單,但存在兩個問題:一是控制不線性,在丟線之前,輸入和輸出通過差比和控制,但丟線后,輸出達到最大,輸入不對這個控制系統有任何影響,所以小車會出現出彎抖動、入彎反應慢等現象;二是當小車直線行駛但稍微偏離中線時,絕對誤差有可能比相對誤差還要大,這時就應用絕對誤差而不是相對誤差。
為了解決使用單一差比和及丟線處理存在的問題,本文進行了兩個改進:一是使公式(3)中的系數c取值在L與R最大和的范圍內,當兩電感絕對誤差的值大于其差比和時采用絕對誤差作為小車的偏差;當兩電感絕對誤差的值小于其差比和時采用差比和作為小車的偏差,這樣就解決了單一使用差比和問題。二是把絕對誤差轉入差比和時的絕對誤差值保存起來,該值作為后續差比和公式中的分子并保持不變,每次循環只改變分母值(即兩電動勢和值),使兩電感在入彎時的差比和值不斷增大,滿足轉彎需要;當出彎時兩電感向中線靠近,其電動勢值變大,作為兩者之和的分母也變大,差比和值減小,達到判斷條件后再由差比和轉入絕對誤差,這樣就解決了入彎和出彎時控制不線性問題。把改進后算法與和PID 控制器的結合,小車入彎、彎內和出彎姿態都得到了良好的調整。
改進后算法的C 語言代碼實現如圖3 所示,其中為了避免分母為零的情況出現,當兩電動勢值之和很小時,分母自動加1。

圖3 改進差比和算法的C語言實現
速度控制重點在彎道,本文采用直道高速、入彎減速、出彎加速的控制策略,并預先設置直道、入彎和彎道內三種不同速度,作為小車不同姿態下速度PID控制器的期望值。由于單靠編碼器無法判斷三種速度的轉換時機,所以另外引入D_1 和D_2 兩個變量:D_1 是當前兩電感電動勢差值減去上次相應的差值,D_2是D_1的累加并對其限幅。由差值變化規律可知,直道時由于方向PID 控制器的調整,偏差波動范圍小,D_1和D_2均較小;入彎時差值不斷增大,D_1為正數,D_2系數不斷增大至限幅值;在彎道內D_2系數由于入彎前的差值累加,數值較大,但D_1 在彎道內的偏差變化不大數值較小;小車出彎時,差值不斷減小,D_2系數值降低。上述控制策略結合了方向的偏差變化,對小車整體的速度有極大的提高,C語言程序實現如圖4所示,程序中的參數影響速度轉換的靈敏度,可由實際測試得到。

圖4 速度控制策略C語言實現
在速度控制策略基礎上,本文還采用了增量式PID+Bang-Bang 控制,C 語言實現如圖5 所示。其中KOUPLUSMAX是設定的最大占空比,PSpeedCut是當前檢測到的速度,ASPeed1是期望速度,程序里Bang-Bang控制區間為“-3”和“+1”,可由實際測試得到。當前速度遠小于期望速度時,給最大占空比;當前速度超調一段距離時,給最小占空比;在這個區間內則使用增量式PID。這樣可以使小車速度反應更靈敏,勻速性能更好。

圖5 增量式PID+Bang-Bang控制C語言實現
本文涉及的歸一化算法、差比和算法、速度控制及Bang-Bang控制都是電磁智能小車控制的基礎,結合PID控制器的原理,將計算后的偏差作為控制器的輸入使得小車控制系統得到較大的改善。對于單根漆包線鋪設的磁場環境,該算法的魯棒性好、計算簡便。對于多跟漆包線組成的跑道,如圓環等,可以增加多個電感輔助上述算法的路徑判斷。
最后在包括直道、彎道、十字交叉、環島、坡道和顛簸等元素的道路上實地測試表明,改進后智能小車的速度提高了20%,并且在入彎、彎內和出彎都顯示出良好的穩定姿態,說明該算法能大大提高智能小車的速度和穩定性,可操作性強。