這是項(xiàng)目中非常重要的PID控制器妹沙,為什么電機(jī)會(huì)時(shí)刻保持穩(wěn)定,主要就是靠它泛领,目前我認(rèn)為它應(yīng)該以實(shí)際位置與目標(biāo)位置的差值作為PID的控制器輸入一喘,控制電機(jī)的PWM波形的生產(chǎn)相關(guān)參數(shù)作為輸出。到底是不是呢涛碑,先看看函數(shù)本身的定義和之后的調(diào)用就清楚了精堕。
/************************/
/* PID Controller? ? ? */
/************************/
// PID integer inplementation
//? DTms? ... sample period (ms)//采樣周期
//? DTinv ... sample frequency (Hz), inverse of DT (just to avoid division)//采樣頻率,采樣周期的倒數(shù)蒲障,提前算好歹篓,避免由控制器計(jì)算除法瘫证,減小計(jì)算量
int32_t ComputePID(int32_t DTms, int32_t DTinv, int32_t in, int32_t setPoint, int32_t *errorSum, int32_t *errorOld, int32_t Kp, int16_t Ki, int32_t Kd)
//int32_t 是32位有符號(hào)整型數(shù),可以看到PID控制器的參數(shù)有DTms采樣周期庄撮,DTinv采樣頻率背捌,in(實(shí)際值),setPoint設(shè)定值洞斯,誤差errorsum誤差總和毡庆,errorOld上一步誤差,Kp烙如,Ki么抗,Kd,為PID的三個(gè)整定參數(shù)亚铁。
{
int32_t error = setPoint - in;//計(jì)算當(dāng)前周期內(nèi)的誤差蝇刀,給定值-實(shí)際值=誤差
int32_t Ierr;
Ierr = error * Ki * DTms;//計(jì)算當(dāng)前周期的誤差積分
Ierr = constrain_int32(Ierr, -(int32_t)1000*100, (int32_t)1000*100);//對(duì)lerr的數(shù)值進(jìn)行大小限制,控制在±100000之內(nèi)徘溢,是不是為了避免積分飽和呢吞琐?
*errorSum += Ierr;//當(dāng)前誤差積分與歷史誤差積分相加,產(chǎn)生新的歷史誤差積分
/*Compute PID Output*/
int32_t out = (Kp * error) + *errorSum + Kd * (error - *errorOld) * DTinv;//正好是三項(xiàng)甸昏,第一項(xiàng)比例項(xiàng)顽分,第二項(xiàng)積分項(xiàng),第三項(xiàng)微分項(xiàng)(相鄰兩個(gè)周期的誤差相減除以周期施蜜,就是誤差曲線的斜率)
*errorOld = error;//為下一次計(jì)算做準(zhǔn)備卒蘸,將本次周期的誤差存為上一次誤差
out = out / 4096 / 8;//這里為什么要連續(xù)除以4096和8的目的還不清楚,需要配合日后引用的代碼進(jìn)行分析
return out;
}
通過分析翻默,可以看出這個(gè)PID控制器是采用位置式的實(shí)現(xiàn)發(fā)放缸沃,也就是全量式的。
全量式有什么樣的缺點(diǎn)呢修械?
1)由于全量輸出趾牧,所以每次輸出均與過去狀態(tài)有關(guān),計(jì)算時(shí)要對(duì)e(k)(k=0,1,…n)進(jìn)行累加肯污,工作量大翘单。其實(shí)到也沒有多大的計(jì)算量,實(shí)際編程中也是逐項(xiàng)累加起來的蹦渣,一個(gè)循環(huán)周期內(nèi)也只是用到歷史綜合和當(dāng)前誤差哄芜。倒是需要對(duì)積分飽和的問題進(jìn)行控制。
2)因?yàn)橛?jì)算機(jī)輸出的u(n)對(duì)應(yīng)的是執(zhí)行機(jī)構(gòu)的實(shí)際位置柬唯,如果計(jì)算機(jī)出現(xiàn)故障认臊,輸出u(n)將大幅度變化,會(huì)引起執(zhí)行機(jī)構(gòu)的大幅度變化锄奢,有可能因此造成嚴(yán)重的生產(chǎn)事故失晴,這在實(shí)際生產(chǎn)中是不允許的剧腻。
與此相對(duì)應(yīng)的還有增量式的,具體實(shí)現(xiàn)方法可以參考這里涂屁。