日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 測試測量 > 設計應用 > 基于Arduino與LabVIEW的直流電機轉速控制系統(tǒng)

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

          作者: 時間:2017-01-06 來源:網絡 收藏

          圖10PD控制基本原理

          3.2轉速比例控制的程序設計

          實現了電機轉速的測量,下面就要對電機轉速進行比例控制了。為了提高控制系統(tǒng)響應的速度,將程序代碼2轉速測量程序中的定時時間更改為10毫秒,也就是轉速的采樣頻率為100Hz,且由圖8和圖9可知,電機減速前的1秒鐘轉速在4500和12650之間,即10毫秒的轉速在45至127之間,此處將轉速設置為100,比例系數設置為3。轉速比例控制的程序設計如程序代碼3所示。

          程序代碼3:轉速比例控制的程序設計

          #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);//啟用電機A的三個管腳,全部設置為輸出狀態(tài)

          digitalWrite(9, LOW);//松開電機A的制動

          digitalWrite(12, HIGH);//設置方向為正向旋轉

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

          attachInterrupt(0, counter, RISING);//設置編碼器A相位上升沿中斷

          attachInterrupt(1, counter, RISING);//設置編碼器B相位上升沿中斷

          Timer1.initialize(10000); //設置定時器中斷時間,單位微秒

          Timer1.attachInterrupt( timerIsr ); //打開定時器中斷

          interrupts();//打開外部中斷

          }

          void loop()

          {

          long lTemp = 0; //定義臨時存儲數據變量

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

          {

          j=0;//清除定時器中斷標志位

          if((CurCnt&0x01) == 0) //當前使用的是偶數計數器,則上次頻率值存放在第二個元素中

          {

          lTemp = counter_val[1];//讀取數組第二個元素中的數值

          counter_val[1]=0;//讀完清除原來的數值,以便下次使用

          }

          else//當前使用的是奇數計數器,則上次頻率值存放在第一個元素中

          {

          lTemp = counter_val[0];//讀取數組第二個元素中的數值

          counter_val[0]=0;//讀完清除原來的數值,以便下次使用

          }

          Serial.print("A");//發(fā)送轉速幀頭大寫A

          Serial.print( lTemp);//發(fā)送轉速數據

          output_value =( set_point -lTemp)*Kp+ output_value;//比例計算得到控制量

          if(output_value >255) //限制PWM在0-255范圍內

          output_value =255;

          if(output_value <0) //限制PWM在0-255范圍內

          output_value =0;

          analogWrite(3, output_value);//將計算得到的控制量輸出

          Serial.print("B");//發(fā)送PWM幀頭大寫B(tài)

          Serial.println(output_value);//發(fā)送PWM數據

          }

          }

          //外部中斷處理函數

          void counter()

          {

          counter_val[CurCnt& 0x01] += 1;//每一個中斷加一

          }

          //定時器中斷處理函數

          void timerIsr()

          {

          j=1;//定時時間達到標志

          CurCnt++; //切換計數數組

          }

          通過串口輸出的電機實際轉速與PWM值的數據如圖11和圖12所示。其中圖11為系統(tǒng)剛啟動的時候,此時可以看出電機逐漸上升,達到128之后逐漸降至100以下,這屬于系統(tǒng)初期的振蕩;圖12是系統(tǒng)運行一段時間之后的轉速和PWM數據,轉速穩(wěn)定在100±2,PWM穩(wěn)定在145左右。

          圖11 PWM為80時轉速數據

          圖12 PWM為255時轉速數據

          圖11和圖12中的串口輸出數據看起來沒有圖形那么直觀,為此我們使用LabVIEW2012和VISA 5.3編寫一個轉速顯示程序。前面板如圖13所示,程序框圖如圖14所示,其中的數據解析子VI的程序框圖如圖15所示,其功能是解析出串口數據中的轉速值和PWM值。

          除了上位機顯示程序之外,我們還需要對轉速的比例控制程序進行部分修改,具體如下:

          Serial.print( lTemp);//發(fā)送轉速數據

          修改為

          if((lTemp/100) ==0)

          {

          Serial.print( 0);

          if((lTemp0/10) == 0)

          Serial.print( 0);

          }

          Serial.print( lTemp);

          Serial.println(output_value);//發(fā)送PWM數據

          修改為

          if((output_value /100) ==0)

          {

          Serial.print( 0);

          if((output_value 0/10) == 0)

          Serial.print( 0);

          }

          Serial.print(output_value);

          圖13 LabVIEW上位機前面板

          圖14 LabVIEW上位機程序框圖

          圖15數據解析程序框圖

          在LabVIEW上位機軟件上選擇Arduino Uno控制器對應的串口號,即可將電機的轉速和PWM值實時的顯示在LabVIEW前面板上,如圖16所示。

          圖16轉速和PWM顯示在LabVIEW上位機上


          上一頁 1 2 3 下一頁

          評論


          技術專區(qū)

          關閉