• 3
  • 2
  • 1

联系我们
名家名作杂志社

编辑部地址:河北省石家庄市民族路77号 华强广场B座1505-1512室
电话:0311-88816963、88816899
投稿邮箱:mjmzbjb@126.com

美文赏析
您当前的位置:主页 > 美文赏析 >

基于单片机的PID控制算法实现

美文赏析  发布时间:2019-01-04 08:27  点击量:

基于单片机的PID控制算法实现
陈洪伟
(江苏省张家港中等专业学校,江苏 张家港215600)
摘要:我国提出了“中国制造2025”。目前企业工业自动化的水平已经成为现代化水平的一个主要衡量指标。PID控制器的特点是结构简单,应用广泛,完全摆脱精确模型的限制,这样就能解决在工业过程中需要精确建模的困难。那么基于单片机的PID控制具有成本低廉,可以根据不同的应用环境进行开发,具有很大的应用优势。
关键词:PID算法;C语言
不论在工业还是民用应用中PID及其衍生算法是应用较为广泛的算法之一,也被大家称为万能算法,所以熟练掌握PID算法的设计和实现的过程,对于研发人员来讲,基本上是可以应对工作中遇到的一些基本问题了。其实PID的控制过程也是相当的简单了,原理是通过误差信号来控制被控的量,就控制器本身而言就是比例、积分、微分三个环节的加和。在这里我们规定(在t时刻):输入的变量为rin(t),输出得变量为rout(t);所以我们可以得出偏差量为err(t)=rin(t)-rout(t)。那么我们从参考文献上可以查阅到PID的控制规律为U(x)=kp(err(t)+1/T*∫err(t)*dt+TD*derr(t)/dt)。接下面我们来举例说明这个公式,首先来假设这个工作流程是用来直流电机调速的。在这里rin(t)为电机转速预定值,rout(t)做为电机的实际转速值。直流电机的调速方法为PWM脉宽调制。转速的单位转/min 表示。那么接下来我们要考虑的是系统中的U(t)是什么,而U(t)和PWM之间存在的关系是什么样的。我们都知道实际应用中,每一个电压对应的是一个转速,但是大多数人把电压和转速的关系理解成线性的对应关系了。而在实际的应用中直流电机的特性不是线性的,或者只能说直流电机的特性是在局部上趋于线性的。所以这样就引出来一个问题,直流电机在PID调速上是有范围限制的。这样就要求我们在进行PID调速之前,用开环系统来测试电压和转速之间的特性曲线,根据这个曲线再进行闭环参数的调整。
接下来我们再来说明一下反馈的原理,来看一下公式U(x)=kp(err(t)+1/T*∫err(t)*dt+TD*derr(t)/dt)。在这里,PID控制其实就是对偏差的控制过程。那么偏差如果为0则比例环节就不起作用了。当控制系统存才偏差时比例环节才发挥作用,这里的积分环节是用来消除静差的,静差在这里是系统稳定后输出值和设定值之间的相差值,而积分环节就是偏差累计后的结果,把累计的误差加到原有系统上用来抵消掉系统产生的静差。而微分信号则是反映偏差信号的变化规律,它的作用是根据偏差信号的变化趋势来提前进行调节,这样就增加了系统的快速性。了解了它的控制原理接下来我们将对PID进行连续系统离散化,这样我们就能在单片机上通过C语言来实现。偏差err(K)=rin(K)-rout(K);积分环节用加和来表示,也就是err(K)+err(K+1)+……,而微分环节是用斜率的形式来表示,[err(K)-err(K-1)]/T,这样就从形成了如下所列出的PID离散表示形式:U(k)=kp(err(k)+Ki∑err(j)+Kd(err(k-1)-err(k-2))从这个公式可以看出,增量式的结果是和最近的一次偏差有关系,这样就可以很大程度的提高系统的稳定性。但是需要注意的是最后的结果应该为u(K)+增量调节后的值;这就是PID的离散化过程,接下来要做的工作时将离散化的公式转换成为C语言,从而实现在单片机上控制。实现过程C语言控制代码如下:
首先我们来定义一个PID变量结构体 struct_pid{ float SetSpeed;float ActualSpeed;float err; float err_last;float Kp,Ki,Kd;float voltage;float integral}pid;结构体中变量含义分别为定义一个设定的值,定义一个偏差值,定义上一个偏差值,定义比例系数,积分系数,微分系数,定义一个控制执行器的电压值的变量,定义一个积分值。把所要用到的参数定义在一个结构体中可以使程序更加的模块化。接下来我们要对三个比例系数赋初值,pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2;在调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。float PID_realize(float speed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;pid.integral+=pid.err;pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);pid.err_last=pid.err;pid.ActualSpeed=pid.voltage*1.0;returnpid.ActualSpeed;}那么到此pid的基本算法已经呈现出来了。但是在实际应用中这个算法是没有考虑上下限的问题。只是对公式的一种直接实现。如放在实际应用中应根据情况加以改进。
参考文献:
[1]维斯.数据结构与算法分析[M].机械工业出版社,2004
[2]谭浩强.C语言程序设计[M].清华大学出版社

版权所有 © 名家名作杂志社    冀ICP备06017713号