//增量式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)]