STM32F4温度控制实例:基于PID参数调节法改变PWM占空比
最近的工程要用到PID算法,在这里与大家分享一下。本文章适合直接上手PID,直接将PID与STM32结合运用起来,比较适合没有接触过PID的新人或者是算法与STM32结合不熟悉的新同学,如果要详细了解PID算法与调整算法还是需要深入了解一下PID算法。这里介绍一个讲PID算法很详细的博主 PID参数调整,个人经验(配输出曲线图)建议可以先看一下这篇文章再看我下文的内容。
首先我的工程是要STM32F4作为主控系统去实现温度控制在37℃,加热装置是一个很普通的通过大小不同的电流驱动的加热片,所以首先第一步是先搭建一个闭环的系统,即是一个封闭的系统(包括有加热模块,采集温度模块和处理模块)。接着我是通过控制不同占空比的PWM波驱动加热片进行加热,经过不断测试记录下来大概37℃的占空比,即记录自己的目标温度的驱动能力大概是多少。第二步就是确定三个参数:比例系数(P),微分系数(I),积分系数(D),笼统的来说PID算法就是设定一个温度,让系统可以最快速度的去升温到预定的温度,但是在即将到达预设温度通过PID算法就行缓冲和修正,防止温度过冲(专业的说法是防止超调量过大),让温度降下来,之后再快速修正并保持稳定在预设温度。我是通过一个自适应算法去获取三个参数的,自适应算法就是让温度达到一个稳定的震荡,接着采集当前的幅值,并通过公式计算出比例系数Kp,同时以计数作为微分时间。。。代码注释后面就是我获取的三个原参数,但是原来的参数的温度变化曲线并不理想,根据PID经典调整口诀调整参数直到温度曲线达到理想。第三步就是将计算出来的PID结果与单片机结合起来,比如我的是控制PWM波,就将PID算法结果与PWM修正结合起来。PID_out()函数就是将PID计算结果与占空比相结合,随着不断的误差更新不断调整占空比控制电流直到达到自己设定的预设温度。
void PID_Calc() //pid计算
{
float DelEk;
float out; //PID输出
pid.Kp = 100; //比例系数 38
pid.Ki = 0.10; //积分系数 0.3048
pid.Kd = 2; //微分系数 1.984375
PID_Deal = 1; //PID_Deal为1时表示进行PID计算
if (PID_Deal == 1)
{
pid.Ek=pid.Sv-pid.Pv; //得到当前的偏差值
pid.SEk+=pid.Ek; //历史偏差总和
DelEk=pid.Ek-pid.Ek_1; //最近两次偏差之差
pid.Pout=pid.Kp*pid.Ek; //比例输出
pid.Iout=pid.Ki*pid.SEk; //积分输出
pid.Dout=pid.Kd*DelEk; //微分输出
out= pid.Pout+ pid.Iout+ pid.Dout;
kkk++; //计数
if(out>255)
{
kkk=0;
pid.SEk=0;
}
if(out>255)
{
pid.OUT=255;
}
else if(out<0)
{
pid.OUT=0;
}
else
{
pid.OUT=out;
}
pid.Ek_1=pid.Ek; //更新偏差
PID_out();
}
}
这个是我将每一秒采集的温度打印到串口并输出出来拿到matlab画了个图,这属于比较合格的PID温控曲线。
如果我表示的还不清楚,或者有什么讲错了讲得不好欢迎大家评论区指正。
非无偿开源,有需要可以私信。有自适应的PID算法与控制参数的PID算法。