本篇博文最後修改時間:2017年08月20日 23:00。
一、簡介
本文介紹PID增量式算法。
二、實驗平臺
電腦平臺:無
編譯軟件:無
硬件平臺:無
三、版權聲明
博主:_懵懂
聲明:此博客僅供參考不做任何商業用途,最終解釋權歸原博主所有。
原文地址:http://blog.csdn.NET/qq_18842031
QQ:951795235
E-mail :[email protected]
懵懂之MCU交流羣:136384801
四、實驗前提
暫無。
五、基礎知識
暫無
六、源碼地址
暫無
七、關聯文章
暫無
八、講述內容
1、PID算法之增量式控制溫度
本次增量式:
△OUT= OUTK- OUTk-1=kp(EK-EK-1)+((Kp*T)/Ti)Ek+(((Kp*TD)/T)*(Ek-2Ek-1+Ek-2)
C代碼:
unsigned int pidtimer; //定時器計時
void PIDCalc(int Sv,int Pv) // Sv設定溫度值 Pv當前溫度值
{
int DERR1 = 0; //
int DERR2 = 0; //
float Pout = 0; //比例結果
float Iout = 0; //積分結果
float Dout = 0; //微分結果
unsigned int Out = 0; //總輸出
static unsigned int Out1; //記錄上次輸出
static int ERR; //當前誤差
static int ERR1; //上次誤差
static int ERR2; //上上次誤差
/******************
*以下四項是需要根據實際情況調試的
******************/
static int pidt = 300; //300MS計算一次 計算週期
static char Kp = 30; //比例係數
static unsigned int Ti= 5000; //積分時間
static unsigned int Td= 600; //微分時間
static unsigned char Upper_Limit= 100; //PID輸出上限
static unsigned char Lower_Limit= 0; //PID輸出下限
if(pidtimer < pidt) //計算週期 pidtimer可以用定時器計時
return ; //
ERR = Sv - Pv; //算出當前誤差
DERR1 = ERR - ERR1; //上次
DERR2 = ERR - 2 * ERR1 + EER2; //上上次
Pout = Kp * DERR1; //輸出P
Iout = (float)(ERR * ((Kp * pidt) / Ti)); //輸出I
Dout = (float)(DERR2 * ((Kp * Td) / pidt)); //輸出D
Out = (unsigned int)(Out1 + Pout + Iout + Dout);
if(Out >= Upper_Limit) //如果輸出大於等於上限
{
Out = Upper_Limit;
}
else if(Out <= Lower_Limit) //如果輸出小於等於下線
{
Out = Lower_Limit
}
Out1 = Out; //記錄這次輸出的值
ERR2 = ERR1; //記錄誤差
ERR1 = ERR; //記錄誤差
pidtimer = 0; //定時器清零重新計數
}
PID參數調節口訣
參數整定找最佳,從小到大順序查
先是比例後積分,最後再把微分加
曲線振盪很頻繁,比例度盤要放大
曲線漂浮繞大灣,比例度盤往小扳
曲線偏離回覆慢,積分時間往下降
曲線波動週期長,積分時間再加長
曲線振盪頻率快,先把微分降下來
動差大來波動慢。微分時間應加長
理想曲線兩個波,前高後低4比1
一看二調多分析,調節質量不會低