PID算法是控制中使用的最多并且最简单的一种控制算法,算法的核心就是不断计算当前值和目标值的误差,并根据误差来改变输入,最终达到目标值。
废话不多说,一看代码就明白了:
/**************************************************************************
函数功能:位置式PID控制器
入口参数:编码器测量位置信息,目标位置
返回 值:电机PWM
根据位置式离散PID公式
pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差
∑e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2,k;
pwm代表输出
**************************************************************************/
int Position_PID (int Target,int Encoder)
{
double Position_KP=0.06,Position_KI=0.0,Position_KD=0.01;
static float Bias,Pwm,Integral_bias,Last_Bias;
Bias=Encoder-Target; //计算偏差
Integral_bias+=Bias; //求出偏差的积分
Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias); //位置式PID控制器
Last_Bias=Bias; //保存上一次偏差
return Pwm; //增量输出
}
上面是核心代码,当然KP、KI、KD这三个参数是很难调的,需要根据误差适当计算后再慢慢调试。
关于 P、I、D 三个参数的主要作用,可以大致又不完全地概况为:P 用于提高响应速度、I 用于减小静差、D 用于抑制震荡。
当然,这个误差的获得也很重要,因为采样间隔的不同将带来不同的控制延迟,当然也不是采样间隔越短越好,太短的话,编码器的数值不准确,一般情况下10ms一次的采样间隔比较合适,100ms就太长了,会导致控制最终的误差难以消除。
实验器材
测试平台:STM32F401CCU6
定时器:TIM2(用于采样、定时观测编码器读数)、TIM3(电机的PWM输出口)、TIM4(编码器)
控 制:位置 PID 算法
OLED:中景园1.3寸7针OLED
电机驱动:TB6612电机驱动模块
完整工程链接