PID控制原理
PID控制原理是一种广泛应用于工业自动化和其他领域的控制算法。PID控制器的名字来源于其三个主要组成部分:比例(Proportional)、积分(Integral)和微分(Derivative)。PID控制器实现的是输入信号和期望信号的零误差。比例控制就是对误差成比例放大,让输出信号按照线性规律接近期望值,比例控制的目的就是让输出值无限接近期望值;积分控制就是对误差随着时间的积分值按一定比例输出,让输出信号能够到达期望值,积分控制的目的就是让输出值在期望值附近振荡;微分控制就是对误差的变化按一定比例输出,微分控制的目的就是为了消除振荡,让输出信号保持稳定。完整的PID控制就是将比例控制的输出值、积分控制的输出值和微分控制的输出值加起来。让输出的信号等于期望信号,并保持稳定。
位置速度环PID原理
位置速度环控制如上图所示,输入信号是期望的目标位置,输出是电机的驱动信号,控制电机的旋转启停、旋转速度。通过旋转编码器作为传感器获取电机的转动情况,并经过一定的计算过程得到实际转轴的位置以及实际转轴的速度。
内环是速度环,内环的输入是速度误差,就是期望速度减去实际转轴速度,速度误差输入到速度PID控制器中经过计算得到输出值,该输出值就是对电机驱动信号的控制,电机的控制一般以PWM信号来控制,于是输出值就是PWM信号的占空比。
外环是位置环,上述内环中的期望速度其实就是外环的输出,是通过外环计算出来的而不是固定的,外环的输入是位置误差,就是期望位置减去实际转轴位置。外环的输入就是电机最终期望达到的位置。
内环和外环的关系有两点需要注意:第一点是内环的期望值,也就是输入,是外环PID计算后得到的输出;第二点是外环控制对象是内环控制对象的积分,这里外环的控制对象是实际转轴的位置,内环的控制对象是实际转轴的速度,它俩存在一个积分的关系。
代码解析
实践是检验真理的唯一标准。下面用实际使用过的代码来解释一下位置速度环PID的实现过程。
硬件方面,主控选择的是STM32单片机,电机驱动模块选择TB6612模块还有电机及编码器。软件方面,选择利用CubMX生成HAL库的工程,具体生成过程大同小异。
首先第一步是获取电机编码器的脉冲数,这里通过STM32内部的计数器实现。在总的定时器回调函数中,htim7是20ms的定时器,如下图所示,每20ms进入中断函数一次。
首先获取电机每20ms内电机编码器输出脉冲数。hitm3和htim8都设置为encoder mode,即定时器编码器模式,获取两个电机编码器的脉冲值。获取到的脉冲值用于计算实际转轴的位置和速度。
后再看总的位置速度环PID控制函数Location_Speed_control()。总的PID控制函数的关键部分包括位置环PID控制函数location_pid_control()和速度环PID控制函数speed_pid_control()。
有了实际速度之后,再通过速度环PID运算函数speed_pid_realize得到PID输出控制值。该函数通过一个结构体传递目标值、误差、上一个偏差值、PID系数以及积分值等参数,这些参数中,目标值是通过位置环PID运算函数计算得到的,PID系数是要提前设置好的。
速度环PID运算函数speed_pid_realize得到PID输出控制值其实就是PWM输出。如下图所示,speed_Outval和speed2outval就是速度环PID运算函数的计算结果,它们的值传入MotorOutput电机输出函数中。
在MotorOutput电机输出函数中,主要是判断方向以及限制PWM输出上限值。
最后我们再介绍一下位置环PID控制函数location_pid_control()。该函数也需要通过编码器脉冲数先获取电机转轴实际位置。
有了实际位置后,通过location_pid_realize函数调用位置PID结构体和实际位置计算得到目标速度,目标速度输出给速度环的输入,这样就完成闭环了。
其他说明
上述介绍的代码在电子设计竞赛中实际应用过,可以稳定运行,需要相关文件用于借鉴学习可以私聊。