//增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx->Error = SetValue - MeaValue; PIDx->PWM_Inc = (PIDx->P * (PIDx->Error - PIDx->PreError)) \ + (PIDx->I * PIDx->Error) \ + (PIDx->D * ((PIDx->Error - PIDx->PreError) - (PIDx->PreError - PIDx->PrePreError))); PIDx->PrePreError = PIDx->PreError; PIDx->PreError = PIDx->Error; return PIDx->PWM_Inc ; }
//位置式PID
float LocPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue) { u8 Index=1; PIDx->Error = SetValue - MeaValue; Intergral_Error+=PIDx->Error; if(abs(PIDx->Error)>250)//積分分離 { Index=0; } else{ Index=1; } PIDx->PWM_Inc = (PIDx->P * PIDx->Error) \ + (Index * PIDx->I * Intergral_Error) \ + (PIDx->D * (PIDx->Error - PIDx->PreError)); PIDx->PrePreError = PIDx->PreError; PIDx->PreError = PIDx->Error; return PIDx->PWM_Inc ; }
首先先要明確,增量式pid和位置式pid本質是一樣的,本次增量式pid的輸出是由本次位置式pid的輸出減去上次位置式的輸出得到的。對比一下
位置式:u(k) =Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
增量式:Δu(k) =Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
可以看出增量式的KP和位置式的kd一樣,增量式的ki和位置式的kp一樣。所以對於增量式的參數整定,應該先整定KI,它反映了響應的速度,再整定KP,它反映了對超調量的限制,也就是緩減增量式KI參數過大時候的抖動
位置式PID:
比例項只考慮現在有沒有偏差,現在有偏差就開始控制,現在偏差越大,控制效果越明顯。
積分項根據歷史數據輸出控制信號,如果歷史總體超標就要減小輸出信號,如果歷史不達標那要大量輸出控制信號
微分項只關注偏差有沒有變化趨勢,偏差有了變化趨勢才開始控制(而不是偏差存不存在),即偏差的變化率。
增量式PID:Δu(k) =Kp[e(k)-e(k-1)] + Ki*e(k) + Kd[e(k)-2e(k-1)+e(k-2)]
Kp項是誤差變化率
Ki項是誤差,
Kd項是變化率的變化率 : e(k)-2e(k-1)+e(k-2)= [e(k)-e(k-1)] - [e(k-1)-e(k-2)]