经典PID控制算法用C语言实现!
生活随笔
收集整理的這篇文章主要介紹了
经典PID控制算法用C语言实现!
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.經(jīng)典PID控制算法框圖
2.經(jīng)典PID控制算法公式?
3. 經(jīng)典PID控制公式用C語(yǔ)言實(shí)現(xiàn)
?
float pidUpdate(PidObject* pid, const float error) {float output;pid->error = error; pid->integ += pid->error * pid->dt;if (pid->integ > pid->iLimit){pid->integ = pid->iLimit;}else if (pid->integ < pid->iLimitLow){pid->integ = pid->iLimitLow;}pid->deriv = (pid->error - pid->prevError) / pid->dt;pid->outP = pid->kp * pid->error;pid->outI = pid->ki * pid->integ;pid->outD = pid->kd * pid->deriv;output = pid->outP + pid->outI + pid->outD;pid->prevError = pid->error;return output; }PidObject 為 PID 對(duì)象結(jié)構(gòu)體數(shù)據(jù)類(lèi)型: typedef struct {float desired; //< set pointfloat error; //< errorfloat prevError; //< previous errorfloat integ; //< integralfloat deriv; //< derivativefloat kp; //< proportional gainfloat ki; //< integral gainfloat kd; //< derivative gainfloat outP; //< proportional output (debugging)float outI; //< integral output (debugging)float outD; //< derivative output (debugging)float iLimit; //< integral limitfloat outputLimit; //< total PID output limit, absolute value. '0' means no limit.float dt; //< delta-time dtfloat out; //< out } PidObject;第一個(gè)參數(shù)為將被更新的 PID 結(jié)構(gòu)體對(duì)象,第二個(gè)參數(shù)則是偏差(期望值-測(cè)量值),積分項(xiàng)為偏差對(duì)時(shí)間的積分,微分項(xiàng)則是偏差對(duì)時(shí)間的微分,然后函數(shù)里面有三個(gè)參數(shù) pid->kp,pid->ki,pid->kd 分別指的是該 pid 對(duì)象的比例項(xiàng),積分項(xiàng)和微分項(xiàng)系數(shù),每個(gè) pid 對(duì)象都有屬于自己的 PID 系數(shù),PID 初始化 pid 對(duì)象的時(shí)候會(huì)設(shè)定一組默認(rèn)的系數(shù),同時(shí)這組系數(shù)是可以調(diào)整的,我們常說(shuō)的 PID 參數(shù)整定,其實(shí)就是調(diào)整這組系數(shù),讓它滿(mǎn)足你的系統(tǒng)。
(參考ATK公式四旋翼飛行器開(kāi)源代碼)
總結(jié)
以上是生活随笔為你收集整理的经典PID控制算法用C语言实现!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2018这一年或平淡或不凡,2019看更
- 下一篇: C语言中:#define宏的正确使用