標(biāo)題: PID控制算法的C語(yǔ)言實(shí)現(xiàn)一PID算法原理,離散化,位置型增量型 積分分離 梯形積分PID實(shí)現(xiàn) [打印本頁(yè)]

作者: 安慰獎(jiǎng)蜂王漿    時(shí)間: 2018-10-9 19:33
標(biāo)題: PID控制算法的C語(yǔ)言實(shí)現(xiàn)一PID算法原理,離散化,位置型增量型 積分分離 梯形積分PID實(shí)現(xiàn)
   最近兩天在考慮一般控制算法的C語(yǔ)言實(shí)現(xiàn)問(wèn)題,發(fā)現(xiàn)網(wǎng)絡(luò)上尚沒有一套完整的比較體系的講解。于是總結(jié)了幾天,整理一套思路分享給大家。

   在工業(yè)應(yīng)用中PID及其衍生算法是應(yīng)用最廣泛的算法之一,是當(dāng)之無(wú)愧的萬(wàn)能算法,如果能夠熟練掌握PID算法的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程,對(duì)于一般的研發(fā)人員來(lái)講,應(yīng)該是足夠應(yīng)對(duì)一般研發(fā)問(wèn)題了,而難能可貴的是,在我所接觸的控制算法當(dāng)中,PID控制算法又是最簡(jiǎn)單,最能體現(xiàn)反饋思想的控制算法,可謂經(jīng)典中的經(jīng)典。經(jīng)典的未必是復(fù)雜的,經(jīng)典的東西常常是簡(jiǎn)單的,而且是最簡(jiǎn)單的,想想牛頓的力學(xué)三大定律吧,想想愛因斯坦的質(zhì)能方程吧,何等的簡(jiǎn)單!簡(jiǎn)單的不是原始的,簡(jiǎn)單的也不是落后的,簡(jiǎn)單到了美的程度。先看看PID算法的一般形式:

   PID的流程簡(jiǎn)單到了不能再簡(jiǎn)單的程度,通過(guò)誤差信號(hào)控制被控量,而控制器本身就是比例、積分、微分三個(gè)環(huán)節(jié)的加和。這里我們規(guī)定(在t時(shí)刻):
   1.輸入量為rin(t);
   2.輸出量為rout(t);
   3.偏差量為err(t)=rin(t)-rout(t);
   pid的控制規(guī)律為

   理解一下這個(gè)公式,主要從下面幾個(gè)問(wèn)題著手,為了便于理解,把控制環(huán)境具體一下:
   1.規(guī)定這個(gè)流程是用來(lái)為直流電機(jī)調(diào)速的;
   2.輸入量rin(t)為電機(jī)轉(zhuǎn)速預(yù)定值;
   3.輸出量rout(t)為電機(jī)轉(zhuǎn)速實(shí)際值;
   4.執(zhí)行器為直流電機(jī);
   5.傳感器為光電碼盤,假設(shè)碼盤為10線;
   6.直流電機(jī)采用PWM調(diào)速 轉(zhuǎn)速用單位 轉(zhuǎn)/min 表示;
  不難看出以下結(jié)論:
   1.輸入量rin(t)為電機(jī)轉(zhuǎn)速預(yù)定值(轉(zhuǎn)/min);
   2. 輸出量rout(t)為電機(jī)轉(zhuǎn)速實(shí)際值(轉(zhuǎn)/min);
   3.偏差量為預(yù)定值和實(shí)際值之差(轉(zhuǎn)/min);
   那么以下幾個(gè)問(wèn)題需要弄清楚:
   1.通過(guò)PID環(huán)節(jié)之后的U(t)是什么值呢?
   2.控制執(zhí)行器(直流電機(jī))轉(zhuǎn)動(dòng)轉(zhuǎn)速應(yīng)該為電壓值(也就是PWM占空比)。
   3.那么U(t)與PWM之間存在怎樣的聯(lián)系呢?
(見附錄1)這篇文章上給出了一種方法,即,每個(gè)電壓對(duì)應(yīng)一個(gè)轉(zhuǎn)速,電壓和轉(zhuǎn)速之間呈現(xiàn)線性關(guān)系。但是我考慮這種方法的前提是把直流電機(jī)的特性理解為線性了,而實(shí)際情況下,直流電機(jī)的特性絕對(duì)不是線性的,或者說(shuō)在局部上是趨于線性的,這就是為什么說(shuō)PID調(diào)速有個(gè)范圍的問(wèn)題。具體看一下(見附錄2)這篇文章就可以了解了。所以在正式進(jìn)行調(diào)速設(shè)計(jì)之前,需要現(xiàn)有開環(huán)系統(tǒng),測(cè)試電機(jī)和轉(zhuǎn)速之間的特性曲線(或者查閱電機(jī)的資料說(shuō)明),然后再進(jìn)行閉環(huán)參數(shù)整定。這篇先寫到這,下一篇說(shuō)明連續(xù)系統(tǒng)的離散化問(wèn)題。并根據(jù)離散化后的特點(diǎn)講述位置型PID和增量型PID的用法和C語(yǔ)言實(shí)現(xiàn)過(guò)程。

PID控制算法的C語(yǔ)言實(shí)現(xiàn)二 PID算法的離散化   
上一節(jié)中,我論述了PID算法的基本形式,并對(duì)其控制過(guò)程的實(shí)現(xiàn)有了一個(gè)簡(jiǎn)要的說(shuō)明,通過(guò)上一節(jié)的總結(jié),基本已經(jīng)可以明白PID控制的過(guò)程。這一節(jié)中先繼續(xù)上一節(jié)內(nèi)容補(bǔ)充說(shuō)明一下。

   1.說(shuō)明一下反饋控制的原理,通過(guò)上一節(jié)的框圖不難看出,PID控制其實(shí)是對(duì)偏差的控制過(guò)程;
   2.如果偏差為0,則比例環(huán)節(jié)不起作用,只有存在偏差時(shí),比例環(huán)節(jié)才起作用。
   3.積分環(huán)節(jié)主要是用來(lái)消除靜差,所謂靜差,就是系統(tǒng)穩(wěn)定后輸出值和設(shè)定值之間的差值,積分環(huán)節(jié)實(shí)際上就是偏差累計(jì)的過(guò)程,把累計(jì)的誤差加到原有系統(tǒng)上以抵消系統(tǒng)造成的靜差。
   4.而微分信號(hào)則反應(yīng)了偏差信號(hào)的變化規(guī)律,或者說(shuō)是變化趨勢(shì),根據(jù)偏差信號(hào)的變化趨勢(shì)來(lái)進(jìn)行超前調(diào)節(jié),從而增加了系統(tǒng)的快速性。
   好了,關(guān)于PID的基本說(shuō)明就補(bǔ)充到這里,下面將對(duì)PID連續(xù)系統(tǒng)離散化,從而方便在處理器上實(shí)現(xiàn)。下面把連續(xù)狀態(tài)的公式再貼一下:

   假設(shè)采樣間隔為T,則在第K T時(shí)刻:
偏差err(K)=rin(K)-rout(K);
積分環(huán)節(jié)用加和的形式表示,即err(K)+err(K+1)+……;
微分環(huán)節(jié)用斜率的形式表示,即[err(K)-err(K-1)]/T;
從而形成如下PID離散表示形式:

則u(K)可表示成為:

至于說(shuō)Kp、Ki、Kd三個(gè)參數(shù)的具體表達(dá)式,我想可以輕松的推出了,這里節(jié)省時(shí)間,不再詳細(xì)表示了。
其實(shí)到這里為止,PID的基本離散表示形式已經(jīng)出來(lái)了。目前的這種表述形式屬于位置型PID,另外一種表述方式為增量式PID,由U上述表達(dá)式可以輕易得到:

那么:

這就是離散化PID的增量式表示方式,由公式可以看出,增量式的表達(dá)結(jié)果和最近三次的偏差有關(guān),這樣就大大提高了系統(tǒng)的穩(wěn)定性。需要注意的是最終的輸出結(jié)果應(yīng)該為
       u(K)+增量調(diào)節(jié)值;
PID的離散化過(guò)程基本思路就是這樣,下面是將離散化的公式轉(zhuǎn)換成為C語(yǔ)言,從而實(shí)現(xiàn)微控制器的控制作用。


PID控制算法的C語(yǔ)言實(shí)現(xiàn)三 位置型PID的C語(yǔ)言實(shí)現(xiàn)   

上一節(jié)中已經(jīng)抽象出了位置性PID和增量型PID的數(shù)學(xué)表達(dá)式,這一節(jié),重點(diǎn)講解C語(yǔ)言代碼的實(shí)現(xiàn)過(guò)程,算法的C語(yǔ)言實(shí)現(xiàn)過(guò)程具有一般性,通過(guò)PID算法的C語(yǔ)言實(shí)現(xiàn),可以以此類推,設(shè)計(jì)其它算法的C語(yǔ)言實(shí)現(xiàn)。

   第一步:定義PID變量結(jié)構(gòu)體,代碼如下:
struct _pid{
    float SetSpeed;            //定義設(shè)定值
    float ActualSpeed;        //定義實(shí)際值
    float err;                //定義偏差值
    float err_last;            //定義上一個(gè)偏差值
    float Kp,Ki,Kd;            //定義比例、積分、微分系數(shù)
    float voltage;          //定義電壓值(控制執(zhí)行器的變量)
    float integral;            //定義積分值
}pid;

控制算法中所需要用到的參數(shù)在一個(gè)結(jié)構(gòu)體中統(tǒng)一定義,方便后面的使用。
  第二部:初始化變量,代碼如下:
void PID_init(){
    printf("PID_init begin \n");
    pid.SetSpeed=0.0;
    pid.ActualSpeed=0.0;
    pid.err=0.0;
    pid.err_last=0.0;
    pid.voltage=0.0;
    pid.integral=0.0;
    pid.Kp=0.2;
    pid.Ki=0.015;
    pid.Kd=0.2;
    printf("PID_init end \n");
}

統(tǒng)一初始化變量,尤其是Kp,Ki,Kd三個(gè)參數(shù),調(diào)試過(guò)程當(dāng)中,對(duì)于要求的控制效果,可以通過(guò)調(diào)節(jié)這三個(gè)量直接進(jìn)行調(diào)節(jié)。
第三步:編寫控制算法,代碼如下:
float PID_realize(float speed){
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;
    pid.integral+=pid.err;
    pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
    pid.err_last=pid.err;
    pid.ActualSpeed=pid.voltage*1.0;
    return pid.ActualSpeed;
}

注意:這里用了最基本的算法實(shí)現(xiàn)形式,沒有考慮死區(qū)問(wèn)題,沒有設(shè)定上下限,只是對(duì)公式的一種直接的實(shí)現(xiàn),后面的介紹當(dāng)中還會(huì)逐漸的對(duì)此改進(jìn)。
   到此為止,PID的基本實(shí)現(xiàn)部分就初步完成了。下面是測(cè)試代碼:
int main(){
    printf("System begin \n");
    PID_init();
    int count=0;
    while(count<1000)
    {
        float speed=PID_realize(200.0);
        printf("%f\n",speed);
        count++;
    }
return 0;
}

下面是經(jīng)過(guò)1000次的調(diào)節(jié)后輸出的1000個(gè)數(shù)據(jù)(具體的參數(shù)整定過(guò)程就不說(shuō)明了,網(wǎng)上這種說(shuō)明非常多):


PID控制算法的C語(yǔ)言實(shí)現(xiàn)四 增量型PID的C語(yǔ)言實(shí)現(xiàn)
   上一節(jié)中介紹了最簡(jiǎn)單的位置型PID的實(shí)現(xiàn)手段,這一節(jié)主要講解增量式PID的實(shí)現(xiàn)方法,位置型和增量型PID的數(shù)學(xué)公式請(qǐng)參見我的系列文《PID控制算法的C語(yǔ)言實(shí)現(xiàn)二》中的講解。實(shí)現(xiàn)過(guò)程仍然是分為定義變量、初始化變量、實(shí)現(xiàn)控制算法函數(shù)、算法測(cè)試四個(gè)部分,詳細(xì)分類請(qǐng)參加《PID控制算法的C語(yǔ)言實(shí)現(xiàn)三》中的講解,這里直接給出代碼了。
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. struct _pid{
  4.     float SetSpeed;            //定義設(shè)定值
  5.     float ActualSpeed;        //定義實(shí)際值
  6.     float err;                //定義偏差值
  7.     float err_next;            //定義上一個(gè)偏差值
  8.     float err_last;            //定義最上前的偏差值
  9.     float Kp,Ki,Kd;            //定義比例、積分、微分系數(shù)
  10. }pid;

  11. void PID_init(){
  12.     pid.SetSpeed=0.0;
  13.     pid.ActualSpeed=0.0;
  14.     pid.err=0.0;
  15.     pid.err_last=0.0;
  16.     pid.err_next=0.0;
  17.     pid.Kp=0.2;
  18.     pid.Ki=0.015;
  19.     pid.Kd=0.2;
  20. }

  21. float PID_realize(float speed){
  22.     pid.SetSpeed=speed;
  23.     pid.err=pid.SetSpeed-pid.ActualSpeed;
  24.     float incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
  25.     pid.ActualSpeed+=incrementSpeed;
  26.     pid.err_last=pid.err_next;
  27.     pid.err_next=pid.err;
  28.     return pid.ActualSpeed;
  29. }

  30. int main(){
  31.     PID_init();
  32.     int count=0;
  33.     while(count<1000)
  34.     {
  35.         float speed=PID_realize(200.0);
  36.         printf("%f\n",speed);
  37.         count++;
  38.     }
  39.     return 0;
  40. }
復(fù)制代碼



PID控制算法的C語(yǔ)言實(shí)現(xiàn)五 積分分離的PID控制算法C語(yǔ)言實(shí)現(xiàn)   

通過(guò)三、四兩篇文章,基本上已經(jīng)弄清楚了PID控制算法的最常規(guī)的表達(dá)方法。在普通PID控制中,引入積分環(huán)節(jié)的目的,主要是為了消除靜差,提高控制精度。但是在啟動(dòng)、結(jié)束或大幅度增減設(shè)定時(shí),短時(shí)間內(nèi)系統(tǒng)輸出有很大的偏差,會(huì)造成PID運(yùn)算的積分積累,導(dǎo)致控制量超過(guò)執(zhí)行機(jī)構(gòu)可能允許的最大動(dòng)作范圍對(duì)應(yīng)極限控制量,從而引起較大的超調(diào),甚至是震蕩,這是絕對(duì)不允許的。

   為了克服這一問(wèn)題,引入了積分分離的概念,其基本思路是 當(dāng)被控量與設(shè)定值偏差較大時(shí),取消積分作用; 當(dāng)被控量接近給定值時(shí),引入積分控制,以消除靜差,提高精度。其具體實(shí)現(xiàn)代碼如下:
    pid.Kp=0.2;
    pid.Ki=0.04;
    pid.Kd=0.2;  //初始化過(guò)程


if(abs(pid.err)>200)
    {
    index=0;
    }else{
    index=1;
    pid.integral+=pid.err;
    }
    pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);    //算法具體實(shí)現(xiàn)過(guò)程


其它部分的代碼參見《PID控制算法的C語(yǔ)言實(shí)現(xiàn)三》中的講解,不再贅述。同樣采集1000個(gè)量,會(huì)發(fā)現(xiàn),系統(tǒng)到199所有的時(shí)間是原來(lái)時(shí)間的1/2,系統(tǒng)的快速性得到了提高。

PID控制算法的C語(yǔ)言實(shí)現(xiàn)六 抗積分飽和的PID控制算法C語(yǔ)言實(shí)現(xiàn)   

所謂的積分飽和現(xiàn)象是指如果系統(tǒng)存在一個(gè)方向的偏差,PID控制器的輸出由于積分作用的不斷累加而加大,從而導(dǎo)致執(zhí)行機(jī)構(gòu)達(dá)到極限位置,若控制器輸出U(k)繼續(xù)增大,執(zhí)行器開度不可能再增大,此時(shí)計(jì)算機(jī)輸出控制量超出了正常運(yùn)行范圍而進(jìn)入飽和區(qū)。一旦系統(tǒng)出現(xiàn)反向偏差,u(k)逐漸從飽和區(qū)退出。進(jìn)入飽和區(qū)越深則退出飽和區(qū)時(shí)間越長(zhǎng)。在這段時(shí)間里,執(zhí)行機(jī)構(gòu)仍然停留在極限位置而不隨偏差反向而立即做出相應(yīng)的改變,這時(shí)系統(tǒng)就像失控一樣,造成控制性能惡化,這種現(xiàn)象稱為積分飽和現(xiàn)象或積分失控現(xiàn)象。

    防止積分飽和的方法之一就是抗積分飽和法,該方法的思路是在計(jì)算u(k)時(shí),首先判斷上一時(shí)刻的控制量u(k-1)是否已經(jīng)超出了極限范圍: 如果u(k-1)>umax,則只累加負(fù)偏差; 如果u(k-1)<umin,則只累加正偏差。從而避免控制量長(zhǎng)時(shí)間停留在飽和區(qū)。直接貼出代碼,不懂的看看前面幾節(jié)的介紹。
struct _pid{
    float SetSpeed;            //定義設(shè)定值
    float ActualSpeed;        //定義實(shí)際值
    float err;                //定義偏差值
    float err_last;            //定義上一個(gè)偏差值
    float Kp,Ki,Kd;            //定義比例、積分、微分系數(shù)
    float voltage;            //定義電壓值(控制執(zhí)行器的變量)
    float integral;            //定義積分值
float umax;
float umin;
}pid;

void PID_init(){
    printf("PID_init begin \n");
    pid.SetSpeed=0.0;
    pid.ActualSpeed=0.0;
    pid.err=0.0;
    pid.err_last=0.0;
    pid.voltage=0.0;
    pid.integral=0.0;
    pid.Kp=0.2;
   pid.Ki=0.1;       //注意,和上幾次相比,這里加大了積分環(huán)節(jié)的值
    pid.Kd=0.2;
    pid.umax=400;
    pid.umin=-200;
    printf("PID_init end \n");
}
float PID_realize(float speed){
    int index;
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;

   if(pid.ActualSpeed>pid.umax)  //灰色底色表示抗積分飽和的實(shí)現(xiàn)
    {

       if(abs(pid.err)>200)      //藍(lán)色標(biāo)注為積分分離過(guò)程
        {
            index=0;
        }else{
            index=1;
            if(pid.err<0)
            {
              pid.integral+=pid.err;
            }
        }
    }else if(pid.ActualSpeed<pid.umin){
        if(abs(pid.err)>200)      //積分分離過(guò)程
        {
            index=0;
        }else{
            index=1;
            if(pid.err>0)
            {
            pid.integral+=pid.err;
            }
        }
    }else{
        if(abs(pid.err)>200)                    //積分分離過(guò)程
        {
            index=0;
        }else{
            index=1;
            pid.integral+=pid.err;
        }
    }

    pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);

    pid.err_last=pid.err;
    pid.ActualSpeed=pid.voltage*1.0;
    return pid.ActualSpeed;
}

最終的測(cè)試程序運(yùn)算結(jié)果如下,可以明顯的看出系統(tǒng)的穩(wěn)定時(shí)間相對(duì)前幾次來(lái)講縮短了不少。



PID控制算法的C語(yǔ)言實(shí)現(xiàn)七 梯形積分的PID控制算法C語(yǔ)言實(shí)現(xiàn)   先看一下梯形算法的積分環(huán)節(jié)公式

   作為PID控制律的積分項(xiàng),其作用是消除余差,為了盡量減小余差,應(yīng)提高積分項(xiàng)運(yùn)算精度,為此可以將矩形積分改為梯形積分,具體實(shí)現(xiàn)的語(yǔ)句為:
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral/2+pid.Kd*(pid.err-pid.err_last);  //梯形積分
其它函數(shù)請(qǐng)參見本系列教程六中的介紹
最后運(yùn)算的穩(wěn)定數(shù)據(jù)為:199.999878,較教程六中的199.9999390而言,精度進(jìn)一步提高。

PID控制算法的C語(yǔ)言實(shí)現(xiàn)八 變積分的PID控制算法C語(yǔ)言實(shí)現(xiàn)   變積分PID可以看成是積分分離的PID算法的更一般的形式。在普通的PID控制算法中,由于積分系數(shù)ki是常數(shù),所以在整個(gè)控制過(guò)程中,積分增量是不變的。但是,系統(tǒng)對(duì)于積分項(xiàng)的要求是,系統(tǒng)偏差大時(shí),積分作用應(yīng)該減弱甚至是全無(wú),而在偏差小時(shí),則應(yīng)該加強(qiáng)。積分系數(shù)取大了會(huì)產(chǎn)生超調(diào),甚至積分飽和,取小了又不能短時(shí)間內(nèi)消除靜差。因此,根據(jù)系統(tǒng)的偏差大小改變積分速度是有必要的。
   變積分PID的基本思想是設(shè)法改變積分項(xiàng)的累加速度,使其與偏差大小相對(duì)應(yīng):偏差越大,積分越慢; 偏差越小,積分越快。
   這里給積分系數(shù)前加上一個(gè)比例值index:
   當(dāng)abs(err)<180時(shí),index=1;
   當(dāng)180<abs(err)<200時(shí),index=(200-abs(err))/20;
   當(dāng)abs(err)>200時(shí),index=0;
   最終的比例環(huán)節(jié)的比例系數(shù)值為ki*index;
   具體PID實(shí)現(xiàn)代碼如下:
    pid.Kp=0.4;
    pid.Ki=0.2;    //增加了積分系數(shù)
    pid.Kd=0.2;


   float PID_realize(float speed){
    float index;
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;

    if(abs(pid.err)>200)           //變積分過(guò)程
    {
    index=0.0;
    }else if(abs(pid.err)<180){
    index=1.0;
    pid.integral+=pid.err;
    }else{
    index=(200-abs(pid.err))/20;
    pid.integral+=pid.err;
    }
    pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);

    pid.err_last=pid.err;
    pid.ActualSpeed=pid.voltage*1.0;
    return pid.ActualSpeed;
}

最終結(jié)果可以看出,系統(tǒng)的穩(wěn)定速度非常快(測(cè)試程序參見本系列教程3):



數(shù)據(jù)見附件

PID控制算法的C語(yǔ)言實(shí)現(xiàn)九 專家PID與模糊PID的C語(yǔ)言實(shí)現(xiàn)   本節(jié)是PID控制算法的C語(yǔ)言實(shí)現(xiàn)系列的最后一節(jié),前面8節(jié)中,已經(jīng)分別從PID的實(shí)現(xiàn)到深入的過(guò)程進(jìn)行了一個(gè)簡(jiǎn)要的講解,從前面的講解中不難看出,PID的控制思想非常簡(jiǎn)單,其主要問(wèn)題點(diǎn)和難點(diǎn)在于比例、積分、微分環(huán)節(jié)上的參數(shù)整定過(guò)程,對(duì)于執(zhí)行器控制模型確定或者控制模型簡(jiǎn)單的系統(tǒng)而言,參數(shù)的整定可以通過(guò)計(jì)算獲得,對(duì)于一般精度要求不是很高的執(zhí)行器系統(tǒng),可以采用拼湊的方法進(jìn)行實(shí)驗(yàn)型的整定。
   然而,在實(shí)際的控制系統(tǒng)中,線性系統(tǒng)畢竟是少數(shù),大部分的系統(tǒng)屬于非線性系統(tǒng),或者說(shuō)是系統(tǒng)模型不確定的系統(tǒng),如果控制精度要求較高的話,那么對(duì)于參數(shù)的整定過(guò)程是有難度的。專家PID和模糊PID就是為滿足這方面的需求而設(shè)計(jì)的。專家算法和模糊算法都?xì)w屬于智能算法的范疇,智能算法最大的優(yōu)點(diǎn)就是在控制模型未知的情況下,可以對(duì)模型進(jìn)行控制。這里需要注意的是,專家PID也好,模糊PID也罷,絕對(duì)不是專家系統(tǒng)或模糊算法與PID控制算法的簡(jiǎn)單加和,他是專家系統(tǒng)或者模糊算法在PID控制器參數(shù)整定上的應(yīng)用。也就是說(shuō),智能算法是輔助PID進(jìn)行參數(shù)整定的手段。
   其實(shí)在前面幾節(jié)的講述中,已經(jīng)用到了專家PID的一些特例行為了,從第五節(jié)到第八節(jié)都是專家系統(tǒng)一些特列化的算法,對(duì)某些條件進(jìn)行了局部的判定,比如如果偏差太大的話,就去除積分項(xiàng),這本身就是含有經(jīng)驗(yàn)的專家系統(tǒng)。
   專家系統(tǒng)、模糊算法,需要參數(shù)整定就一定要有整定的依據(jù),也就是說(shuō)什么情況下整定什么值是要有依據(jù)的,這個(gè)依據(jù)是一些邏輯的組合,只要找出其中的邏輯組合關(guān)系來(lái),這些依據(jù)就再明顯不過(guò)了。下面先說(shuō)一下專家PID的C語(yǔ)言實(shí)現(xiàn)。正如前面所說(shuō),需要找到一些依據(jù),還得從PID系數(shù)本身說(shuō)起。
   1.比例系數(shù)Kp的作用是加快系統(tǒng)的響應(yīng)速度,提高系統(tǒng)的調(diào)節(jié)精度。Kp越大,系統(tǒng)的響應(yīng)速度越快,系統(tǒng)的調(diào)節(jié)精度越高,但是容易產(chǎn)生超調(diào),甚至?xí)瓜到y(tǒng)不穩(wěn)定。Kp取值過(guò)小,則會(huì)降低調(diào)節(jié)精度,使響應(yīng)速度緩慢,從而延長(zhǎng)調(diào)節(jié)時(shí)間,是系統(tǒng)靜態(tài)、動(dòng)態(tài)特性變差;
   2.積分作用系數(shù)Ki的作用是消除系統(tǒng)的穩(wěn)態(tài)誤差。Ki越大,系統(tǒng)的靜態(tài)誤差消除的越快,但是Ki過(guò)大,在響應(yīng)過(guò)程的初期會(huì)產(chǎn)生積分飽和的現(xiàn)象,從而引起響應(yīng)過(guò)程的較大超調(diào)。若Ki過(guò)小,將使系統(tǒng)靜態(tài)誤差難以消除,影響系統(tǒng)的調(diào)節(jié)精度;
   3.微分系數(shù)Kd的作用是改善系統(tǒng)的動(dòng)態(tài)特性,其作用主要是在響應(yīng)過(guò)程中抑制偏差向任何方向的變化,對(duì)偏差變化進(jìn)行提前預(yù)報(bào)。但是kd過(guò)大,會(huì)使響應(yīng)過(guò)程提前制動(dòng),從而延長(zhǎng)調(diào)節(jié)時(shí)間,而且會(huì)降低系統(tǒng)的抗干擾性。
   反應(yīng)系統(tǒng)性能的兩個(gè)參數(shù)是系統(tǒng)誤差e誤差變化律ec,這點(diǎn)還是好理解的:
    首先我們規(guī)定一個(gè)誤差的極限值,假設(shè)為Mmax;規(guī)定一個(gè)誤差的比較大的值,假設(shè)為Mmid;規(guī)定一個(gè)誤差的較小值,假設(shè)為Mmin;
   當(dāng)abs(e)>Mmax時(shí),說(shuō)明誤差的絕對(duì)值已經(jīng)很大了,不論誤差變化趨勢(shì)如何,都應(yīng)該考慮控制器的輸入應(yīng)按最大(或最。┹敵觯赃_(dá)到迅速調(diào)整誤差的效果,使誤差絕對(duì)值以最大的速度減小。此時(shí),相當(dāng)于實(shí)施開環(huán)控制。
   當(dāng)e*ec>0時(shí),說(shuō)明誤差在朝向誤差絕對(duì)值增大的方向變化,此時(shí),如果abs(e)>Mmid,說(shuō)明誤差也較大,可考慮由控制器實(shí)施較強(qiáng)的控制作用,以達(dá)到扭轉(zhuǎn)誤差絕對(duì)值向減小的方向變化,并迅速減小誤差的絕對(duì)值。此時(shí)如果abs(e)<Mmid,說(shuō)明盡管誤差是向絕對(duì)值增大的方向變化,但是誤差絕對(duì)值本身并不是很大,可以考慮控制器實(shí)施一般的控制作用,只需要扭轉(zhuǎn)誤差的變化趨勢(shì),使其向誤差絕對(duì)值減小的方向變化即可。
   當(dāng)e*err<0且e*err(k-1)>0或者e=0時(shí),說(shuō)明誤差的絕對(duì)值向減小的方向變化,或者已經(jīng)達(dá)到平衡狀態(tài),此時(shí)保持控制器輸出不變即可。
   當(dāng)e*err<0且e*err(k-1)<0時(shí),說(shuō)明誤差處于極限狀態(tài)。如果此時(shí)誤差的絕對(duì)值較大,大于Mmin,可以考慮實(shí)施較強(qiáng)控制作用。如果此時(shí)誤差絕對(duì)值較小,可以考慮實(shí)施較弱控制作用。
   當(dāng)abs(e)<Mmin時(shí),說(shuō)明誤差絕對(duì)值很小,此時(shí)加入積分,減小靜態(tài)誤差。
上面的邏輯判斷過(guò)程,實(shí)際上就是對(duì)于控制系統(tǒng)的一個(gè)專家判斷過(guò)程。(未完待續(xù))

PID控制算法的C語(yǔ)言實(shí)現(xiàn)十 模糊算法簡(jiǎn)介  
在PID控制算法的C語(yǔ)言實(shí)現(xiàn)九中,文章已經(jīng)對(duì)模糊PID的實(shí)質(zhì)做了一個(gè)簡(jiǎn)要說(shuō)明。本來(lái)打算等到完成畢業(yè)設(shè)計(jì),工作穩(wěn)定了再著力完成剩下的部分。鑒于網(wǎng)友的要求和信任,抽出時(shí)間來(lái),對(duì)模糊PID做一個(gè)較為詳細(xì)的論述,這里我不打算做出仿真程序了,但就基本概念和思路進(jìn)行一下說(shuō)明,相信有C語(yǔ)言基礎(chǔ)的朋友可以通過(guò)這些介紹性的文字自行實(shí)現(xiàn)。這篇文章主要說(shuō)明一下模糊算法的含義和原理。

  實(shí)際上模糊算法屬于智能算法,智能算法也可以叫非模型算法,也就是說(shuō),當(dāng)我們對(duì)于系統(tǒng)的模型認(rèn)識(shí)不是很深刻,或者說(shuō)客觀的原因?qū)е挛覀儫o(wú)法對(duì)系統(tǒng)的控制模型進(jìn)行深入研究的時(shí)候,智能算法常常能夠起到不小的作用。這點(diǎn)是方便理解的,如果一個(gè)系統(tǒng)的模型可以輕易的獲得,那么就可以根據(jù)系統(tǒng)的模型進(jìn)行模型分析,設(shè)計(jì)出適合系統(tǒng)模型的控制器。但是現(xiàn)實(shí)世界中,可以說(shuō)所有的系統(tǒng)都是非線性的,是不可預(yù)測(cè)的。但這并不是說(shuō)我們就無(wú)從建立控制器,因?yàn)椋蟛糠值南到y(tǒng)在一定的條件和范圍內(nèi)是可以抽象成為線性系統(tǒng)的。問(wèn)題的關(guān)鍵是,當(dāng)我們系統(tǒng)設(shè)計(jì)的范圍超出了線性的范圍,我們又該如何處理。顯然,智能算法是一條很不錯(cuò)的途徑。智能算法包含了專家系統(tǒng)、模糊算法、遺傳算法、神經(jīng)網(wǎng)絡(luò)算法等。其實(shí)這其中的任何一種算法都可以跟PID去做結(jié)合,而選擇的關(guān)鍵在于,處理的實(shí)時(shí)性能不能得到滿足。當(dāng)我們處理器的速度足夠快速時(shí),我們可以選擇更為復(fù)雜的、精度更加高的算法。但是,控制器的處理速度限制了我們算法的選擇。當(dāng)然,成本是限制處理器速度最根本的原因。這個(gè)道理很簡(jiǎn)單,51單片機(jī)和DSP的成本肯定大不相同。專家PID和模糊PID是常用的兩種PID選擇方式。其實(shí),模糊PID適應(yīng)一般的控制系統(tǒng)是沒有問(wèn)題。文章接下來(lái)將說(shuō)明模糊算法的一些基本常識(shí)。
  模糊算法其實(shí)并不模糊。模糊算法其實(shí)也是逐次求精的過(guò)程。這里舉個(gè)例子說(shuō)明。我們?cè)O(shè)計(jì)一個(gè)倒立擺系統(tǒng),假如擺針偏差<5°,我們說(shuō)它的偏差比較“小”;擺針偏差在5°和10°之間,我們說(shuō)它的偏差處于“中”的狀態(tài);當(dāng)擺針偏差>10°的時(shí)候,我們說(shuō)它的偏差有點(diǎn)兒“大”了。對(duì)于“小”、“中”、“大”這樣的詞匯來(lái)講,他們是精確的表述,可問(wèn)題是如果擺針偏差是3°呢,那么這是一種什么樣的狀態(tài)呢。我們可以用“很小”來(lái)表述它。如果是7°呢,可以說(shuō)它是“中”偏“小”。那么如果到了80°呢,它的偏差可以說(shuō)“非常大”。而我們調(diào)節(jié)的過(guò)程實(shí)際上就是讓系統(tǒng)的偏差由非!按蟆敝饾u向非!靶 边^(guò)度的過(guò)程。當(dāng)然,我們系統(tǒng)這個(gè)調(diào)節(jié)過(guò)程是快速穩(wěn)定的。通過(guò)上面的說(shuō)明,可以認(rèn)識(shí)到,其實(shí)對(duì)于每一種狀態(tài)都可以劃分到大、中、小三個(gè)狀態(tài)當(dāng)中去,只不過(guò)他們隸屬的程度不太一樣,比如6°隸屬于小的程度可能是0.3,隸屬于中的程度是0.7,隸屬于大的程度是0。這里實(shí)際上是有一個(gè)問(wèn)題的,就是這個(gè)隸屬的程度怎么確定?這就要求我們?nèi)ピO(shè)計(jì)一個(gè)隸屬函數(shù)。詳細(xì)內(nèi)容可以查閱相關(guān)的資料,這里沒有辦法那么詳細(xì)的說(shuō)明了。http://baike.baidu.com/view/150383.htm(見附錄3)這里面有些說(shuō)明。那么,知道了隸屬度的問(wèn)題,就可以根據(jù)目前隸屬的程度來(lái)控制電機(jī)以多大的速度和方向轉(zhuǎn)動(dòng)了,當(dāng)然,最終的控制量肯定要落實(shí)在控制電壓上。這點(diǎn)可以很容易的想想,我們控制的目的就是讓倒立擺從隸屬“大”的程度為1的狀態(tài),調(diào)節(jié)到隸屬“小”的程度為1的狀態(tài)。當(dāng)隸屬大多一些的時(shí)候,我們就加快調(diào)節(jié)的速度,當(dāng)隸屬小多一些的時(shí)候,我們就減慢調(diào)節(jié)的速度,進(jìn)行微調(diào)?蓡(wèn)題是,大、中、小的狀態(tài)是漢字,怎么用數(shù)字表示,進(jìn)而用程序代碼表示呢?其實(shí)我們可以給大、中、小三個(gè)狀態(tài)設(shè)定三個(gè)數(shù)字來(lái)表示,比如大表示用3表示,中用2表示,小用1表示。那么我們完全可以用1*0.3+2*0.7+3*0.0=1.7來(lái)表示它,當(dāng)然這個(gè)公式也不一定是這樣的,這個(gè)公式的設(shè)計(jì)是系統(tǒng)模糊化和精確化的一個(gè)過(guò)程,讀者也可參見相關(guān)文獻(xiàn)理解。但就1.7這個(gè)數(shù)字而言,可以說(shuō)明,目前6°的角度偏差處于小和中之間,但是更偏向于中。我們就可以根據(jù)這個(gè)數(shù)字來(lái)調(diào)節(jié)電機(jī)的轉(zhuǎn)動(dòng)速度和時(shí)間了。當(dāng)然,這個(gè)數(shù)字與電機(jī)轉(zhuǎn)速的對(duì)應(yīng)關(guān)系,也需要根據(jù)實(shí)際情況進(jìn)行設(shè)計(jì)和調(diào)節(jié)。
    前面一個(gè)例子已經(jīng)基本上說(shuō)明了模糊算法的基本原理了?墒菍(shí)際上,一個(gè)系統(tǒng)的限制因素常常不是一個(gè)。上面的例子中,只有偏差角度成為了系統(tǒng)調(diào)節(jié)的參考因素。而實(shí)際系統(tǒng)中,比如PID系統(tǒng),我們需要調(diào)節(jié)的是比例、積分、微分三個(gè)環(huán)節(jié),那么這三個(gè)環(huán)節(jié)的作用就需要我們認(rèn)清,也就是說(shuō),我們需要根據(jù)超調(diào)量、調(diào)節(jié)時(shí)間、震蕩情況等信息來(lái)考慮對(duì)這三個(gè)環(huán)節(jié)調(diào)節(jié)的比重,輸入量和輸出量都不是單一的,可是其中必然有某種內(nèi)在的邏輯聯(lián)系。所以這種邏輯聯(lián)系就成為我們?cè)O(shè)計(jì)工作的重點(diǎn)了。下一篇文章將詳細(xì)分析PID三個(gè)變量和系統(tǒng)性能參數(shù)之間的聯(lián)系。


PID控制算法的c語(yǔ)言實(shí)現(xiàn)十一(PID系列完結(jié)篇) 模糊PID的參數(shù)整定  
這幾天一直在考慮如何能夠把這一節(jié)的內(nèi)容說(shuō)清楚,對(duì)于PID而言應(yīng)用并沒有多大難度,按照基本的算法設(shè)計(jì)思路和成熟的參數(shù)整定方法,就算是沒有經(jīng)過(guò)特殊訓(xùn)練和培訓(xùn)的人,也能夠在較短的時(shí)間內(nèi)容學(xué)會(huì)使用PID算法?蓡(wèn)題是,如何能夠透徹的理解PID算法,從而能夠根據(jù)實(shí)際的情況設(shè)計(jì)出優(yōu)秀的算法呢。

  通過(guò)講述公式和基本原理肯定是最能說(shuō)明問(wèn)題的,可是這樣的話怕是犯了“專家”的錯(cuò)誤了。對(duì)于門檻比較低的技術(shù)人員來(lái)講,依然不能透徹理解?墒钦f(shuō)的入耳了,能不能透徹說(shuō)明也是一個(gè)問(wèn)題,所以斟酌了幾天,整理了一下思路才開始完成PID系列文章的最后一篇。
  我所說(shuō)的最后一篇不代表PID的功能和發(fā)展就止步與此,僅僅是說(shuō)明,透過(guò)這一些列的文章,基本上已經(jīng)可以涵蓋PID設(shè)計(jì)的要點(diǎn),至于更深入的研究,就交給有需要的讀者去做。
   上一節(jié)中大致講述了一下模糊算法。實(shí)際上模糊算法的很多概念在上一節(jié)中并沒有深入的解釋。舉的例子也只是為了說(shuō)明模糊算法的基本含義,真正的模糊算法是不能這么設(shè)計(jì)的,當(dāng)然也不會(huì)這么簡(jiǎn)單。模糊算法的核心是模糊規(guī)則,如果模糊規(guī)則制定的出色,那么模糊算法的控制效率就高。其實(shí)這是智能算法的一般特性,規(guī)則是系統(tǒng)判斷和處理的前提。那么就說(shuō)說(shuō)PID的規(guī)則該怎么制定。
   我們知道,模糊算法的本質(zhì)是對(duì)PID的三個(gè)參數(shù)進(jìn)行智能調(diào)節(jié)。那么首先要提出的問(wèn)題是如何對(duì)PID的參數(shù)進(jìn)行調(diào)節(jié)?這個(gè)問(wèn)題其實(shí)是參數(shù)整定的問(wèn)題,現(xiàn)實(shí)當(dāng)中有很多整定方法?墒俏覀冃枰獜母旧狭私鉃槭裁催@么整定,才能知道該如何建立數(shù)學(xué)模型進(jìn)行分析。那么要回答如何整定參數(shù)的問(wèn)題,就需要先明白PID參數(shù)的作用都是什么?對(duì)系統(tǒng)有什么影響?
  我們從作用和副作用兩個(gè)方面說(shuō)明參數(shù)對(duì)系統(tǒng)的影響。
   1.比例環(huán)節(jié)Kp,作用是加快系統(tǒng)的響應(yīng)速度,提高系統(tǒng)的調(diào)節(jié)精度,副作用是會(huì)導(dǎo)致超調(diào);
   2.積分環(huán)節(jié)Ki,作用是消除穩(wěn)態(tài)誤差,副作用是導(dǎo)致積分飽和現(xiàn)象;
   3.微分環(huán)節(jié)Kd,作用是改善系統(tǒng)的動(dòng)態(tài)性能,副作用是延長(zhǎng)系統(tǒng)的調(diào)節(jié)時(shí)間。
  理解了上述問(wèn)題,那么就可以“辯證施治,對(duì)癥下藥”了。比如說(shuō),如果系統(tǒng)響應(yīng)速度慢,我們就加大Kp的取值,如果超調(diào)量過(guò)大我們就減小Kp的取值等等?墒菃(wèn)題這些語(yǔ)言的描述該如何用數(shù)學(xué)形式表達(dá)出來(lái)呢。我們所知道的,反饋系統(tǒng)的實(shí)質(zhì)就是系統(tǒng)的輸出量作為反饋量與系統(tǒng)的輸入量進(jìn)行作差,從而得到系統(tǒng)的誤差e,那么這個(gè)誤差e就能夠反應(yīng)目前系統(tǒng)所處的狀態(tài)。誤差e可以表明目前系統(tǒng)的輸出狀態(tài)到底偏離要求多少。而誤差e的變化律ec,表示誤差變化的速度。這樣,我們可以根據(jù)這兩個(gè)量的狀態(tài)來(lái)分析三個(gè)參數(shù)此時(shí)應(yīng)該如何取值,假如e為負(fù)方向比較大,ec也為負(fù)方向增大狀態(tài),此時(shí)比例環(huán)節(jié)要大一些,從而加快調(diào)節(jié)速度,而積分環(huán)節(jié)要小一些,甚至不加積分環(huán)節(jié),從而防止負(fù)方向上出現(xiàn)飽和積分的現(xiàn)象。微分環(huán)節(jié)可以稍加一些,在不影響調(diào)節(jié)時(shí)間的情況下,起到改善系統(tǒng)動(dòng)態(tài)性能的作用。

附錄1
看到有不少人問(wèn)到底如何讓UK值與PWM占空比值對(duì)應(yīng),進(jìn)而實(shí)現(xiàn)占空比輸出和輸出控制電壓對(duì)應(yīng)。
(注意,我這里討論的前提是輸出控制的是電壓,不是PWM方波。PWM輸出后要經(jīng)過(guò)濾波整形再輸出控制。)
前提條件:
輸出電壓控制電壓范圍是0-10V。
給定、反饋、輸出電壓采樣輸入電壓范圍是0-5V(經(jīng)過(guò)運(yùn)放)。
使用單片機(jī)AD為10位AD芯片。
那么10位AD芯片電壓采集得到的數(shù)據(jù)范圍就是0-1024。
PWM為 8位可調(diào)占空比方波,0對(duì)應(yīng)輸出占空比為0的方波,255對(duì)應(yīng)輸出占空比100%的方波,127對(duì)應(yīng)輸出50%的方波。
比如當(dāng)前給定是2.5V,反饋電壓是1V。(KP,KI,KD等系數(shù)略,關(guān)于PID算法的整數(shù)實(shí)現(xiàn)我在前文中有論述如何實(shí)現(xiàn))。
那么經(jīng)過(guò)AD采樣
1、給定2.5V對(duì)應(yīng)為 512
2、反饋1V對(duì)應(yīng)為 205
假定經(jīng)過(guò)PID計(jì)算得到的UK為400
也就意味著輸出電壓應(yīng)當(dāng)為(400*(UPWM峰值電壓))/1024
那么UK對(duì)應(yīng)的PWM占空比是多少呢?
我們知道,UK=1024對(duì)應(yīng)占空比為100,也就是PWM的占空比系數(shù)為255?芍,PWM系數(shù) = UK/4;
那么400就應(yīng)當(dāng)對(duì)應(yīng)系數(shù) 400/4=100。
也就是輸出電壓=400*10/1024=3.9V
同時(shí),由于采樣精度以及PWM輸出占空比精度控制的問(wèn)題,將導(dǎo)致輸出電壓和期望值不是那么線性,所以,我在項(xiàng)目?jī)?nèi)加入了輸出電壓采樣的控制。
采樣AD輸入為0-5V,所以,對(duì)于輸出0-10V有一個(gè)縮小的比例。
輸出10V則采樣值對(duì)應(yīng)為255
輸出5V則采樣之對(duì)應(yīng)127
可知,3.9V對(duì)應(yīng)AD結(jié)果為97
采樣輸出電壓值,可以針對(duì)性的調(diào)整一下占空比輸出,從而得到誤差允許范圍內(nèi)的一個(gè)控制輸出電壓。
同時(shí),經(jīng)過(guò)一些加速控制的手段。可以比較迅速的達(dá)到控制的目的。
下文中的UK控制方法是針對(duì)增量式PID控制而來(lái)做的。
/****************************************************/
void    PWMProcess(void)
{
    uint16 idata temp;
    uint16 idata UKTemp;
temp = 0;
    UKTemp = 0;
    if( Pwm.ChangeFlag_Uint8 != 0 )   //判斷是否需要改變占空比
{                  //是否需要改變占空比和你的被控系統(tǒng)特性有關(guān)
     Pwm.ChangeFlag_Uint8 = 0;
  UKTemp = PID.Uk_Uint16 + SwIn.AddValue_Uint16;  
//計(jì)算UK控制量
//控制量和計(jì)算值以及一個(gè)開關(guān)量有關(guān),我這里的開關(guān)量是系統(tǒng)需要的時(shí)候疊加在控制量上的一個(gè)變量。
  if(UKTemp>999)
  {
            UKTemp = 999;
  }
//這里只所以是999封頂而不是1024是因?yàn)槲业南到y(tǒng)PWM的峰值電壓是12V導(dǎo)致。
        while(1)                        //如果輸出電壓和期望電壓相差 Delta,則繼續(xù)調(diào)整占空比,直到在誤差以內(nèi)
        {
      ADChPro(UPWMADCH);          //測(cè)量輸出電壓
   if( ADPool.Value_Uint16[UPWMADCH] == UKTemp)
   {
                return;
   }
   if( ADPool.Value_Uint16[UPWMADCH] > UKTemp)   //如果當(dāng)前電壓大于輸出電壓,減小占空比
   {
       if( ( ADPool.Value_Uint16[UPWMADCH] - UKTemp ) > UDELTA )
    {
        temp = ADPool.Value_Uint16[UPWMADCH] - UKTemp;  //
     temp = temp / 2;       //下降可以加速下降,所以下降參數(shù)加倍
     if( Pwm.DutyCycle_Uint8 > temp )
     {
                        Pwm.DutyCycle_Uint8 = Pwm.DutyCycle_Uint8 - temp;
     }
     else
     {
                        Pwm.DutyCycle_Uint8 = 0;
     }
    }
    else
    {
                    return;
    }
   }
   else           //如果當(dāng)前電壓小于輸出電壓
   {
       if( ( UKTemp - ADPool.Value_Uint16[UPWMADCH] ) > UDELTA )
    {
        temp = UKTemp - ADPool.Value_Uint16[UPWMADCH];
     temp = temp / 4;  //上升處理不要超調(diào),所以每次只+一半
     if( (255-Pwm.DutyCycle_Uint8) > temp )
     {
                        Pwm.DutyCycle_Uint8 += (temp/2);
     }
     else
     {
                        Pwm.DutyCycle_Uint8 = 255;
     }
    }
    else
    {
                    return;
    }
   }
            DisPlayVoltage();
            PWMChangeDuty(Pwm.DutyCycle_Uint8);  //改變占空比
   Delay(10,10);

        }
}
}
/*****************************************************/


附錄2
直流電機(jī)PWM調(diào)速系統(tǒng)中控制電壓非線性研究
引言
由于線性放大驅(qū)動(dòng)方式效率和散熱問(wèn)題嚴(yán)重,目前絕大多數(shù)直流電動(dòng)機(jī)采用開關(guān)驅(qū)動(dòng)方式。開關(guān)驅(qū)動(dòng)方式是半導(dǎo)體功率器件工作在開關(guān)狀態(tài),通過(guò)脈寬調(diào)制PWM控制電動(dòng)機(jī)電樞電壓,實(shí)現(xiàn)調(diào)速。目前已有許多文獻(xiàn)介紹直流電機(jī)調(diào)速,宋衛(wèi)國(guó)等用89C51單片機(jī)實(shí)現(xiàn)了直流電機(jī)閉環(huán)調(diào)速;張立勛等用AVR單片機(jī)實(shí)現(xiàn)了直流電機(jī)PWM調(diào)速;郭崇軍等用C8051實(shí)現(xiàn)了無(wú)刷直流電機(jī)控制;張紅娟等用PIC單片機(jī)實(shí)現(xiàn)了直流電機(jī)PWM調(diào)速;王晨陽(yáng)等用DSP實(shí)現(xiàn)了無(wú)刷直流電機(jī)控制。上述文獻(xiàn)對(duì)實(shí)現(xiàn)調(diào)速的硬件電路和軟件流程的設(shè)計(jì)有較詳細(xì)的描述,但沒有說(shuō)明具體的調(diào)壓調(diào)速方法,也沒有提及占空比與電機(jī)端電壓平均值之間的關(guān)系。在李維軍等基于單片機(jī)用軟件實(shí)現(xiàn)直流電機(jī)PWM調(diào)速系統(tǒng)中提到平均速度與占空比并不是嚴(yán)格的線性關(guān)系,在一般的應(yīng)用中,可以將其近似地看作線性關(guān)系。但沒有做深入的研究。本文通過(guò)實(shí)驗(yàn)驗(yàn)證,在不帶電機(jī)情況下,PWM波占空比與控制輸出端電壓平均值之間呈線性關(guān)系;在帶電機(jī)情況下,占空比與電機(jī)端電壓平均值滿足拋物線方程,能取得精確的控制。本文的電機(jī)閉環(huán)調(diào)速是運(yùn)用Matlab擬合的關(guān)系式通過(guò)PID控制算法實(shí)現(xiàn)。
1 系統(tǒng)硬件設(shè)計(jì)
本系統(tǒng)是基于TX-1C實(shí)驗(yàn)板上的AT89C52單片機(jī),調(diào)速系統(tǒng)的硬件原理圖如圖1所示,主要由AT89C52單片機(jī)、555振蕩電路、L298驅(qū)動(dòng)電路、光電隔離、霍爾元件測(cè)速電路、MAX 232電平轉(zhuǎn)換電路等組成。

圖1 閉環(huán)控制系統(tǒng)示意圖
2 系統(tǒng)軟件設(shè)計(jì)
系統(tǒng)采用模塊化設(shè)計(jì),軟件由1個(gè)主程序,3個(gè)中斷子程序,即外部中斷0、外部中斷1,定時(shí)器0子程序,PID算法子程序,測(cè)速子程序及發(fā)送數(shù)據(jù)到串口顯示子程序組成,主程序流程圖如圖2所示。外部中斷0通過(guò)比較直流電平與鋸齒波信號(hào)產(chǎn)生PWM波,外部中斷1用于對(duì)傳感器的脈沖計(jì)數(shù)。定時(shí)器0用于對(duì)計(jì)數(shù)脈沖定時(shí)。測(cè)得的轉(zhuǎn)速通過(guò)串口發(fā)送到上位機(jī)顯示,通過(guò)PID模塊調(diào)整轉(zhuǎn)速到設(shè)定值。本實(shí)驗(yàn)采用M/T法測(cè)速,它是同時(shí)測(cè)量檢測(cè)時(shí)間和在此檢測(cè)時(shí)間內(nèi)霍爾傳感器所產(chǎn)生的轉(zhuǎn)速脈沖信號(hào)的個(gè)數(shù)來(lái)確定轉(zhuǎn)速。由外部中斷1對(duì)霍爾傳感器脈沖計(jì)數(shù),同時(shí)起動(dòng)定時(shí)器0,當(dāng)計(jì)數(shù)個(gè)數(shù)到預(yù)定值2 000后,關(guān)定時(shí)器0,可得到計(jì)2 000個(gè)脈沖的計(jì)數(shù)時(shí)間,由式計(jì)算出轉(zhuǎn)速:
n=60f/K=60N/(KT) (1)
式中:n為直流電機(jī)的轉(zhuǎn)速;K為霍爾傳感器轉(zhuǎn)盤上磁鋼數(shù);f為脈沖頻率;N為脈沖個(gè)數(shù);T為采樣周期。

圖2 主程序流程圖
3 實(shí)驗(yàn)結(jié)果及原因分析
3.1 端電壓平均值與轉(zhuǎn)速關(guān)系
3.1.1 實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)用的是永磁穩(wěn)速直流電機(jī),型號(hào)是EG-530YD-2BH,額定轉(zhuǎn)速2 000~4 000 r/min,額定電壓12 V。電機(jī)在空載的情況下,測(cè)得的數(shù)據(jù)用Matlab做一次線性擬合,擬合的端電壓平均值與轉(zhuǎn)速關(guān)系曲線如圖3(a)所示。相關(guān)系數(shù)R-square:0.952 1。擬合曲線方程為:
y=0.001 852x+0.296 3 (2)
由式(2)可知,端電壓平均值與轉(zhuǎn)速可近似為線性關(guān)系,根椐此關(guān)系式,在已測(cè)得的轉(zhuǎn)速的情況下可以計(jì)算出當(dāng)前電壓。為了比較分析,同樣用Matlab做二次線性擬合,擬合的端電壓平均值與轉(zhuǎn)速關(guān)系曲線如圖3(b)所示。相關(guān)系數(shù)R-square:0.986 7。

圖3 端電壓平均值與轉(zhuǎn)速關(guān)系曲線圖
3.1.2 原因分析
比較圖3(a)可知,當(dāng)轉(zhuǎn)速在0~1 500 r/min和4 000~5 000 r/min,端電壓平均值與轉(zhuǎn)速間存在的非線性,用二次曲擬合如圖3(b)所示,擬合相關(guān)系數(shù)較高。由圖3(a)可見,當(dāng)電機(jī)轉(zhuǎn)速為0時(shí)電機(jī)兩端電壓平均值約為1.3 V。這是因?yàn)殡姍C(jī)處于靜止?fàn)顟B(tài)時(shí),摩擦力為靜摩擦力,靜摩擦力是非線性的。隨著外力的增加而增加,最大值發(fā)生在運(yùn)動(dòng)前的瞬間。電磁轉(zhuǎn)矩為負(fù)載制動(dòng)轉(zhuǎn)矩和空載制動(dòng)轉(zhuǎn)矩之和,由于本系統(tǒng)不帶負(fù)載,因此電磁轉(zhuǎn)矩為空載制動(dòng)轉(zhuǎn)矩?蛰d制動(dòng)轉(zhuǎn)矩與轉(zhuǎn)速之間此時(shí)是非線性的。電磁轉(zhuǎn)矩與電流成正比,電流又與電壓成正比,因此此時(shí)電壓與轉(zhuǎn)速之間是非線性的。
當(dāng)轉(zhuǎn)速在2 000~4 000 r/min線性關(guān)系較好,占空比的微小改變帶來(lái)的轉(zhuǎn)速改變較大,因此具有較好的調(diào)速性能。這是因?yàn)殡S著運(yùn)動(dòng)速度的增加,摩擦力成線性的增加,此時(shí)的摩擦力為粘性摩擦力。粘性摩擦是線性的,與速度成正比,空載制動(dòng)轉(zhuǎn)矩與速度成正比,也即電磁轉(zhuǎn)矩與電流成正比,電流又與電壓成正比,因此此時(shí)電壓與轉(zhuǎn)速之間是線性的。當(dāng)轉(zhuǎn)速大于4 000 r/min。由于超出了額定轉(zhuǎn)速所以線性度較差且調(diào)速性能較差。此時(shí)用二次曲線擬合結(jié)果較好,因?yàn)楫?dāng)電機(jī)高速旋轉(zhuǎn)時(shí),摩擦阻力小到可以忽略,此時(shí)主要受電機(jī)風(fēng)阻型負(fù)荷的影響,當(dāng)運(yùn)動(dòng)部件在氣體或液體中運(yùn)動(dòng)時(shí),其受到的摩擦阻力或摩擦阻力矩被稱為風(fēng)機(jī)型負(fù)荷。對(duì)同一物體,風(fēng)阻系數(shù)一般為固定值。阻力大小與速度的平方成正比。即空載制動(dòng)轉(zhuǎn)矩與速度的平方成正比,也即電磁轉(zhuǎn)矩與速度的平方成正比,電磁轉(zhuǎn)矩與電流成正比,電流又與電壓成正比,因此此時(shí)電壓與轉(zhuǎn)速之間是非線性的。
 3.2 占空比與端電壓平均值關(guān)系
3.2.1 實(shí)驗(yàn)結(jié)果
擬合占空比與端電壓平均值關(guān)系曲線如圖4所示。相關(guān)系數(shù)R-square:0.998 4。擬合曲線方程為:

圖4 占空比與端電壓平均值關(guān)系曲線圖
如圖4所示,占空比與端電壓平均值滿足拋物線方程。運(yùn)用積分分離的PID算法改變電機(jī)端電壓平均值,可以運(yùn)用此關(guān)系式改變占空比,從而實(shí)現(xiàn)了PWM調(diào)速。
用示波器分別測(cè)出電壓的頂端值Utop與底端值Ubase,端電壓平均值Uarg滿足關(guān)系式:

其中:α為占空比。
正是由于所測(cè)得的電機(jī)端電壓底端值Ubase不為0,所以得出的占空比與端電壓平均值之間關(guān)系曲線為拋物線。若將電機(jī)取下,直接測(cè)L298的out1與out2輸出電壓。所測(cè)得的電機(jī)端電壓底端值Ubase約為0,所得的占空比與端電壓平均值滿足線性關(guān)系,即令式(4)中Ubase為0,式(4)變?yōu)椋?/font>

3.2.2 原因分析
將電機(jī)取下后,直接測(cè)L298的輸出端之間的電壓,占空比與端電壓平均值滿足關(guān)系式(5),說(shuō)明整個(gè)硬件電路的設(shè)計(jì)以及軟件編程的正確性。從電機(jī)反電勢(shì)角度分析,當(dāng)直流電機(jī)旋轉(zhuǎn)時(shí),電樞導(dǎo)體切割氣隙磁場(chǎng),在電樞繞組中產(chǎn)生感應(yīng)電動(dòng)勢(shì)。由于感應(yīng)電動(dòng)勢(shì)方向與電流的方向相反,感應(yīng)電動(dòng)勢(shì)也即反電勢(shì)。直流電機(jī)的等效模型如圖5所示。圖5(a)表示電機(jī)工作在電動(dòng)機(jī)狀態(tài)。圖5(b)表示電機(jī)工作在發(fā)電機(jī)狀態(tài)。

圖5 直流電機(jī)等效電路
如圖5(a)所示,電壓平衡方程為:

式中:U為外加電壓;Ia為電樞電流;Ra為電樞繞組電阻;2△Ub為一對(duì)電刷接觸壓降,一般取2△Ub為0.5~2 V;Ea為電樞繞組內(nèi)的感應(yīng)電動(dòng)勢(shì)。電機(jī)空載時(shí),電樞電流可忽略不計(jì),即電流Ia為0?蛰d時(shí)的磁場(chǎng)由主磁極的勵(lì)磁磁動(dòng)勢(shì)單獨(dú)作用產(chǎn)生。給電機(jī)外加12 V的額定電壓,由(6)可得反電勢(shì):

以40%的占空比為例,電機(jī)端電壓Uab是測(cè)量中的電壓平均值Uarg,其值為8.34 V,測(cè)量中的電壓底端值Ubase約為7 V。由式(7)可得Ea的值范圍應(yīng)在6.34~7.84 V。由圖5(b)可見,此時(shí)Uab的值是測(cè)得的底端值Ubase即電機(jī)的電動(dòng)勢(shì)Ea為7 V。
當(dāng)PWM工作在低電平狀態(tài),直流電機(jī)不會(huì)立刻停止,會(huì)繼續(xù)旋轉(zhuǎn),電樞繞組切割氣隙磁場(chǎng),電機(jī)此時(shí)工作在發(fā)電機(jī)狀態(tài),產(chǎn)生感應(yīng)電動(dòng)勢(shì)E。

式中:Ce為電機(jī)電動(dòng)勢(shì)常數(shù);φ為每級(jí)磁通量。由于電機(jī)空載,所以圖5(b)中無(wú)法形成回路。用單片機(jī)仿真軟件Proteus可直觀的看出在PWM為低電平狀態(tài),電機(jī)處于減速狀態(tài)。低電平持續(xù)時(shí)間越長(zhǎng),電機(jī)減速量越大。正是由于在低電平期間,電機(jī)處于減速狀態(tài),由式(8)可知,Ce,φ均為不變量,轉(zhuǎn)速n的變化引起E的改變。此時(shí)Uab的值等于E的值。電機(jī)在低電平期間不斷的減速,由于PWM周期較短,本文中取20 ms,電機(jī)在低電平期間轉(zhuǎn)速還未減至0,PWM又變?yōu)楦唠娖搅。這樣,就使測(cè)得的Ubase值不為0。以40%的占空比為例,當(dāng)PWM工作在低電平狀態(tài),測(cè)得Ubase的值約為7 V。由式(8)可知,當(dāng)正占空比越大,轉(zhuǎn)速也就越大,同時(shí)減速時(shí)間越短,感應(yīng)電勢(shì)E的值越大。所以Ubase的值也就越大。
4 結(jié)語(yǔ)
重點(diǎn)分析了直流電機(jī)PWM調(diào)速過(guò)程中控制電壓的非線性,對(duì)非線性的影響因素做了詳細(xì)的分析。由于PWM在低電平期間電壓的底端值不為0,導(dǎo)致了占空比與電機(jī)端電壓平均值之間呈拋物線關(guān)系。因此,可用得出的拋物線關(guān)系式實(shí)現(xiàn)精確調(diào)速。本系統(tǒng)的非線性研究可為電機(jī)控制中非線性的進(jìn)一步研究提供依據(jù),在實(shí)際運(yùn)用中,可用于移動(dòng)機(jī)器人、飛行模擬機(jī)的精確控制。


附錄3隸屬函數(shù)(membership function),用于表征模糊集合的數(shù)學(xué)工具。對(duì)于普通集合A,它可以理解為某個(gè)論域U上的一個(gè)子集。為了描述論域U中任一元素u是否屬于集合A,通?梢杂0或1標(biāo)志。用0表示u不屬于A,而用1表示屬于A ,從而得到了U上的一個(gè)二值函數(shù)χA(u),它表征了U的元素u對(duì)普通集合的從屬關(guān)系,通常稱為A的特征函數(shù),為了描述元素u對(duì)U上的一個(gè)模糊集合的隸屬關(guān)系,由于這種關(guān)系的不分明性,它將用從區(qū)間[0,1]中所取的數(shù)值代替0,1這兩值來(lái)描述,記為(u),數(shù)值(u)表示元素隸屬于模糊集的程度,論域U上的函數(shù)μ即為模糊集的隸屬函數(shù),而(u)即為u對(duì)A的隸屬度。

完整的Word格式文檔51黑下載地址:
PID控制算法的C語(yǔ)言實(shí)現(xiàn)(完整版).doc (325 KB, 下載次數(shù): 153)



作者: admin    時(shí)間: 2018-10-10 18:19
好資料,51黑有你更精彩!!!
作者: lfy129977    時(shí)間: 2019-3-14 14:32
非常好的自了。
作者: quinn1994    時(shí)間: 2019-3-14 15:45
哇,樓主寫的太專業(yè)了!!贊
作者: gm388    時(shí)間: 2019-3-14 15:58
好詳細(xì)的資料
作者: 眉宇    時(shí)間: 2019-3-14 23:19
想學(xué)習(xí),可是看不到,等級(jí)不夠啊,還得需要多學(xué)習(xí)。

作者: peng2019    時(shí)間: 2019-3-21 10:49
非常贊,好
作者: fsjhs    時(shí)間: 2019-7-26 14:44
作者解釋的真心好
作者: 4646ret    時(shí)間: 2019-7-26 20:16
好資料。。。。。。。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1