工業PID控制方法的C語言實現詳解


1 典型環節的微分方程、傳遞函數及C語言實現方法
無論多麼複雜的系統,總是可以由簡單的子系統構成,分析典型環節的特點,其目的是爲了通過典型環節的特點分析更爲複雜的系統,實際工程應用中,真正完全通過理論的方式建立模型是非常困難的,實際的模型建立過程是一個複雜的過程,需要通過假設、驗證、參數實驗給定等多種手段分析完善模型內容,利用實驗獲取模型的方法又稱作系統辨識技術,在下一節中將重點講解。假設的過程,其實就是根據系統特點,綜合典型環節的過程。將不同的環節通過四則運算給予不同的參數進行運算,從而接近真實的模型。從這個角度上講,透徹理解典型環節的特點,無論對於理論分析系統,還是對於實際建立系統模型都具有重要的意義。

1.1 比例環節
比例環節是自然界普遍存在的一個環節,幾乎所有的系統必定存在比例環節。比例環節的特點在於輸入輸出量成正比例關係,沒有失真與延時。其微分方程可表示爲:c(t) = kr(t)。其傳遞函數可表示爲:G(s)=c(s)/R(s)。
對於比例環節而言,C語言實現相對比較簡單。下面進行C語言實現過程的說明。

float ProElement(float K, float GiveValue)
{
float  result;
result = K*GiveValue;
return result;
}

以上代碼用C語言實現了比例環節的處理。使用時直接定義一全局變量,例如float ResultValue; 然後直接調用該函數即可,例如 ResultValue = ProElement(0.1, 10);返回的ResultValue = 1.0。

1.2 慣性環節
慣性環節是自然界普遍存在的另一個環節,其存在的廣泛性不亞於比例環節,任何系統,只有時間精度足夠高,都必然存在一定的慣性性能。慣性環節的特點是對變化的輸入量,輸出量不能立刻復現,或多或少的存在一定的延時,在延時的時間內,輸出量會逐漸接近輸入的給定值。其微分方程可表示爲:

T(dc(t)/dt)+c(t)=r(t)
。其中T爲慣性時間常數,T越大,慣性越大,當延時時間約爲3-4倍的T時,輸出接近輸入給定值。其傳遞函數可表示爲:
G(s)=1/(Ts+1)
。下面講解用C語言實現慣性環節的過程。這裏注意系統的輸出爲c(t),輸入爲r(t)。首先將微分方程轉化爲差分方程的形式:
T(c(t)c(t1)/t(t1))+c(t)=r(t)
,化簡該公式可表示爲:
c(t)=(r(t)+Tc(t1))/(T+1)
。上述公式表明,當前時刻輸出量c(t)與上一時刻輸出量c(t-1)相關。利用該原理,可使用C語言通過迭代函數實現。首先定於全局變量,存放上一時刻輸出量的值float ResultValueBack。初值設定爲0,然後可通過下面函數實現迭代過程。
float InertialElement(float T, float GiveValue)
{
float  result;
result = (T*ResultValueBack + GiveValue)/(1+T);
ResultValueBack = result;
return result;
}

1.3 積分環節
積分環節是設計校正系統是常用的一個環節,經典的PID算法就分別用到了比例、積分、微分三個環節。積分環節的顯著特點是,輸出量與輸入量的積分成正比例關係,當輸入量消失後,輸出量具有記憶功能,能夠儲存部分能量。其微分方程可表示爲:

c(t)=Integral(r(d)dt)
。其傳遞函數可表示爲:
G(s)=1/s
。對於離散系統而言,積分過程實質上是系統輸入量的累加和,用C語言實現積分過程可表示爲:
定義全局變量ResultValue
float IntegralElement(float GiveValue)
{
float  result;
ResultValue = ResultValue + GiveValue;
result = ResultValue;
return result;
}

1.4 微分環節
微分環節也經常運用到校正環節中,如果被控系統存在較大的慣性環節,可考慮校正環節中加入微分環節,微分環節關注的是給定變化率的特性,所以在一定程度上具有系統預測能力。微分環節根據微分階數的不同分爲一階微分方程、二階微分方程及多階微分方程。這裏我們只用C語言實現一階和二階微分方程,多階微分方程可根據實際需要,讀者利用本書提到的基本方法自行實現。微分環節的微分方程可表示爲,一階:

c(t)=dr(t)dt
二階:
c(t)=Tdr(t)/dt+r(t)
其傳遞函數可表示爲,一階:
G(s)=s
二階:
G(s)=Ts+1
下面是C語言實現一階微分方程與二階微分方程的過程。定義全局變量GiveValueBack。
float DervativeElementOne(float GiveValue) //一階微分實現
{
float  result;
result = GiveValue -  GiveValueBack;
GiveValueBack = GiveValue;
return result;
}
float DervativeElementTwo(float T, float GiveValue)//二階微分實現
{
float  result;
result = (T+1) GiveValue - GiveValueBack;
GiveValueBack = GiveValue;
return result;
}

1.5 滯後環節
滯後環節不同與慣性環節,滯後環節的特點是輸入量給定經過一段延時後,輸出信號完全復現輸入信號。慣性環節則是從輸入量給定開始輸出量便逐漸趨近於輸入量。讀者要理解清楚這兩個環節的不同。滯後環節的微分方程不易表示,但是C語言實現相對簡單,只需要延時賦值即可。

float DelayElement(float Time, float GiveValue)  //Time表示延時時間
{
float  result;
if( T > Time)
{
    result =  GiveValue;
}else{
    result = 0;
}
return result;
}

震盪環節在平常的控制設計中並不常用,這裏暫不做詳細介紹。
1.6 小結
以上5小節,詳細論述了典型環節的微分方程,傳遞函數,及C語言實現的方法步驟。需要反覆強調的是,用C語言實現系統模型,首先將系統模型的傳遞函數轉化爲微分方程的形式,然後再將微分方程轉化爲差分方程的形式,最後根據差分方程表達式用C語言函數實現。這是控制方法用C語言實現的核心所在。爲什麼要講述典型環節的,因爲無論多麼複雜的系統,也無論多麼困難的系統,其無非是幾種典型環節的組合與排列的過程。只有弄清楚基本的典型環節,才能在後續的問題分析與解決中遊刃有餘。


2 PID控制及其C語言實現
PID校正控制方式是工程應用中使用最爲廣泛的一種線性系統控制方法。其核心思想是利用比例、積分、微分三個環節作爲校正環節,提高系統的響應速度、穩定性與準確性。其中比例環節能夠成比例的反映誤差信號,誤差信號一旦產生,比例環節立即產生控制作用,以減少變差;積分環節能夠有效的消除系統的靜態誤差,在系統控制過程中,只要存在誤差,則積分一直持續,直至誤差完全消除,積分環節的強弱直接決定了系統消除誤差時間的快慢;微分環節反映了偏差信號的變化趨勢,具有一定的預測功能,能夠在偏差信號變化太大之前引入一個有效的早期修正信號,加快系統的動作速度,減少調節時間。
2.1 基本PID控制原理及實現
在工業應用中,最常用的控制方式是PID控制,PID控制框圖如圖2-1所示。
這裏寫圖片描述
圖2-1 PID控制框圖
PID是一種線性控制方法,其運用給定值R(t)與實際輸出值C(t)的偏差e(t)作爲控制量進行控制。其控制規律的微分方程可表示爲
這裏寫圖片描述

其中Kp爲比例係數、Ki爲積分系數、Kd爲微分系數。這裏需要注意的是,並非系統最終輸出,而是被控對象之前節點的值。舉個例子說明,假如控制電機以某一轉速運行,通過PID運算得到的值可能是驅動橋電路的PWM開通值,而並非電機的轉速值,PWM開通後作用到電機上才能最終轉化到轉速上。下面將微分方程轉化爲差分方程,再用C語言實現。
這裏我們採用純慣性環節作爲被控對象,用C語言設計最一般的PID算法,並進行仿真驗證。PID的C語言實現過程如下:

float PID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue)
{
    float result;
    float Err,KpWork, KiWork, KdWork;
    Err = GiveValue - ActualValue;
    KpWork = Kp*Err;
    KiWork = Ki*PIDErrADD;
    KdWork = Kd*(Err-ErrBack);
    result = KpWork+KiWork+KdWork;
    PIDErrADD = PIDErrADD + Err;
    ErrBack = Err;
    return result;
}

取Kp = 4.5,Ki = 0.5,Kd = 0.1,給定值爲階躍信號100.2,慣性環節的慣性系數取3。最終輸出的數據取前100個點波形如圖2-2所示。
這裏寫圖片描述
圖2-2 一般PID慣性環節仿真數據圖
2.2 積分分離PID控制實現
控制環節中引入積分環節的目的,主要是爲了消除靜態誤差,提高控制的精度。但是,在實際應用中,當系統處於啓動、結束或大幅增減設定的過程中時,短時間內系統輸出有很大的偏差,如此便會在短時間內產生較大的積分累計,導致控制量超過執行機構可能允許的最大動作範圍對應的極限控制量,進而引起系統較大超調,甚至造成系統的震盪。
引入積分分離的目的在於解決上述問題,其基本思想是,當控制量接近給定值時,引入積分控制,消除靜態誤差;當控制量與給定值相差較大時,取消積分作用,避免積分累加和過大造成的系統不穩定因素增加。
這裏我們採用純慣性環節作爲被控對象,用C語言設計積分分離的PID算法,並進行仿真驗證。PID的C語言實現過程如下:

float SeqIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue)
{
    float result;
    float Err,KpWork, KiWork, KdWork;
    Err = GiveValue - ActualValue;
    KpWork = Kp*Err;
    KiWork = Ki*SeqIntPIDErrADD;
    KdWork = Kd*(Err-SeqIntErrBack);
    if(fabs(Err) > 100)
    {
        result = KpWork+KdWork;
    }else{
        result = KpWork+KiWork+KdWork;
    }
    SeqIntPIDErrADD = SeqIntPIDErrADD + Err;
    SeqIntErrBack = Err;
    return result;
}

取Kp = 4.5,Ki = 0.5,Kd = 0.1,給定值爲階躍信號100.2,慣性環節的慣性系數取30。最終輸出的數據取前100個點波形如圖2-3所示。
這裏寫圖片描述
圖2-3 積分分離PID慣性環節仿真數據圖
2.3 抗積分飽和PID控制實現
實際系統的積分項飽和是指,在實際應用系統中,由於誤差在一段較長的時間內在一個方向上積累,造成積分的累計誤差和過大,從而造成整個積分環節的值過大,當系統趨於穩定或者超調過沖的時候,比例項與微分項的調節作用相對減弱,從而減慢調節速度,甚至長時間不能夠到達給定值。
比如對於一個較大的慣性系統,給定系統一個值後,當控制系統極限輸出時,慣性系統仍然需要一段時間消除誤差,那麼在這段時間內容,正常誤差一直在累加,等到輸出值大於給定值時,由於前面一段時間累積的誤差和太大,從而不能很快的通過誤差調整過來。圖2-4說明了積分飽和的概念。
這裏寫圖片描述
圖2-4 積分飽和說明圖
如圖2-4所示,u爲控制器輸出,X爲執行機構的開度,若系統存在一個方向的偏差,PID控制器的輸出由於積分作用累積,導致執行機構達到極限位置,如果此時控制器輸出u繼續增大,執行器的實際開度已經不可能再增大,此時計算機輸出的控制量超出了正常運行的範圍而進入飽和狀態,一旦系統出現反向偏差,控制器的輸出u會逐漸的退出飽和區。但是進入飽和區越深,退出所需時間越久,從而造成系統的失控。爲了防止積分項飽和,需要對積分項進行限制。實際當中常用的限制方法方法有兩種:
方法一:直接限制積分累加和最大值。所謂直接限制積分累加和是指通過限制積分累加和最大值的方式限制積分項的值使其不能過於深入的進入飽和狀態。比如穩定狀態下積分累加和的值是100,那麼可以將積分累加和的上下限分別限定到+110與-110,但是此值的選擇需要斟酌,此值選取太小,容易造成系統調整速度慢,甚至不能調整到給定值,此值限制的太大,起不到抗飽和積分的作用。在實際應用中,此種方法以其操作簡單被廣泛用到。
方法二:動態限制積分累加和。該方法的思路是在計算本次輸出u(k)時,首先判斷上一時刻的控制量u(k-1)是否已經超出限制範圍;若超出最大限值範圍,則只累加負偏差;反之則只累加正偏差。這種算法可以避免控制量長時間停留在飽和區。
以上兩種方法,對於方法一用C語言實現較爲簡便,不再贅述,本處着重對第二種方法進行C語言實現。

float OverIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue)
{
    float result;
    float Err,KpWork, KiWork, KdWork;
    Err = GiveValue - ActualValue;
    if(OverIntResultBack > 120)
    {
        if(Err < 0)
        {
            OverIntPIDErrADD = OverIntPIDErrADD + Err;
        }
    }else if(OverIntResultBack < 120){
        if(Err > 0)
        {
            OverIntPIDErrADD = OverIntPIDErrADD + Err;
        }
    }else{
           OverIntPIDErrADD = OverIntPIDErrADD + Err;
    }

    KpWork = Kp*Err;
    KiWork = Ki*OverIntPIDErrADD;
    KdWork = Kd*(Err-OverIntErrBack);
    result = KpWork+KiWork+KdWork;
    OverIntErrBack = Err;
    OverIntResultBack = result;
    return result;
}

取Kp = 4.5,Ki = 0.5,Kd = 0.1,給定值爲階躍信號100.2,慣性環節的慣性系數取30。最終輸出的數據取前100個點波形如圖2-5所示。
這裏寫圖片描述
圖2-5 抗飽和積分PID慣性環節仿真數據圖
對比2-3與2-5,可以發現抗飽和積分可以使系統更加穩定。
2.6 其他PID控制實現
PID的在工業上廣泛的應用,具體使用過程中會針對不同的控制系統研究選擇不同的PID控制形式,PID實際應用中多種多樣,上述五個小節中講述了五種PID的實現形式,實際的工業應用中常用的PID還有帶前饋的PID、基於濾波器的PID以及智能PID等其他使用形式,讀者需掌握系統與控制校正環節的分析方法,靈活運用,實現適合自身系統的PID控制器。
關注技術人生公衆平臺,獲取更多技術資源這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章