專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> Arduino >> 瀏覽文章

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

作者:我不是奔跑哥   來源:我不是奔跑哥   點(diǎn)擊數(shù):  更新時(shí)間:2014年06月08日   【字體:
新浪博客我不是奔跑哥看到一篇好文章分享給大家版權(quán)貴原作者所有:

多數(shù)的
Arduino控制器都是基于Atmel公司的AVR系列單片機(jī)的,AVR單片機(jī)的片內(nèi)資源非常的豐富,有ADC、定時(shí)器、外部中斷、SPIIIC、PWM等功能,且Arduino控制器的PWM采用的是定時(shí)器相位修正PWM(頻率約為490Hz)和快速PWM(頻率約為980Hz,Uno5、6Leonardo3、11),這也就導(dǎo)致了全部的定時(shí)器都被被占用了,從而不能很方便的使用定時(shí)器設(shè)置一個(gè)中斷來實(shí)現(xiàn)一個(gè)周期的任務(wù),而一般需要通過讀取系統(tǒng)已運(yùn)行時(shí)間來判斷定時(shí)時(shí)間是否已經(jīng)達(dá)到。例如,通過增量式編碼器來測量電機(jī)的轉(zhuǎn)速,常規(guī)的單片機(jī)的程序架構(gòu)是通過定時(shí)器來實(shí)現(xiàn)精確的時(shí)間定時(shí),并利用外部中斷來實(shí)現(xiàn)對脈沖數(shù)目的計(jì)數(shù),然后計(jì)算出一定時(shí)間內(nèi)脈沖的數(shù)目,從而得到轉(zhuǎn)速數(shù)值并輸出。
 
直流電機(jī)是Arduino機(jī)器人制作中的主要動力來源,但是由于電機(jī)的參數(shù)一致性有所差別,即使是相同型號的電機(jī)在相同電壓下的轉(zhuǎn)速都不完全相同,而且在帶負(fù)載或負(fù)載不同的情況下,更加會導(dǎo)致電機(jī)轉(zhuǎn)速發(fā)生變化,這就會導(dǎo)致制作的Arduino輪式機(jī)器人不能實(shí)現(xiàn)直線行走,因?yàn)檫@是一個(gè)開環(huán)控制,沒有任何反饋信號返回。如果給直流電機(jī)加上編碼器作為反饋器件,也就可以測量得到電機(jī)的當(dāng)前轉(zhuǎn)速,如果將其與設(shè)定值計(jì)算差值,并通過PID算法計(jì)算得到新的控制信號,從而可以動態(tài)的測量和控制電機(jī)的轉(zhuǎn)速,形成一個(gè)閉環(huán)控制系統(tǒng)。
下面我們利用帶有編碼器的直流電機(jī)、Arduino控制器、直流電機(jī)驅(qū)動板和LabVIEW上位機(jī)軟件以實(shí)驗(yàn)探索的形式來設(shè)計(jì)一個(gè)直流電機(jī)轉(zhuǎn)速比例控制實(shí)驗(yàn)。
1TimerOne定時(shí)器庫
1.1下載及使用方法
TimerOne定時(shí)器庫使用AVR單片機(jī)內(nèi)部的定時(shí)器1實(shí)現(xiàn)定時(shí)中斷的功能,其下載地址為:https://code.google.com/p/arduino-timerone/,只需要更改幾個(gè)參數(shù)即可使用定時(shí)器中斷來實(shí)現(xiàn)周期性執(zhí)行的任務(wù)。需要注意的是,如果使用了TimerOne定時(shí)器庫,也就不能在相應(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í)器庫函數(shù)庫中自帶的ISRBlink程序如程序代碼1所示,可以實(shí)現(xiàn)13號管腳上LED的5Hz頻率的閃爍。
程序代碼1ISRBlink示例程序
#include
void setup() {
  pinMode(13, OUTPUT);
  Timer1.initialize(100000); //設(shè)置定時(shí)器中斷時(shí)間,基本單位為微秒,如設(shè)置為100000,則定時(shí)時(shí)間為0.1秒,頻率為10Hz。
  Timer1.attachInterrupt( timerIsr ); // 設(shè)置用戶自定義的定時(shí)器中斷服務(wù)函數(shù),每發(fā)生一次定時(shí)器中斷,均會執(zhí)行一次定時(shí)器中斷服務(wù)函數(shù)。
}
void loop(){
//主函數(shù),用于執(zhí)行非周期性任務(wù)
}
 
void timerIsr(){
    // 反轉(zhuǎn)I/O口電平
    digitalWrite( 13, digitalRead( 13 ) ^ 1 );
}
1.2評估定時(shí)時(shí)間的準(zhǔn)確性
僅僅憑靠眼睛不能判斷定時(shí)時(shí)間是否準(zhǔn)確,下面我們設(shè)計(jì)一個(gè)實(shí)驗(yàn)來評估定時(shí)時(shí)間的準(zhǔn)確性。我們需要將上面示例代碼中的Timer1.initialize(100000)更改為Timer1.initialize(1000),digitalWrite( 13, digitalRead( 13 ) ^ 1 )更改為digitalWrite(2, digitalRead( 2) ^ 1 ),通過反轉(zhuǎn)I/O的電平實(shí)現(xiàn)數(shù)字端口2輸出500Hz的近似方波。
同時(shí),我們使用NI USB-6009便攜式數(shù)據(jù)采集卡和LabVIEW 2012軟件實(shí)現(xiàn)一個(gè)簡易的模擬量采集器,將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輸出的方波信號,取其前20ms的波形如圖3所示,通過波形頻率分析工具測量得到其頻率為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ù)對比分析可知,定時(shí)器的定時(shí)時(shí)間非常準(zhǔn)確,頻率測量誤差主要來自于I/O反轉(zhuǎn)操作延時(shí)導(dǎo)致的。
最后,我們還測試了OCROBOT MEGA 2560控制器、Arduino Uno控制器山寨版輸出的500Hz的方波信號頻率,分別為500.435Hz和499.764Hz。
 
1 NI USB-6009接口示意圖
 2 NI USB-6009Arduino連接示意圖
 
3定時(shí)器中斷產(chǎn)生的500Hz方波信號
2.轉(zhuǎn)速測量
2.1測量轉(zhuǎn)速方法
測量轉(zhuǎn)速方法有3種,分別為測頻法(M法)、 測周法(T法)及混合法(M/T法)。
測頻法是在一定時(shí)間內(nèi),通過測量旋轉(zhuǎn)引起的單位時(shí)間內(nèi)的脈沖數(shù),實(shí)現(xiàn)對旋轉(zhuǎn)軸轉(zhuǎn)速測量的一種方法,適用于高、中轉(zhuǎn)速的測量。該法本質(zhì)上屬于定時(shí)測角法,為提高測量的準(zhǔn)確度,有時(shí)采用多標(biāo)記或開齒的方法,其不確定度主要取決于時(shí)間測量和計(jì)數(shù)量化。
測周法是在轉(zhuǎn)速脈沖的間隔內(nèi),用時(shí)鐘脈沖來測量轉(zhuǎn)速的一種方法,適合于低轉(zhuǎn)速測量。該法實(shí)際上就是定角測量法,即用時(shí)標(biāo)填充的方法來測量相當(dāng)于某一旋轉(zhuǎn)角度的時(shí)間間隔。在高、中轉(zhuǎn)速時(shí),可采用多周期平均來提高測量準(zhǔn)確度,其不確定度主要取決于時(shí)間測量、計(jì)數(shù)量化及觸發(fā)的不確定度。
混合法是在測頻法的基礎(chǔ)上,吸取測周法的優(yōu)點(diǎn)匯集而成的一種轉(zhuǎn)速測量方法。它是在轉(zhuǎn)速傳感器輸出脈沖啟動定時(shí)脈沖的同時(shí),計(jì)取傳感器輸出脈沖個(gè)數(shù)和時(shí)鐘脈沖個(gè)數(shù),而當(dāng)?shù)竭_(dá)測量時(shí)間時(shí),先停止對傳感器輸出脈沖的計(jì)數(shù),在下一個(gè)定時(shí)脈沖啟動之前再停止時(shí)鐘脈沖的計(jì)數(shù)。因此,該種方法可在較寬的范圍內(nèi)使用。
此處,我們選擇測頻法來測量轉(zhuǎn)速,其工作原理為:當(dāng)被測信號在特定時(shí)間段T內(nèi)的周期個(gè)數(shù)為N時(shí),則被測信號的頻率f=N/T。
2.2轉(zhuǎn)速測量程序設(shè)計(jì)
利用TimerOne定時(shí)器庫來實(shí)現(xiàn)定時(shí),通過外部中斷對電機(jī)編碼器輸出的脈沖進(jìn)行計(jì)數(shù),計(jì)數(shù)值除以定時(shí)時(shí)間即為一定時(shí)間內(nèi)的轉(zhuǎn)速。實(shí)現(xiàn)1秒內(nèi)轉(zhuǎn)速測量的程序如程序代碼2所示。
程序代碼2:轉(zhuǎn)速測量程序
#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 ); // 打開定時(shí)器中斷
  interrupts();  //打開外部中斷
}
 
void loop()
{
  long lTemp = 0; //定義臨時(shí)存儲數(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;       //讀完清除原來的數(shù)值,以便下次使用
     }
     else   //當(dāng)前使用的是奇數(shù)計(jì)數(shù)器,則上次頻率值存放在第一個(gè)元素中
     {
       lTemp = counter_val[0];  //讀取數(shù)組第二個(gè)元素中的數(shù)值
       counter_val[0]=0;  //讀完清除原來的數(shù)值,以便下次使用
     }
        Serial.print("S");    //發(fā)送幀頭大寫S
        Serial.print( lTemp);  //發(fā)送頻率數(shù)據(jù),并回車換行
     }
}
 
//外部中斷處理函數(shù)
void counter()
{
                  //通過當(dāng)前計(jì)數(shù)器來實(shí)現(xiàn)對外部中斷計(jì)數(shù)值存儲的切換
     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)證頻率測量的準(zhǔn)確性
前面提到了Arduino的模擬輸出(PWM)的頻率約為490Hz,且轉(zhuǎn)速測量采用的是測頻法,此時(shí)用來正好來驗(yàn)證一下程序設(shè)計(jì)的正確性。在上面的轉(zhuǎn)速測量程序中的void setup()里面delay(2000)之前增加如下代碼,以產(chǎn)生方波。串口輸出的頻率測量結(jié)果如圖4所示。
pinMode(3,OUTPUT);
analogWrite(3,127);
 
4 PWM頻率測量結(jié)果
在圖4所示的PWM頻率測量結(jié)果中,去除前兩個(gè),可以發(fā)現(xiàn)頻率值穩(wěn)定在490和491,且4個(gè)490之后出現(xiàn)一個(gè)491,基本可以認(rèn)為是490Hz。
同時(shí),為了進(jìn)一步的確認(rèn)PWM的頻率為490Hz,已驗(yàn)證頻率測量的準(zhǔn)確性,利用NI USB-6009便攜式數(shù)據(jù)采集卡和LabVIEW 2012軟件實(shí)現(xiàn)一個(gè)簡易的模擬量采集器,使用10kps的采樣率,5秒的采樣時(shí)間的參數(shù)分別采集了PWM的占空比為10/255、127/255和245/255時(shí)的波形圖,取波形圖的前0.01秒,如圖5、圖6和圖7所示,在0.01秒內(nèi)約有5個(gè)周期,同時(shí)使用頻率分析工具對占空比為127/255的波形數(shù)據(jù)進(jìn)行分許,得到其頻率為490.099Hz。
通過對基于Arduino與TimerOne定時(shí)器庫的頻率測量與基于LabVIEW和數(shù)據(jù)采集卡的數(shù)據(jù)對比與分析,得出頻率測量非常準(zhǔn)確。
 
占空比為10/255時(shí)的波形
占空比為127/255時(shí)的波形
7 占空比為245/255時(shí)的波形
2.4搭建測量轉(zhuǎn)速的平臺
在驗(yàn)證了基于Arduino與TimerOne定時(shí)器庫的頻率測量的準(zhǔn)確性之后,我們就可以著手搭建一個(gè)直流電機(jī)轉(zhuǎn)速測量系統(tǒng)。
2.4.1 硬件平臺
直流電機(jī)轉(zhuǎn)速測量系統(tǒng)的直流電機(jī)和編碼器有兩者分離式,使用聯(lián)軸器將兩者連接起來,也有帶有編碼器的直流電機(jī),此處為了簡化設(shè)計(jì),直接選用帶有編碼器的直流電機(jī)。JGB37-371-12V-228RPM帶有編碼器的直流減速電機(jī)如圖8所示,額定電壓為12V,額定空載轉(zhuǎn)速為228rpm,其編碼器為334線增量式光電編碼器,其接口有6根數(shù)據(jù)線,黃色和橙色是電機(jī)電源,綠色和白色是AB相脈沖輸出,紅色和黑色是編碼器的電源端和接地端。
 
帶有編碼器的直流減速電機(jī)
9 OCROBOT Motor Shield
OCROBOT Motor Shield 是基于Arduino Motor Shield 設(shè)計(jì)的增強(qiáng)版本的電機(jī)驅(qū)動器,如圖9所示,電機(jī)驅(qū)動器采用獨(dú)立供電、GND分離技術(shù),且與Arduino控制器之間采用光耦隔離,這充分保證了Arduino控制器在大負(fù)載、大功率、急剎車、瞬時(shí)正反轉(zhuǎn)等惡劣電磁環(huán)境下的穩(wěn)定性。需要注意的是:Arduino控制器與電機(jī)驅(qū)動器應(yīng)使用兩塊電池或者兩個(gè)獨(dú)立的電源,保證電機(jī)驅(qū)動板與Arduino控制板電源完全獨(dú)立,從而保證其電氣隔離性。OCROBOT Motor Shield的I/O口的控制功能如表2所示,如果使用電機(jī)時(shí)還會接駁其他設(shè)備應(yīng)避免占用這些I/O口。
2 OCROBOT Motor Shield的控制引腳
功能
電機(jī)A
電機(jī)B
方向
D12
D13
速度(PWM)
D3
D11
制動(剎車)
D9
D8
搭建的直流電機(jī)轉(zhuǎn)速測量系統(tǒng)如圖10所示。OCROBOT Motor Shield 直接堆疊在Arduino Uno控制器上,OCROBOT Motor Shield采用7.4V的鋰電池供電,Arduino Uno控制器使用方口USB線連接至計(jì)算機(jī)上,提供電源且可以方便的通過串口上傳數(shù)據(jù)至計(jì)算機(jī)上。電機(jī)的黃色和橙色連接至OCROBOT Motor Shield電機(jī)接口A,綠色和白色分別連接至Arduino Uno控制器的數(shù)字端口2、3,紅色和黑色連接至Arduino Uno控制器的電源端口5V、GND。
 
10 直流電機(jī)轉(zhuǎn)速測量系統(tǒng)
2.4.2 軟件設(shè)計(jì)
由于JGB37-371-12V-228RPM直流減速電機(jī)的編碼器輸出AB相脈沖,為了充分利用兩相脈沖以提高測量準(zhǔn)確性,在程序代碼2轉(zhuǎn)速測量程序中的attachInterrupt(0, counter, RISING)之后增加如下代碼,將B相脈沖輸出也用來計(jì)數(shù),以實(shí)現(xiàn)2倍頻測量。JGB37-371-12V-228RPM直流減速電機(jī)的編碼器為334線增量式光電編碼器,也就說電機(jī)旋轉(zhuǎn)一圈輸出334個(gè)脈沖,2倍頻之后即為668個(gè)脈沖。
attachInterrupt(1, counter, RISING);//設(shè)置編碼器B相位上升沿中斷
修改完編碼器部分,需要增加電機(jī)驅(qū)動部分的代碼,以實(shí)現(xiàn)驅(qū)動直流電機(jī)旋轉(zhuǎn)。由于硬件上將直流電機(jī)的電源線接在L298P的A端口,其控制信號為3、9和12,分別為PWM信號、制動信號和方向信號。需要在void setup()中的delay(2000)之后增加如下代碼。當(dāng)PWM值為80時(shí),串口輸出的轉(zhuǎn)速如圖8所示,且當(dāng)PWM低于80時(shí),減速電機(jī)輸出軸不轉(zhuǎn)動;將PWM設(shè)置為255時(shí),串口輸出的轉(zhuǎn)速如圖9所示。
pinMode(12,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(9,OUTPUT);      //啟用電機(jī)A的三個(gè)管腳,全部設(shè)置為輸出狀態(tài)
  digitalWrite(9, LOW);       //松開電機(jī)A的制動
  digitalWrite(12, HIGH);     //設(shè)置方向?yàn)檎?/span>
analogWrite(3,80);         //設(shè)置PWM
  
8 PWM80時(shí)轉(zhuǎn)速數(shù)據(jù)

9 PWM255時(shí)轉(zhuǎn)速數(shù)據(jù)
3.轉(zhuǎn)速的比例控制
3.1PID控制方法
PID控制器(比例-積分-微分控制器),由比例單元P、積分單元I和微分單元D組成。通過Kp,Ki和Kd三個(gè)參數(shù)的設(shè)定來實(shí)現(xiàn)對某個(gè)變量的實(shí)時(shí)控制,主要適用于基本上線性,且動態(tài)特性不隨時(shí)間變化的系統(tǒng)。
PID控制器是一個(gè)在工業(yè)控制應(yīng)用中常見的反饋控制方法,其原理如圖10所示,其將采集的數(shù)據(jù)和設(shè)定參考值進(jìn)行比較,然后將這個(gè)差值通過PID三個(gè)模塊計(jì)算出新的控制值用于執(zhí)行,計(jì)算差值的目的是讓系統(tǒng)的數(shù)據(jù)達(dá)到或者保持在設(shè)定的參考值。PID控制器可以根據(jù)歷史數(shù)據(jù)和差別的出現(xiàn)率來調(diào)整輸入值,使系統(tǒng)更加準(zhǔn)確而穩(wěn)定。
 
10  PD控制基本原理
3.2 轉(zhuǎn)速比例控制的程序設(shè)計(jì)
實(shí)現(xiàn)了電機(jī)轉(zhuǎn)速的測量,下面就要對電機(jī)轉(zhuǎn)速進(jìn)行比例控制了。為了提高控制系統(tǒng)響應(yīng)的速度,將程序代碼2轉(zhuǎn)速測量程序中的定時(shí)時(shí)間更改為10毫秒,也就是轉(zhuǎn)速的采樣頻率為100Hz,且由圖8和圖9可知,電機(jī)減速前的1秒鐘轉(zhuǎn)速在4500和12650之間,即10毫秒的轉(zhuǎn)速在45至127之間,此處將轉(zhuǎn)速設(shè)置為100,比例系數(shù)設(shè)置為3。轉(zhuǎn)速比例控制的程序設(shè)計(jì)如程序代碼3所示。
程序代碼3:轉(zhuǎn)速比例控制的程序設(shè)計(jì)
#include
#define Kp 3
#define set_point 100
long counter_val[2] = {0,0};
byte CurCnt = 0;
int j=0;
int output_value=0;
void setup()
              
  delay(2000);
  pinMode(12,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(9,OUTPUT);       //啟用電機(jī)A的三個(gè)管腳,全部設(shè)置為輸出狀態(tài)
  digitalWrite(9, LOW);       //松開電機(jī)A的制動
  digitalWrite(12, HIGH);      //設(shè)置方向?yàn)檎蛐D(zhuǎn)
  Serial.begin(115200);//初始化波特率為115200
  attachInterrupt(0, counter, RISING);//設(shè)置編碼器A相位上升沿中斷
  attachInterrupt(1, counter, RISING);//設(shè)置編碼器B相位上升沿中斷
  Timer1.initialize(10000); // 設(shè)置定時(shí)器中斷時(shí)間,單位微秒
  Timer1.attachInterrupt( timerIsr ); // 打開定時(shí)器中斷
  interrupts();  //打開外部中斷
}
void loop()
{
  long lTemp = 0; //定義臨時(shí)存儲數(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;       //讀完清除原來的數(shù)值,以便下次使用
     }
     else   //當(dāng)前使用的是奇數(shù)計(jì)數(shù)器,則上次頻率值存放在第一個(gè)元素中
     {
       lTemp = counter_val[0];  //讀取數(shù)組第二個(gè)元素中的數(shù)值
       counter_val[0]=0;  //讀完清除原來的數(shù)值,以便下次使用
     }
        Serial.print("A");      //發(fā)送轉(zhuǎn)速幀頭大寫A
        Serial.print( lTemp);   //發(fā)送轉(zhuǎn)速數(shù)據(jù)
        output_value =( set_point -lTemp)*Kp+ output_value;  //比例計(jì)算得到控制量
        if(output_value >255)   //限制PWM0-255范圍內(nèi)
        output_value =255;
if(output_value <0)   //限制PWM0-255范圍內(nèi)
        output_value =0;
        analogWrite(3, output_value);      //將計(jì)算得到的控制量輸出
                  Serial.print("B");                //發(fā)送PWM幀頭大寫B
        Serial.println(output_value);       //發(fā)送PWM數(shù)據(jù)
     }
}
//外部中斷處理函數(shù)
void counter()
{
     counter_val[CurCnt& 0x01] += 1;    //每一個(gè)中斷加一
}
//定時(shí)器中斷處理函數(shù)
void timerIsr()
{
  j=1;     //定時(shí)時(shí)間達(dá)到標(biāo)志
  CurCnt++; //切換計(jì)數(shù)數(shù)組
}
通過串口輸出的電機(jī)實(shí)際轉(zhuǎn)速與PWM值的數(shù)據(jù)如圖11和圖12所示。其中圖11為系統(tǒng)剛啟動的時(shí)候,此時(shí)可以看出電機(jī)逐漸上升,達(dá)到128之后逐漸降至100以下,這屬于系統(tǒng)初期的振蕩;圖12是系統(tǒng)運(yùn)行一段時(shí)間之后的轉(zhuǎn)速和PWM數(shù)據(jù),轉(zhuǎn)速穩(wěn)定在100±2,PWM穩(wěn)定在145左右。 
11 PWM80時(shí)轉(zhuǎn)速數(shù)據(jù) 
12 PWM255時(shí)轉(zhuǎn)速數(shù)據(jù)
圖11和圖12中的串口輸出數(shù)據(jù)看起來沒有圖形那么直觀,為此我們使用LabVIEW2012和VISA 5.3編寫一個(gè)轉(zhuǎn)速顯示程序。前面板如圖13所示,程序框圖如圖14所示,其中的數(shù)據(jù)解析子VI的程序框圖如圖15所示,其功能是解析出串口數(shù)據(jù)中的轉(zhuǎn)速值和PWM值。
除了上位機(jī)顯示程序之外,我們還需要對轉(zhuǎn)速的比例控制程序進(jìn)行部分修改,具體如下:
Serial.print( lTemp);   //發(fā)送轉(zhuǎn)速數(shù)據(jù)
修改為
if((lTemp/100) ==0)
  {
     Serial.print( 0);
     if((lTemp0/10) == 0)
        Serial.print( 0);
  }
Serial.print( lTemp);
Serial.println(output_value);       //發(fā)送PWM數(shù)據(jù)
修改為
if((output_value /100) ==0)
  {
     Serial.print( 0);
     if((output_value 0/10) == 0)
        Serial.print( 0);
  }
Serial.print(output_value);
 
13 LabVIEW上位機(jī)前面板
14 LabVIEW上位機(jī)程序框圖

 
15 數(shù)據(jù)解析程序框圖
在LabVIEW上位機(jī)軟件上選擇Arduino Uno控制器對應(yīng)的串口號,即可將電機(jī)的轉(zhuǎn)速和PWM值實(shí)時(shí)的顯示在LabVIEW前面板上,如圖16所示。
 

16 轉(zhuǎn)速和PWM顯示在LabVIEW上位機(jī)上
3.3 比例參數(shù)的整定及采樣時(shí)間設(shè)置
 
搭建LabVIEW上位機(jī)軟件的目的正是通過圖形化的顯示方式,觀察轉(zhuǎn)速和PWM的曲線來判斷比例系數(shù)的設(shè)置值是否合適,同時(shí)借助LabVIEW上位機(jī)軟件也可以較方便的實(shí)現(xiàn)PID控制參數(shù)的整定。下面我們在轉(zhuǎn)速采樣頻率為100Hz的情況下將多次調(diào)整比例系數(shù)且獲取其轉(zhuǎn)速和PWM曲線,并對其進(jìn)行分析,以尋找到合適的比例系數(shù),而且也是一個(gè)探索的實(shí)驗(yàn)過程。
圖17為Kp=3時(shí)轉(zhuǎn)速和PWM波形圖,從圖中可以看出,系統(tǒng)前期的振蕩較大,在800ms內(nèi)經(jīng)過7次振蕩以后逐漸趨于穩(wěn)定,且穩(wěn)定之后的PWM波形變化較大,說明Kp的取值略過大,使得系統(tǒng)對轉(zhuǎn)速偏差過于敏感。
 
17 Kp=3時(shí)轉(zhuǎn)速和PWM波形圖
圖18為Kp=4時(shí)轉(zhuǎn)速和PWM波形圖,從圖中可以看出,由于Kp的取值過大,直接導(dǎo)致系統(tǒng)振蕩而不能正常工作。
 
18 Kp=4時(shí)轉(zhuǎn)速和PWM波形圖
圖19為Kp=2時(shí)轉(zhuǎn)速和PWM波形圖,從圖中可以看出,系統(tǒng)前期的振蕩幅度較大,次數(shù)較多,PWM在600ms內(nèi)經(jīng)過4次振蕩以后逐漸趨于穩(wěn)定,且PWM波動較小,轉(zhuǎn)速在30ms時(shí)達(dá)到最大值,并在400ms內(nèi)經(jīng)過3次振蕩之后趨于穩(wěn)定。
 
19 Kp=2時(shí)轉(zhuǎn)速和PWM波形圖
圖20為Kp=1時(shí)轉(zhuǎn)速和PWM波形圖,從圖中可以看出,系統(tǒng)前期的振蕩較小,PWM在400ms內(nèi)經(jīng)過2次振蕩之后逐漸趨于穩(wěn)定,且PWM波形很小,轉(zhuǎn)速在30ms時(shí)達(dá)到最大值,并在400ms內(nèi)經(jīng)過2次小幅振蕩后逐漸趨于穩(wěn)定。
 
20 Kp=1時(shí)轉(zhuǎn)速和PWM波形圖
圖21為Kp=0.5時(shí)轉(zhuǎn)速和PWM波形圖,從圖中可以看出,系統(tǒng)前期的振蕩較小,PWM在400ms內(nèi)經(jīng)過1次調(diào)整之后逐漸趨于穩(wěn)定,且PWM波形很小,轉(zhuǎn)速在50ms時(shí)達(dá)到最大值,并在400ms內(nèi)經(jīng)過1次小幅調(diào)整后逐漸趨于穩(wěn)定。轉(zhuǎn)速的上升速度略微有點(diǎn)慢。
 
21 Kp=0.5時(shí)轉(zhuǎn)速和PWM波形圖
22Kp=0.3時(shí)轉(zhuǎn)速和PWM波形圖,從圖中可以看出,系統(tǒng)前期的振蕩較小,PWM400ms內(nèi)經(jīng)過1次調(diào)整之后逐漸趨于穩(wěn)定,且PWM波形很小,轉(zhuǎn)速在200ms時(shí)達(dá)到最大值,在400ms內(nèi)經(jīng)過1次小幅調(diào)整后逐漸趨于穩(wěn)定。系統(tǒng)的超調(diào)量較小,且轉(zhuǎn)速的上升速度較慢,起始的響應(yīng)較差。
 
22 Kp=0.3時(shí)轉(zhuǎn)速和PWM波形圖
圖23為Kp=0.1時(shí)轉(zhuǎn)速和PWM波形圖,從圖中可以看出,系統(tǒng)基本無振蕩,PWM在200ms之后逐漸趨于穩(wěn)定,且PWM波形基本不變,轉(zhuǎn)速在300ms之后逐漸趨于穩(wěn)定。系統(tǒng)的超調(diào)量非常小,且轉(zhuǎn)速的上升速度非常慢,起始的響應(yīng)非常差。
 
23 Kp=0.1時(shí)轉(zhuǎn)速和PWM波形圖
綜合圖17-圖23的波形圖,根據(jù)圖24控制系統(tǒng)效果評判,得出比例系數(shù)在0.5~1之間比較合適,有較快的上升速度,超調(diào)量適當(dāng),穩(wěn)定性較高。
 
24 控制系統(tǒng)效果評判
圖17~圖23是在轉(zhuǎn)速采樣頻率為100Hz的情況下調(diào)整比例系數(shù)獲取的轉(zhuǎn)速和PWM曲線,通過觀察曲線的形狀來尋求最優(yōu)的比例系數(shù)。下面我們在比例系數(shù)為1的情況,分別更改采樣周期為50Hz和200Hz,即定時(shí)時(shí)間分別為20ms和5ms,20ms內(nèi)的轉(zhuǎn)速為200,5ms內(nèi)的轉(zhuǎn)速為50,轉(zhuǎn)速和PWM的曲線分別如圖25和圖26所示。與圖20相比,圖25的振蕩明顯過大,圖26的穩(wěn)定時(shí)間過長,這說明比例系數(shù)和采樣速率有很大的關(guān)系,一般情況下,先確定采樣頻率,然后不斷調(diào)整比例系數(shù)。
 
25 Kp=1采樣頻率為50Hz時(shí)轉(zhuǎn)速和PWM波形圖
26  Kp=1采樣頻率為200Hz時(shí)轉(zhuǎn)速和PWM波形圖
關(guān)閉窗口

相關(guān)文章