本文目錄一覽:
- 1、如何用c語言實現PID算法的參數計算
- 2、什麼是pid算法,難學嗎,用C語言,plc怎麼實現?
- 3、PID算法的C語言實現
- 4、怎樣用c語言實現理想微分pid簡單的計算機繪圖程序
- 5、pid控制的C語言編程
如何用c語言實現PID算法的參數計算
這個問題屬於PID的自整定,有簡單的繼電器算法,我試過,效果不理想。
說了半天,我也沒找到很好用的自整定程序,呵呵。
如果你找到好用的,希望能夠分享一下哦。
什麼是pid算法,難學嗎,用C語言,plc怎麼實現?
一、什麼是PID:
PID即:Proportional(比例)、Integral(積分)、Differential(微分)的縮寫。顧名思義,PID控制算法是結合比例、積分和微分三種環節於一體的控制算法,它是連續系統中技術最為成熟、應用最為廣泛的一種控制算法,該控制算法出現於20世紀30至40年代,適用於對被控對象模型了解不清楚的場合。 —百度百科
二、PID是否難學:
在工業應用中PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法,如果能夠熟練掌握PID算法的設計與實現過程,對於一般的研發人員來講,應該是足夠應對一般研發問題了,而難能可貴的是,在我所接觸的控制算法當中,PID控制算法又是最簡單,最能體現反饋思想的控制算法,可謂經典中的經典。經典的未必是複雜的,經典的東西常常是簡單的,而且是最簡單的,想想牛頓的力學三大定律吧,想想愛因斯坦的質能方程吧,何等的簡單!簡單的不是原始的,簡單的也不是落後的,簡單到了美的程度。 —【1】
三、PID算法的C語言源碼:
PID 控制算法可以分為位置式 PID 和增量式 PID 控制算法
詳細見參考【1】【2】
參考:
【1】PID算法
【2】簡易PID算法的快速掃盲(超詳細+過程推導+C語言程序)
PID算法的C語言實現
基本流程
積分環節:主要是用來消除 靜差 (系統穩定後輸出值和設定值之間的差值,積分環節實際上就是偏差累積的過程,把累積的誤差加到原來系統上以抵消系統造成的靜差)
微分環節:反映了偏差信號的變化規律,根據偏差信號的變化規律來進行超前調節,從而增加系統的快速性
對上述公式進行離散化(採樣):兩個公式
增量型PID:
通過增量型PID公式可以看出,最終表達結果和最近三次的偏差有關,最終輸出結果應該為:
首先定義結構變量體:
然後初始化變量
最後編寫控制算法
基本算法,沒有考慮死區問題,沒有設定上下限
在啟動、結束或大幅度增減設定時,短時間內系統輸出有很大的偏差,會造成PID運算的積分積累,導致控制量超過執行機構可能允許的最大動作範圍對應的極限控制量,從而引起較大的超調,甚至是振蕩。
為了克服這個問題,引入積分分離的概念,即當被控量和設定值偏差較大時,取消積分作用;當被控量接近設定值時,引入積分控制,以消除靜差,提高精度。
abs :絕對值
令index=0使積分環節失效
積分飽和現象:如果系統存在一個方向的偏差,PID控制器的輸出由於積分作用的不斷累加而加大,從而導致執行機構達到極限位置。此時計算器輸出量超出正常運行範圍而進入飽和區,一旦系統出現反向偏差,輸出量將逐漸從飽和區退出,進入飽和區越深則退出飽和區時間越長,在這段時間裡,執行機構仍然停留在極限位置而不隨偏差反向而立即做出相應改變,造成性能惡化。
採用梯形積分能夠減小余差,提高精度
改變積分係數,若偏差大,積分作用減弱,係數減小;若偏差小,積分作用增強,係數增大。
變積分PID的基本思想是設法改變積分項的累加速度,使其與偏差大小對應。
使整個系統的穩定速度非常快
比例係數Kp的作用是加快系統的響應速度提高系統的調節精度
積分係數Ki的作用是消除系統的穩態誤差
微分係數Kd的作用是改善系統的動態特性
反應系統性能的兩個參數是系統誤差和誤差變化律
怎樣用c語言實現理想微分pid簡單的計算機繪圖程序
這是C語言的程序用的的積分分離,增量式算法你可以看看~在我用的片子是89C52
/*********************************************************/
/* 名稱: float PIDprocess1 */
/* 功能: PID adjust */
/* 說明: */
/* 調用: */
/* 輸入: float xdata *Yn, float xdata *Rn */
/* 返回值: deltaPn */
/*********************************************************/
float PIDprocess1()
{
int data E_0;
float data deltaPn,deltaPi,deltaPp,deltaPd,PsumCopy;
E_0=SetTemperature1-CurrentTemperature1;
if(abs(E_0)Emax)
{
deltaPp=(float)Kp*(E_0-E_11);
deltaPd=(float)Kd*(E_0-2*E_11+E_21);
// if(deltaPd=dPdmax) deltaPd=0;
deltaPn=deltaPp+deltaPd;
}
else
{
if(abs(E_0)E0)
{
deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0);
}
else
{ //小誤差時的處理
deltaPi=(float)Ki*E_0;
// if(fabs(deltaPi)dPimin) deltaPi=0;
}
deltaPp=(float)Kp*(E_0-E_11);
deltaPd=(float)Kd*(E_0-2*E_11+E_21);
// if(deltaPd=dPdmax) deltaPd=0;
deltaPn=deltaPp+deltaPi+deltaPd;
}
/* if(fabs(deltaPn)dPmax)
{
if(deltaPn0) deltaPn=dPmax;
else deltaPn=-dPmax;
} */
Psum1+=deltaPn;
PsumCopy=Psum1;
if(PsumCopyPmax) PsumCopy=Pmax;
if(PsumCopyPmin) PsumCopy=Pmin;
E_21=E_11;
E_11=E_0;
return(PsumCopy);
}
/*********************************************************/
/* 名稱: float PIDprocess2 */
/* 功能: PID adjust */
/* 說明: */
/* 調用: */
/* 輸入: float xdata Yn, float xdata Rn */
/* 返回值: Psum2 */
/*********************************************************/
float PIDprocess2()
{
int data E_0;
float data deltaPn,deltaPi,PsumCopy;
E_0=SetTemperature2-CurrentTemperature2;
if(abs(E_0)Emax)
{
deltaPn=(float)Kp*(E_0-E_12)+(float)Kd*(E_0-2*E_12+E_22);
}
else
{
if(abs(E_0)E0)
{
deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0);
}
else
{ //小誤差時的處理
deltaPi=(float)Ki*E_0;
}
deltaPn=(float)Kp*(E_0-E_12)+deltaPi+(float)Kd*(E_0-2*E_12+E_22);
}
/* if(fabs(deltaPn)dPmax)
{
if(deltaPn0) deltaPn=dPmax;
else deltaPn=-dPmax;
}*/
Psum2+=deltaPn;
PsumCopy=Psum2;
if(PsumCopyPmax) PsumCopy=Pmax;
if(PsumCopyPmin) PsumCopy=Pmin;
E_22=E_12;
E_12=E_0;
return(PsumCopy);
}
pid控制的C語言編程
#includeunistd.h
#includestdio.h
int main(int argc,int **argv)
{
int pid=fork();
if(pid==-1)
{
printf(“error”);
}
else if(pid==0)
{
printf(“This is the child process!\n”);
}
else
{
printf(“This is the parent process! child process id=%d\n”,pid);
}
return 0;
}
首先為什麼這段代碼gcc編譯不了,只能用g++編譯,gcc編譯顯示結果如下
Undefined first referenced
symbol in file
__gxx_personality_v0 /var/tmp//ccuHN8IS.o
ld: fatal: Symbol referencing errors. No output written to t5
collect2: ld returned 1 exit status
其次,g++編譯後運行結果如下
This is the parent process! child process id=27406
This is the child process!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/301061.html