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

2017-07-09 08:11陈洪伟
现代职业教育·职业培训 2017年10期
关键词:直流电机C语言偏差

陈洪伟

[摘 要] 我国提出了“中国制造2025”。目前企业工业自动化的水平已经成为现代化水平的一个主要衡量指标。PID控制器的特点是结构简单、应用广泛、完全摆脱了精确模型的限制,这样就能解决在工业过程中需要精确建模的困难。那么,基于单片机的PID控制成本低廉,可以根据不同的应用环境进行开发,具有很大的应用优势。

[关 键 词] PID算法;C语言;单片机

[中图分类号] F403.6 [文献标志码] A [文章编号] 2096-0603(2017)30-0220-01

不论在工业还是民用应用中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].清华大学出版社,2001,

猜你喜欢
直流电机C语言偏差
50种认知性偏差
“C语言程序设计”课程混合教学探索
加固轰炸机
基于24V直流电机调速的应用
基于C语言的计算机软件编程技术探究
中职C语言单片机课堂教学中的趣味性探讨
基于霍尔位置信号的无刷直流电机直接转矩控制
真相
计算机原理中C语言的应用价值
基于硬件滤波电路的无刷直流电机转子位置辨识