基于Arduino與LabVIEW的直流電機轉速控制系統
直流電機是Arduino機器人制作中的主要動力來源,但是由于電機的參數一致性有所差別,即使是相同型號的電機在相同電壓下的轉速都不完全相同,而且在帶負載或負載不同的情況下,更加會導致電機轉速發生變化,這就會導致制作的Arduino輪式機器人不能實現直線行走,因為這是一個開環控制,沒有任何反饋信號返回。如果給直流電機加上編碼器作為反饋器件,也就可以測量得到電機的當前轉速,如果將其與設定值計算差值,并通過PID算法計算得到新的控制信號,從而可以動態的測量和控制電機的轉速,形成一個閉環控制系統。
本文引用地址:http://cqxgywz.com/article/201701/337030.htm下面我們利用帶有編碼器的直流電機、Arduino控制器、直流電機驅動板和LabVIEW上位機軟件以實驗探索的形式來設計一個直流電機轉速比例控制實驗。
1.TimerOne定時器庫
1.1下載及使用方法
TimerOne定時器庫使用AVR單片機內部的定時器1實現定時中斷的功能,其下載地址為:https://code.google.com/p/arduino-timerone/,只需要更改幾個參數即可使用定時器中斷來實現周期性執行的任務。需要注意的是,如果使用了TimerOne定時器庫,也就不能在相應的引腳輸出PWM電壓,Uno上的定時器與PWM引腳的關系如表1所示。
表1定時器與PWM引腳的關系
定時器 | OC0A | OC0B | OC1A | OC1B | OC2A | OC2B |
PWM引腳 | 6 | 5 | 9 | 10 | 11 | 3 |
TimerOne定時器庫函數庫中自帶的ISRBlink程序如程序代碼1所示,可以實現13號管腳上LED的5Hz頻率的閃爍。
程序代碼1:ISRBlink示例程序
#include
void setup() {
}
void loop(){
//主函數,用于執行非周期性任務
}
void timerIsr(){
}
1.2評估定時時間的準確性
僅僅憑靠眼睛不能判斷定時時間是否準確,下面我們設計一個實驗來評估定時時間的準確性。我們需要將上面示例代碼中的Timer1.initialize(100000)更改為Timer1.initialize(1000),digitalWrite( 13, digitalRead( 13 ) ^ 1 )更改為digitalWrite(2, digitalRead( 2) ^ 1 ),通過反轉I/O的電平實現數字端口2輸出500Hz的近似方波。
同時,我們使用NI USB-6009便攜式數據采集卡和LabVIEW 2012軟件實現一個簡易的模擬量采集器,將Arduino控制器上的數字端口2和GND分別與NI USB-6009便攜式數據采集卡上的AI0/AI0+和AI4/AI0-相連接,NI USB-6009便攜式數據采集卡接口示意圖如圖1所示,Arduino Uno控制器與USB-6009便攜式數據采集卡的連接圖如圖2所示。然后使用10kps的采樣率,5秒的采樣時間的參數采集Arduino控制器上的數字端口2輸出的方波信號,取其前20ms的波形如圖3所示,通過波形頻率分析工具測量得到其頻率為499.901Hz。
另外,我們又將定時時間設置為100微秒、50微秒和25微秒,并使用NI USB-6009便攜式數據采集卡和LabVIEW 2012軟件以45kps的采樣率和2秒的采樣時間分別采集了數字端口2輸出的波形數據并進行頻率分析,得到其頻率分別為4999.01Hz,9998.03Hz,19996Hz。從以上數據對比分析可知,定時器的定時時間非常準確,頻率測量誤差主要來自于I/O反轉操作延時導致的。
最后,我們還測試了OCROBOT MEGA 2560控制器、Arduino Uno控制器山寨版輸出的500Hz的方波信號頻率,分別為500.435Hz和499.764Hz。

圖1 NI USB-6009接口示意圖


圖3定時器中斷產生的500Hz方波信號
2.轉速測量
2.1測量轉速方法
測量轉速方法有3種,分別為測頻法(M法)、測周法(T法)及混合法(M/T法)。
測頻法是在一定時間內,通過測量旋轉引起的單位時間內的脈沖數,實現對旋轉軸轉速測量的一種方法,適用于高、中轉速的測量。該法本質上屬于定時測角法,為提高測量的準確度,有時采用多標記或開齒的方法,其不確定度主要取決于時間測量和計數量化。
測周法是在轉速脈沖的間隔內,用時鐘脈沖來測量轉速的一種方法,適合于低轉速測量。該法實際上就是定角測量法,即用時標填充的方法來測量相當于某一旋轉角度的時間間隔。在高、中轉速時,可采用多周期平均來提高測量準確度,其不確定度主要取決于時間測量、計數量化及觸發的不確定度。
混合法是在測頻法的基礎上,吸取測周法的優點匯集而成的一種轉速測量方法。它是在轉速傳感器輸出脈沖啟動定時脈沖的同時,計取傳感器輸出脈沖個數和時鐘脈沖個數,而當到達測量時間時,先停止對傳感器輸出脈沖的計數,在下一個定時脈沖啟動之前再停止時鐘脈沖的計數。因此,該種方法可在較寬的范圍內使用。
此處,我們選擇測頻法來測量轉速,其工作原理為:當被測信號在特定時間段T內的周期個數為N時,則被測信號的頻率f=N/T。
2.2轉速測量程序設計
利用TimerOne定時器庫來實現定時,通過外部中斷對電機編碼器輸出的脈沖進行計數,計數值除以定時時間即為一定時間內的轉速。實現1秒內轉速測量的程序如程序代碼2所示。
程序代碼2:轉速測量程序
#include
long counter_val[2] = {0,0};
byte CurCnt = 0;
int j=0;
void setup() {
}
void loop()
{
}
//外部中斷處理函數
void counter()
{
}
//定時器中斷處理函數
void timerIsr()
{
}
2.3驗證頻率測量的準確性
前面提到了Arduino的模擬輸出(PWM)的頻率約為490Hz,且轉速測量采用的是測頻法,此時用來正好來驗證一下程序設計的正確性。在上面的轉速測量程序中的void setup()里面delay(2000)之前增加如下代碼,以產生方波。串口輸出的頻率測量結果如圖4所示。


評論