在stm32的pid控制中一般分为两种方式,一种是位置式pid,一种是增量式pid。
位置式pid

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| float Target,Actual,Out; float Kp=值,Ki=值,Kd=值; float Error0,Error1,ErrorIntegral; int main(void) { Timer_Init(); while(1){ Target=用户指定的一个值; } }
void TIM2_IRQHandler(void){ if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){ Actual=读取传感器(); Error1=Error0; Error0=Target-Actual; ErrorIntegral+=Error0; Out=Kp*Error0+Ki*ErrorIntegral+Kp*(Error0-Error1); if(Out>上限){Out=上限;} if(Out<下限){Out=下限;} 输出至被控对象(Out); TIM_ClearITPendingBit(TIM2,TIM_IT_Update); } }
|
增量式pid(最好不要把Pi设置为0)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| float Target,Actual,Out; float Kp=值,Ki=值,Kd=值; float Error0,Error1,Error2; int main(void) { Timer_Init(); while(1){ Target=用户指定的一个值; } }
void TIM2_IRQHandler(void){ if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){ Actual=读取传感器(); Error2=Error1; Error1=Error0; Error0=Target-Actual; Out+=Kp*(Error0-Error1)+Ki*Error0+Kd*(Error0-2*Error1+Error2); if(Out>上限){Out=上限;} if(Out<下限){Out=下限;} 输出至被控对象(Out); TIM_ClearITPendingBit(TIM2,TIM_IT_Update); } }
|
pid的6种改进措施(3种针对积分项,3种针对微分项)
积分限幅
积分分离
变速积分
微分先行
不完全微分
微分先行
针对目标值经常大幅度跳变的情况,如果pid的效果不好,此时可以考虑积分先行策略。


不完全微分
实际应用pid受噪声干扰严重,就可以使用此方法。
