STM32上实现PID算法测试
PID
PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。顾名思义,PID控制算法是结合比例、积分和微分三种环节于一体的控制算法,它是连续系统中技术最为成熟、应心最为广泛的一种控制算法,该控制算法出现于20世纪30至40年代,适用于对被控对象模型了解不清楚的场合。实际运行的经验和理论的分析都表明,运用这种控制规律对许多工业过程进行控制时,都能得到比较满意的效果。PID控制的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。 PID分为位置型和增量型 增量型即通过 u(k)-u(k-1) 从而得出式子 公式的第一部分是比例式 是为了让值按一定比例达到目标值 第二部分是积分值,正值,在计算的过程中往往会受到环境等一些其他因素的影响,导致值不能到达目标值 第三部分是微分值,通常是负值,后一次偏差值往往小于前一次偏差值,目的是为了防止值增加过大,通常起一个阻碍的作用
想要更加深入了解PID的话,大家可参考这篇博文 链接: .
测试代码
这里我使用的正点原子的STM32mini板 下面只粘出了部分代码 这里我使用的增量型PID,单片机的具体代码以及PID的部分资料,可以在我的GitHub上下载
pid结构体
struct _pid{
float SetSpeed;//定义设定值
float ActualSpeed;//定义实际值
float err;//定义偏差值
float err_next;//定义上一个偏差值
float err_last;//定义最上前的偏差值
float Kp, Ki, Kd;//定义比例、积分、微分系数
}pid;
pid初始化
void PID_init(){
pid.SetSpeed = 0.0;
pid.ActualSpeed = 0.0;
pid.err = 0.0;
pid.err_last = 0.0;
pid.err_next = 0.0;
//可设置下面的值,从而达到最佳效果
pid.Kp = 0.2;
pid.Ki = 0.04;
pid.Kd = 0.2;
}
控制算法
float PID_realize(float speed){
float incrementSpeed;
pid.SetSpeed = speed;
pid.err = pid.SetSpeed - pid.ActualSpeed;
incrementSpeed = pid.Kp*(pid.err - pid.err_next) + pid.Ki*pid.err + pid.Kd*(pid.err - 2 * pid.err_next + pid.err_last);//计算出增量
pid.ActualSpeed += incrementSpeed;
pid.err_last = pid.err_next;
pid.err_next = pid.err;
return pid.ActualSpeed;
}
for(i=0;i<240;i++)
{
LCD_Fast_DrawPoint(i,320-(int)PID_realize(160.0),BLACK); //快速画出pid曲线,160是设定值
delay_ms(200);
}
如果想了解更多使用不同pid方法,可以参考这篇博文
运行结果
从结果看出还是很准确的
