Arduino是很火的開源硬件平台之一,今天利用Arduino結合PID控制算法來實現位置跟隨運動。
實驗初步硬件平台如下:

位置檢測元件使用的是一個夏普紅外傳感器,其技術規格如下所示
- 信號類型:模擬輸出
- 探測距離:4-30cm
- 工作電壓:4.5~5.5V
- 標准電流:33mA
- 接口類型:PH2.0-3P
- 最大尺寸:40x20x13.5 mm
由於位置傳感器輸出的是模擬量,需要在通過Arduino接收后再轉化為數字量,使用的Arduino UNO如下圖所示,

傳感器的輸出量的參考轉換代碼如下
void loop () { uint16_t value = analogRead (pin); if (value < 16) value = 16; distance= 2076.0 / (value - 11.0);}
其中pin為模擬量輸入引腳號(A0-A5),distance為轉換成的數字量。
PID算法
作為一名電子從業者,應該都對PID算法不陌生,作為改變世界的十大算法之一,也許只有你自己接觸后,才會有更深的體會。筆者認為,PID算法能夠使閉環控制系統能夠更快更好的實現我們的預期功能,先介紹下我們的算法原型:

上面所示的是PID控制原理框圖,我們需要將其在程序中離散化

這樣看似高深的東西可以簡化為每次采樣完成后的計算輸出,我們計划采用u作為控制器的控制量,控制電機的轉動,電機的輸出速度與輸入電壓成正比例關系,擬采用電機轉動的位置來模擬最終的調節量,如果傳感器檢測到目標位置,電機將停止轉動。
基於Arduino的PID測距控制(二)
在上期的blogger中,筆者講述了如何使用Arduino和夏普紅外傳感器來檢測距離。並就PID的基本理論進行闡述。在本期blogger中,筆者將以電機的控制電壓量變化演示如何實現PID反饋閉環控制。
下圖是控制原理框圖

由於不知道控制對象具體的理論傳遞函數,我們在進行PID參數的選取時進行了若干次的嘗試,直到相對滿意時為止。
如何定義一個ms采樣周期?
Arduino的millis()函數能夠獲取arduino從開始運行到現在的程序之后的毫秒數,返回值為unsignd long型。通過設置一個timechang=now-lasttime,閾值設為100時,即表示100ms的時間間隔。
定義采樣周期計算Arduino的輸出值
那么如何將PID計算輸出呢?
up=Kp*error;
ud=Kd*(error-error_1)/Ts;
ui=ui_1+Ki*error*Ts;
輸出u=up+ud+ui,Ts表示采樣周期,error為當前檢測到距離距離目標位移的差值,而error_1為上一次采樣的差值,這樣既可以將上期bloggger中的離散控制算法轉換為C語言。
監控Arduino的控制量
通過Serial.print (),通過Arduino的Serial Monitor顯示出來。

