新聞中心

EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > 基于Arduino與LabVIEW的直流電機(jī)轉(zhuǎn)速控制系統(tǒng)

基于Arduino與LabVIEW的直流電機(jī)轉(zhuǎn)速控制系統(tǒng)

作者: 時(shí)間:2017-01-06 來(lái)源:網(wǎng)絡(luò) 收藏
多數(shù)的Arduino控制器都是基于Atmel公司的AVR系列單片機(jī)的,AVR單片機(jī)的片內(nèi)資源非常的豐富,有ADC、定時(shí)器、外部中斷、SPI、IIC、PWM等功能,且Arduino控制器的PWM采用的是定時(shí)器相位修正PWM(頻率約為490Hz)和快速PWM(頻率約為980Hz,Uno的5、6和Leonardo的3、11),這也就導(dǎo)致了全部的定時(shí)器都被被占用了,從而不能很方便的使用定時(shí)器設(shè)置一個(gè)中斷來(lái)實(shí)現(xiàn)一個(gè)周期的任務(wù),而一般需要通過(guò)讀取系統(tǒng)已運(yùn)行時(shí)間來(lái)判斷定時(shí)時(shí)間是否已經(jīng)達(dá)到。例如,通過(guò)增量式編碼器來(lái)測(cè)量電機(jī)的轉(zhuǎn)速,常規(guī)的單片機(jī)的程序架構(gòu)是通過(guò)定時(shí)器來(lái)實(shí)現(xiàn)精確的時(shí)間定時(shí),并利用外部中斷來(lái)實(shí)現(xiàn)對(duì)脈沖數(shù)目的計(jì)數(shù),然后計(jì)算出一定時(shí)間內(nèi)脈沖的數(shù)目,從而得到轉(zhuǎn)速數(shù)值并輸出。

直流電機(jī)是Arduino機(jī)器人制作中的主要?jiǎng)恿?lái)源,但是由于電機(jī)的參數(shù)一致性有所差別,即使是相同型號(hào)的電機(jī)在相同電壓下的轉(zhuǎn)速都不完全相同,而且在帶負(fù)載或負(fù)載不同的情況下,更加會(huì)導(dǎo)致電機(jī)轉(zhuǎn)速發(fā)生變化,這就會(huì)導(dǎo)致制作的Arduino輪式機(jī)器人不能實(shí)現(xiàn)直線行走,因?yàn)檫@是一個(gè)開(kāi)環(huán)控制,沒(méi)有任何反饋信號(hào)返回。如果給直流電機(jī)加上編碼器作為反饋器件,也就可以測(cè)量得到電機(jī)的當(dāng)前轉(zhuǎn)速,如果將其與設(shè)定值計(jì)算差值,并通過(guò)PID算法計(jì)算得到新的控制信號(hào),從而可以動(dòng)態(tài)的測(cè)量和控制電機(jī)的轉(zhuǎn)速,形成一個(gè)閉環(huán)控制系統(tǒng)。

本文引用地址:http://m.butianyuan.cn/article/201701/337030.htm

下面我們利用帶有編碼器的直流電機(jī)、Arduino控制器、直流電機(jī)驅(qū)動(dòng)板和LabVIEW上位機(jī)軟件以實(shí)驗(yàn)探索的形式來(lái)設(shè)計(jì)一個(gè)直流電機(jī)轉(zhuǎn)速比例控制實(shí)驗(yàn)。

1.TimerOne定時(shí)器庫(kù)

1.1下載及使用方法

TimerOne定時(shí)器庫(kù)使用AVR單片機(jī)內(nèi)部的定時(shí)器1實(shí)現(xiàn)定時(shí)中斷的功能,其下載地址為:https://code.google.com/p/arduino-timerone/,只需要更改幾個(gè)參數(shù)即可使用定時(shí)器中斷來(lái)實(shí)現(xiàn)周期性執(zhí)行的任務(wù)。需要注意的是,如果使用了TimerOne定時(shí)器庫(kù),也就不能在相應(yīng)的引腳輸出PWM電壓,Uno上的定時(shí)器與PWM引腳的關(guān)系如表1所示。

表1定時(shí)器與PWM引腳的關(guān)系

定時(shí)器

OC0A

OC0B

OC1A

OC1B

OC2A

OC2B

PWM引腳

6

5

9

10

11

3

TimerOne定時(shí)器庫(kù)函數(shù)庫(kù)中自帶的ISRBlink程序如程序代碼1所示,可以實(shí)現(xiàn)13號(hào)管腳上LED的5Hz頻率的閃爍。

程序代碼1:ISRBlink示例程序

#include

void setup() {

pinMode(13, OUTPUT);

Timer1.initialize(100000); //設(shè)置定時(shí)器中斷時(shí)間,基本單位為微秒,如設(shè)置為100000,則定時(shí)時(shí)間為0.1秒,頻率為10Hz。

Timer1.attachInterrupt( timerIsr ); //設(shè)置用戶(hù)自定義的定時(shí)器中斷服務(wù)函數(shù),每發(fā)生一次定時(shí)器中斷,均會(huì)執(zhí)行一次定時(shí)器中斷服務(wù)函數(shù)。

}

void loop(){

//主函數(shù),用于執(zhí)行非周期性任務(wù)

}

void timerIsr(){

//反轉(zhuǎn)I/O口電平

digitalWrite( 13, digitalRead( 13 ) ^ 1 );

}

1.2評(píng)估定時(shí)時(shí)間的準(zhǔn)確性

僅僅憑靠眼睛不能判斷定時(shí)時(shí)間是否準(zhǔn)確,下面我們?cè)O(shè)計(jì)一個(gè)實(shí)驗(yàn)來(lái)評(píng)估定時(shí)時(shí)間的準(zhǔn)確性。我們需要將上面示例代碼中的Timer1.initialize(100000)更改為T(mén)imer1.initialize(1000),digitalWrite( 13, digitalRead( 13 ) ^ 1 )更改為digitalWrite(2, digitalRead( 2) ^ 1 ),通過(guò)反轉(zhuǎn)I/O的電平實(shí)現(xiàn)數(shù)字端口2輸出500Hz的近似方波。

同時(shí),我們使用NI USB-6009便攜式數(shù)據(jù)采集卡和LabVIEW 2012軟件實(shí)現(xiàn)一個(gè)簡(jiǎn)易的模擬量采集器,將Arduino控制器上的數(shù)字端口2和GND分別與NI USB-6009便攜式數(shù)據(jù)采集卡上的AI0/AI0+和AI4/AI0-相連接,NI USB-6009便攜式數(shù)據(jù)采集卡接口示意圖如圖1所示,Arduino Uno控制器與USB-6009便攜式數(shù)據(jù)采集卡的連接圖如圖2所示。然后使用10kps的采樣率,5秒的采樣時(shí)間的參數(shù)采集Arduino控制器上的數(shù)字端口2輸出的方波信號(hào),取其前20ms的波形如圖3所示,通過(guò)波形頻率分析工具測(cè)量得到其頻率為499.901Hz。

另外,我們又將定時(shí)時(shí)間設(shè)置為100微秒、50微秒和25微秒,并使用NI USB-6009便攜式數(shù)據(jù)采集卡和LabVIEW 2012軟件以45kps的采樣率和2秒的采樣時(shí)間分別采集了數(shù)字端口2輸出的波形數(shù)據(jù)并進(jìn)行頻率分析,得到其頻率分別為4999.01Hz,9998.03Hz,19996Hz。從以上數(shù)據(jù)對(duì)比分析可知,定時(shí)器的定時(shí)時(shí)間非常準(zhǔn)確,頻率測(cè)量誤差主要來(lái)自于I/O反轉(zhuǎn)操作延時(shí)導(dǎo)致的。

最后,我們還測(cè)試了OCROBOT MEGA 2560控制器、Arduino Uno控制器山寨版輸出的500Hz的方波信號(hào)頻率,分別為500.435Hz和499.764Hz。

圖1 NI USB-6009接口示意圖

圖2 NI USB-6009與Arduino連接示意圖

圖3定時(shí)器中斷產(chǎn)生的500Hz方波信號(hào)

2.轉(zhuǎn)速測(cè)量

2.1測(cè)量轉(zhuǎn)速方法

測(cè)量轉(zhuǎn)速方法有3種,分別為測(cè)頻法(M法)、測(cè)周法(T法)及混合法(M/T法)。

測(cè)頻法是在一定時(shí)間內(nèi),通過(guò)測(cè)量旋轉(zhuǎn)引起的單位時(shí)間內(nèi)的脈沖數(shù),實(shí)現(xiàn)對(duì)旋轉(zhuǎn)軸轉(zhuǎn)速測(cè)量的一種方法,適用于高、中轉(zhuǎn)速的測(cè)量。該法本質(zhì)上屬于定時(shí)測(cè)角法,為提高測(cè)量的準(zhǔn)確度,有時(shí)采用多標(biāo)記或開(kāi)齒的方法,其不確定度主要取決于時(shí)間測(cè)量和計(jì)數(shù)量化。

測(cè)周法是在轉(zhuǎn)速脈沖的間隔內(nèi),用時(shí)鐘脈沖來(lái)測(cè)量轉(zhuǎn)速的一種方法,適合于低轉(zhuǎn)速測(cè)量。該法實(shí)際上就是定角測(cè)量法,即用時(shí)標(biāo)填充的方法來(lái)測(cè)量相當(dāng)于某一旋轉(zhuǎn)角度的時(shí)間間隔。在高、中轉(zhuǎn)速時(shí),可采用多周期平均來(lái)提高測(cè)量準(zhǔn)確度,其不確定度主要取決于時(shí)間測(cè)量、計(jì)數(shù)量化及觸發(fā)的不確定度。

混合法是在測(cè)頻法的基礎(chǔ)上,吸取測(cè)周法的優(yōu)點(diǎn)匯集而成的一種轉(zhuǎn)速測(cè)量方法。它是在轉(zhuǎn)速傳感器輸出脈沖啟動(dòng)定時(shí)脈沖的同時(shí),計(jì)取傳感器輸出脈沖個(gè)數(shù)和時(shí)鐘脈沖個(gè)數(shù),而當(dāng)?shù)竭_(dá)測(cè)量時(shí)間時(shí),先停止對(duì)傳感器輸出脈沖的計(jì)數(shù),在下一個(gè)定時(shí)脈沖啟動(dòng)之前再停止時(shí)鐘脈沖的計(jì)數(shù)。因此,該種方法可在較寬的范圍內(nèi)使用。

此處,我們選擇測(cè)頻法來(lái)測(cè)量轉(zhuǎn)速,其工作原理為:當(dāng)被測(cè)信號(hào)在特定時(shí)間段T內(nèi)的周期個(gè)數(shù)為N時(shí),則被測(cè)信號(hào)的頻率f=N/T。

2.2轉(zhuǎn)速測(cè)量程序設(shè)計(jì)

利用TimerOne定時(shí)器庫(kù)來(lái)實(shí)現(xiàn)定時(shí),通過(guò)外部中斷對(duì)電機(jī)編碼器輸出的脈沖進(jìn)行計(jì)數(shù),計(jì)數(shù)值除以定時(shí)時(shí)間即為一定時(shí)間內(nèi)的轉(zhuǎn)速。實(shí)現(xiàn)1秒內(nèi)轉(zhuǎn)速測(cè)量的程序如程序代碼2所示。

程序代碼2:轉(zhuǎn)速測(cè)量程序

#include

long counter_val[2] = {0,0};//定義數(shù)組,用于存放外部中斷計(jì)數(shù)值

byte CurCnt = 0;//定義當(dāng)前計(jì)數(shù)器標(biāo)志,用于判斷當(dāng)前正在計(jì)數(shù)的數(shù)組

int j=0;//定義定時(shí)器中斷標(biāo)志,用于判斷是否發(fā)生中斷

void setup() {

delay(2000);

Serial.begin(115200);//初始化波特率為115200

attachInterrupt(0, counter, RISING);//設(shè)置中斷方式為上升沿

Timer1.initialize(1000000); //設(shè)置定時(shí)器中斷時(shí)間,單位微秒,此處為1秒

Timer1.attachInterrupt( timerIsr ); //打開(kāi)定時(shí)器中斷

interrupts();//打開(kāi)外部中斷

}

void loop()

{

long lTemp = 0; //定義臨時(shí)存儲(chǔ)數(shù)據(jù)變量

if(j==1)//判斷是否發(fā)生定時(shí)器中斷,即定時(shí)時(shí)間是否到達(dá)

{

j=0; //清除定時(shí)器中斷標(biāo)志位

if((CurCnt&0x01) == 0) //當(dāng)前使用的是偶數(shù)計(jì)數(shù)器,則上次頻率值存放在第二個(gè)元素中

{

lTemp = counter_val[1];//讀取數(shù)組第二個(gè)元素中的數(shù)值

counter_val[1]=0;//讀完清除原來(lái)的數(shù)值,以便下次使用

}

else//當(dāng)前使用的是奇數(shù)計(jì)數(shù)器,則上次頻率值存放在第一個(gè)元素中

{

lTemp = counter_val[0];//讀取數(shù)組第二個(gè)元素中的數(shù)值

counter_val[0]=0;//讀完清除原來(lái)的數(shù)值,以便下次使用

}

Serial.print("S");//發(fā)送幀頭大寫(xiě)S

Serial.print( lTemp);//發(fā)送頻率數(shù)據(jù),并回車(chē)換行

}

}

//外部中斷處理函數(shù)

void counter()

{

//通過(guò)當(dāng)前計(jì)數(shù)器來(lái)實(shí)現(xiàn)對(duì)外部中斷計(jì)數(shù)值存儲(chǔ)的切換

counter_val[CurCnt& 0x01] += 1;//發(fā)生一次中斷則加1

}

//定時(shí)器中斷處理函數(shù)

void timerIsr()

{

j=1;//置位定時(shí)器中斷標(biāo)志位

CurCnt++; //當(dāng)前計(jì)數(shù)器的值加1,實(shí)現(xiàn)另一個(gè)計(jì)數(shù)值切換

}

2.3驗(yàn)證頻率測(cè)量的準(zhǔn)確性

前面提到了Arduino的模擬輸出(PWM)的頻率約為490Hz,且轉(zhuǎn)速測(cè)量采用的是測(cè)頻法,此時(shí)用來(lái)正好來(lái)驗(yàn)證一下程序設(shè)計(jì)的正確性。在上面的轉(zhuǎn)速測(cè)量程序中的void setup()里面delay(2000)之前增加如下代碼,以產(chǎn)生方波。串口輸出的頻率測(cè)量結(jié)果如圖4所示。


上一頁(yè) 1 2 3 下一頁(yè)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉