位置式PID與增量式PID
位置式與增量式PID
位置式PID與增量式PID的介紹和代碼實(shí)現(xiàn)
增量式pid和位置式pid
增量式pid和位置式pid相比各有什么優(yōu)缺點(diǎn)?
*PID*調(diào)參的實(shí)用方法和經(jīng)驗(yàn)有哪些?
在設(shè)計(jì)PID控制器時(shí),什么時(shí)候用增量式PID,什么時(shí)候用位置式PID
位置式PID
- 因?yàn)橛姓`差積分 ∑e(i),一直累加,也就是當(dāng)前的輸出u(k)與
過去的所有狀態(tài)
都有關(guān)系,用到了誤差的累加值
- 輸出的u(k)對(duì)應(yīng)執(zhí)行機(jī)構(gòu)的實(shí)際位置,一旦控制輸出出錯(cuò)(控制對(duì)象的當(dāng)前的狀態(tài)值出現(xiàn)問題 ),u(k)的大幅變化會(huì)引起系統(tǒng)的大幅變化
- 位置式PID在積分項(xiàng)達(dá)到飽和時(shí),誤差仍然會(huì)在積分作用下繼續(xù)累積,一旦誤差開始反向變化,系統(tǒng)需要一定時(shí)間從飽和區(qū)退出,所以在u(k)達(dá)到最大和最小時(shí),要停止積分作用,并且要有積分限幅和輸出限幅
-
當(dāng)輸出限幅的時(shí)候,積分累加部分也應(yīng)同時(shí)進(jìn)行限幅,以防輸出不變而積分項(xiàng)繼續(xù)累加,也即所謂的
積分飽和過深
- 在使用位置式PID時(shí),一般我們直接使用
PD控制
- 位置式 PID 適用于執(zhí)行機(jī)構(gòu)不帶積分部件的對(duì)象,如舵機(jī)和平衡小車的直立和溫控系統(tǒng)的控制
- 位置式PID是一種非遞推式算法,可直接控制執(zhí)行機(jī)構(gòu)(如平衡小車),u(k)的值和執(zhí)行機(jī)構(gòu)的實(shí)際位置(如小車當(dāng)前角度)是一一對(duì)應(yīng)的,因此在執(zhí)行機(jī)構(gòu)
不帶積分部件
的對(duì)象中可以很好應(yīng)用 - 位置式PID每次輸出均與過去的狀態(tài)有關(guān),計(jì)算時(shí)要對(duì)e(k)進(jìn)行累加,運(yùn)算工作量大
代碼示例
//pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
typedef struct PID
{
float kp;
float ki;
float kd;
float ek; //當(dāng)前誤差
float ek_1; //上一次誤差
float ek_sum; //誤差總和
float limit; //限幅
}PID;
static PID pid;
void PID_Init()
{
pid.kp = 0.1;
pid.ki = 0.2;
pid.kd = 0.3;
pid.limit = 1000;
pid.ek = 0;
pid.ek_1 = 0;
pid.ek_sum = 0;
}
// 位置式PID控制
float PID_Postion(int Encoder,int Target)
{
float pwm = 0;
pid.ek = Target - Encoder; // 計(jì)算當(dāng)前誤差
pid.ek_sum += pid.ek; //求出偏差的積分
pwm = pid.kp*pid.ek + pid.ki*pid.ek_sum + pid.kd*(pid.ek - pid.ek_1); //位置式PID控制器
pid.ek_1 = pid.ek; //保存上一次偏差
if(pwm > pid.limit)
{
pwm = pid.limit;
}
else if(pwm < -pid.limit)
{
pwm = -pid.limit;
}
return pwm;
}
增量式PID
- ▲u(k)對(duì)應(yīng)的是近幾次位置誤差的增量,而不是對(duì)應(yīng)與實(shí)際位置的偏差,沒有誤差累加
- 增量式PID中不需要累加,控制增量Δu(k)的確定僅與
最近3次的采樣值
有關(guān),容易通過加權(quán)處理獲得比較好的控制效果,并且在系統(tǒng)發(fā)生問題時(shí),增量式不會(huì)嚴(yán)重影響系統(tǒng)的工作 - 增量式PID誤動(dòng)作時(shí)影響小,必要時(shí)可用邏輯判斷的方法去掉出錯(cuò)數(shù)據(jù)
- 手動(dòng)/自動(dòng)切換時(shí)沖擊小,便于實(shí)現(xiàn)無(wú)擾動(dòng)切換。當(dāng)計(jì)算機(jī)故障時(shí),仍能保持原值
- 積分截?cái)嘈?yīng)大,有穩(wěn)態(tài)誤差
- 溢出的影響大,有的被控對(duì)象用增量式則不太好
代碼示例
//根據(jù)增量式離散PID公式
//pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
//e(k)代表本次偏差
//e(k-1)代表上一次的偏差 以此類推
//e(k-2)代表上上次的偏差
//pwm代表增量輸出
typedef struct PID
{
float kp;
float ki;
float kd;
float ek; //當(dāng)前誤差
float ek_1; //上一次誤差
float ek_2; //上上一次誤差
float limit; //限幅
}PID;
static PID pid;
void PID_Init()
{
pid.kp = 0.1;
pid.ki = 0.2;
pid.kd = 0.3;
pid.limit = 1000;
pid.ek = 0;
pid.ek_1 = 0;
pid.ek_2 = 0;
}
// 增量式PID控制
float PID_Increase(int Encoder,int Target)
{
float pwm = 0;
pid.ek = Target - Encoder; // 計(jì)算當(dāng)前誤差
pid.ek_sum += pid.ek; //求出偏差的積分
pwm = pid.kp*(pid.ek - pid.ek_1) + pid.ki*pid.ek + pid.kd*(pid.ek - 2*pid.ek_1 + pid.ek_2); //增量式PID控制器
pid.ek_1 = pid.ek; //保存上一次偏差
pid.ek_2 = pid.ek_1; //保存上上一次的偏差
if(pwm > pid.limit)
{
pwm = pid.limit;
}
else if(pwm < -pid.limit)
{
pwm = -pid.limit;
}
return pwm;
}
聯(lián)系與區(qū)別
- 增量式算法不需要做累加,控制量增量的確定僅與最近幾次偏差采樣值有關(guān),計(jì)算誤差對(duì)控制 量計(jì)算的影響較小。而位置式算法要用到過去偏差的累加值,容易產(chǎn)生較大的累加誤差
- 增量式算法得出的是控制量的增量,例如在閥門控制中,只輸出閥門開度的變化部分,誤動(dòng)作 影響小,必要時(shí)還可通過邏輯判斷限制或禁止本次輸出,不會(huì)嚴(yán)重影響系統(tǒng)的工作。 而位置式的輸出直接對(duì)應(yīng)對(duì)象的輸出,因此對(duì)系統(tǒng)影響較大
- 在進(jìn)行PID控制時(shí),位置式PID需要有積分限幅和輸出限幅,而增量式PID只需輸出限幅
推薦書籍
《自動(dòng)控制原理的故事》文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-428850.html
《由入門到精通吃透PID》文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-428850.html
到了這里,關(guān)于位置式PID與增量式PID的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!