调控周期
- 一般取决于被控对象变化的快慢,倒立摆,平衡车,飞行器变化得很快,一般50ms,20ms,10ms,1ms就要进行一次调控,
- 姿态传感器,每隔5ms才能更新一下,太快也没用,
- 电机控速20~100ms都可以
- 一般就在定时器中断中实现定时调控,注意中断中不能和主循环调用同一个硬件资源,因为中断和主循环相当于多线程,等同于访问临界资源(或者可以在定时器中断中置标志位,在主循环中不断检查标志位可以避免同时访问临界资源)
位置式PID程序实现
Actual = 读取传感器();Error1 = Error0;Error0 = Target - Actual;ErrorInt += Error0;Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);if (Out > 上限) {Out = 上限;}if (Out < 下限) {Out = 下限;}
增量式PID程序实现
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 = 下限;}
Actual = 读取传感器();Error2 = Error1;Error1 = Error0;Error0 = Target - Actual;DeltaOut = Kp * (Error0 - Error1) + Ki * Error0 + Kd * (Error0 - 2 * Error1 + Error2);if (Out > 上限) {Out = 上限;}if (Out < 下限) {Out = 下限;}