
圖10PD控制基本原理
3.2轉速比例控制的程序設計
實(shí)現了電機轉速的測量,下面就要對電機轉速進(jìn)行比例控制了。為了提高控制系統響應的速度,將程序代碼2轉速測量程序中的定時(shí)時(shí)間更改為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的三個(gè)管腳,全部設置為輸出狀態(tài)
digitalWrite(9, LOW);//松開(kāi)電機A的制動(dòng)
digitalWrite(12, HIGH);//設置方向為正向旋轉
Serial.begin(115200);//初始化波特率為115200
attachInterrupt(0, counter, RISING);//設置編碼器A相位上升沿中斷
attachInterrupt(1, counter, RISING);//設置編碼器B相位上升沿中斷
Timer1.initialize(10000); //設置定時(shí)器中斷時(shí)間,單位微秒
Timer1.attachInterrupt( timerIsr ); //打開(kāi)定時(shí)器中斷
interrupts();//打開(kāi)外部中斷
}
void loop()
{
long lTemp = 0; //定義臨時(shí)存儲數據變量
if(j==1)//判斷是否發(fā)生定時(shí)器中斷,即定時(shí)時(shí)間是否到達
{
j=0;//清除定時(shí)器中斷標志位
if((CurCnt&0x01) == 0) //當前使用的是偶數計數器,則上次頻率值存放在第二個(gè)元素中
{
lTemp = counter_val[1];//讀取數組第二個(gè)元素中的數值
counter_val[1]=0;//讀完清除原來(lái)的數值,以便下次使用
}
else//當前使用的是奇數計數器,則上次頻率值存放在第一個(gè)元素中
{
lTemp = counter_val[0];//讀取數組第二個(gè)元素中的數值
counter_val[0]=0;//讀完清除原來(lái)的數值,以便下次使用
}
Serial.print("A");//發(fā)送轉速幀頭大寫(xiě)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幀頭大寫(xiě)B
Serial.println(output_value);//發(fā)送PWM數據
}
}
//外部中斷處理函數
void counter()
{
counter_val[CurCnt& 0x01] += 1;//每一個(gè)中斷加一
}
//定時(shí)器中斷處理函數
void timerIsr()
{
j=1;//定時(shí)時(shí)間達到標志
CurCnt++; //切換計數數組
}
通過(guò)串口輸出的電機實(shí)際轉速與PWM值的數據如圖11和圖12所示。其中圖11為系統剛啟動(dòng)的時(shí)候,此時(shí)可以看出電機逐漸上升,達到128之后逐漸降至100以下,這屬于系統初期的振蕩;圖12是系統運行一段時(shí)間之后的轉速和PWM數據,轉速穩定在100±2,PWM穩定在145左右。

圖11 PWM為80時(shí)轉速數據

圖12 PWM為255時(shí)轉速數據
圖11和圖12中的串口輸出數據看起來(lái)沒(méi)有圖形那么直觀(guān),為此我們使用LabVIEW2012和VISA 5.3編寫(xiě)一個(gè)轉速顯示程序。前面板如圖13所示,程序框圖如圖14所示,其中的數據解析子VI的程序框圖如圖15所示,其功能是解析出串口數據中的轉速值和PWM值。
除了上位機顯示程序之外,我們還需要對轉速的比例控制程序進(jìn)行部分修改,具體如下:
將
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值實(shí)時(shí)的顯示在LabVIEW前面板上,如圖16所示。

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