新聞中心

        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ò) 收藏

        圖10PD控制基本原理

        3.2轉(zhuǎn)速比例控制的程序設(shè)計(jì)

        實(shí)現(xiàn)了電機(jī)轉(zhuǎn)速的測(cè)量,下面就要對(duì)電機(jī)轉(zhuǎn)速進(jìn)行比例控制了。為了提高控制系統(tǒng)響應(yīng)的速度,將程序代碼2轉(zhuǎn)速測(cè)量程序中的定時(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的制動(dòng)

        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í)存儲(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("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) //限制PWM在0-255范圍內(nèi)

        output_value =255;

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

        output_value =0;

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

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

        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ù)組

        }

        通過(guò)串口輸出的電機(jī)實(shí)際轉(zhuǎn)速與PWM值的數(shù)據(jù)如圖11和圖12所示。其中圖11為系統(tǒng)剛啟動(dò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 PWM為80時(shí)轉(zhuǎn)速數(shù)據(jù)

        圖12 PWM為255時(shí)轉(zhuǎn)速數(shù)據(jù)

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

        除了上位機(jī)顯示程序之外,我們還需要對(duì)轉(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控制器對(duì)應(yīng)的串口號(hào),即可將電機(jī)的轉(zhuǎn)速和PWM值實(shí)時(shí)的顯示在LabVIEW前面板上,如圖16所示。

        圖16轉(zhuǎn)速和PWM顯示在LabVIEW上位機(jī)上


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

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 象州县| 娄烦县| 无为县| 崇左市| 景德镇市| 洮南市| 白银市| 怀化市| 岗巴县| 新郑市| 金堂县| 城口县| 富川| 恭城| 铁岭县| 永登县| 资兴市| 浦县| 彭泽县| 临泉县| 桐乡市| 黑山县| 西乌珠穆沁旗| 利津县| 家居| 翁源县| 乐都县| 汝城县| 玉屏| 石城县| 新邵县| 盐池县| 乐清市| 凤冈县| 蓝田县| 新和县| 定兴县| 丹东市| 河间市| 台中市| 翁牛特旗|