PID算法控制马达转速

PID算法听起来高大上,理解后实际上是很简单的,实现代码也很小。

PID控制是将实际值与目标值的偏差的比例(P),积分(I),微分(D)的线性组合作为控制量,控制被控对象。

PID控制器各个校正环节的作用如下:

1、 比例环节:用来控制当前,即时成比例地反映偏差信号,偏差一旦出现,比例环节立即产生作用来减小偏差。

2、 积分环节:用来控制过去,主要作用是消除静差,积分常数Ti越小,积分作用越强,Ti越大,积分作用越弱。

3、 微分环节:用来控制将来,能对偏差的变化做出反应,在偏差变化太大之前加入控制信号。微分常数越大,做出的反应越快,从而减小系统调节时间。

一、模拟PID控制原理:

clip_image002

其中,r(t)是给定值,y(t)是系统的实际输出值,给定值与实际输出值的差值e(t)=r(t)-y(t).e(t)作为PID控制器的输入,u(t)作为PID控制器的输出,也是被控对象的输入。所以,模拟PID的控制规律为:

clip_image004

其中,Kp为控制器的比例系数;Ti为控制器的积分时间常数;Td为控制器的微分时间常数。

(1)比例部分:Kp*e(t)

在模拟PID控制器中,比例环节的作用是对偏差瞬间作出反应。偏差一旦产生,控制器立即产生控制作用,使控制量向减小偏差的方向变化。控制作用的强弱取决于比例系数Kp。Kp越大,控制作用越强,则过渡过程越快,控制过程的静态偏差也就越小。但是Kp越大,也越容易产生振荡,破坏系统的稳定性。

(2)积分部分
从积分的数学表达式可知:只要存在偏差,则它的控制作用就不断增加。只有在偏差值为零时,它的积分才是一个常数。控制作用才是一个不会增加的常数。可见,积分部分可以消除系统的偏差。
积分环节虽然会消除静态误差,但是也会降低系统的响应速度,增加系统的超调量。积分时间常数越大,积分的积累越弱。这时,系统在过渡时不会产生振荡。但是,增大积分时间常数会减慢静态误差的消除过程,消除偏差所需的时间也较长,但可以减少超调量,提高系统的稳定性。
当积分时间常数较小时,则积分的作用较强。这时系统过渡时间中有可能产生振荡,不过消除偏差所需的时间较短。所以必须根据实际控制的具体要求来确定积分时间常数。
积分系数(积分增益)是指:Ki=K_p/T_i 。
(3)微分部分:Kp*Td*(de(t))/dt
控制系统除了期望消除静态误差外,还要求加快调节过程。在偏差出现的瞬间,或在偏差变化的瞬间,不但要对偏差量做出立即响应(比例环节的作用),而且要根据偏差的变化趋势预先给出适当的纠正。为了实现这一作用,可以在PI控制器的基础上加入微分环节,形成PID控制器。
微分环节的作用是阻止偏差的变化。它根据偏差的变化趋势(变化速度)进行控制。偏差变化的越快,微分控制器的输出就越大,并能在偏差值变大之前进行修正。微分作用的引入,有助于减小超调量、克服振荡,使系统趋于稳定。特别对高阶系统有利,它加快了系统的跟踪速度。但微分的作用对输入信号的噪声很敏感。对那些噪声较大的系统一般不用微分,或在微分起作用之前先对输入信号进行滤波。
微分部分的作用由微分时间常数决定。微分时间常数越大时,则它抑制偏差变化的作用越强;微分时间常数越小时,则它反抗偏差变化的作用越弱。微分部分显然对系统稳定有很大的作用。适当地选择微分时间常数,可以使微分作用达到最优。
微分系数是指:Kd= Kp*Td。

二、数字PID控制原理
因为在微机处理器里面是通过软件来实现PID控制算法的,所以必须将模拟PID控制器进行离散化处理,这样控制器只需根据采样时刻的偏差值计算控制量。因此,我们需要使用离散的差分方程代替连续的微分方程。假定采样时间T很短时(比如10ms),可以做如下处理:
(1)用一阶向后差分代替一阶微分;
(2)用累加(矩形法数字积分)代替积分。
则有:

clip_image006

T为采样周期。

k-采样次数0…n

u(kT)是第k个采样周期时间点,PID控制器的输出。

e(kT)是第k个采样周期时间点,给定值与输出值的差值。

clip_image008对应clip_image010

clip_image012对应clip_image014

dt就是一个采样时间周期T,因为两次采样的时间间隔是T。

上面数字PID的公式有模拟PID推导出来。

数字PID算法分为位置式PID控制算法和增量式PID控制算法,一般采用增量式PID算法。

位置式PID控制算法:

clip_image016

首先要对系统离散化:

clip_image018

位置式PID输出:

clip_image020

简化为:

clip_image022

位置式算法的缺点是:这种算法每次输出均与过去状态有关,且输出值是执行机构的实际位置,一旦单片机出现故障,输出值将大幅变化,会引起执行机构的大幅变化,这样可能对执行机构造成严重的损害,在实际应用中是不允许的,增量式PID控制算法可以避免这种现象的发生。

增量式PID算法:

clip_image024

由位置式PID控制算法可得到:

clip_image026

把上式中的ek,ek-1,ek-2用△e(k),△e(k-1)替代,可得到:

△u(k)=u(k)-u(k-1) = Kp△e(k)+Ki*e(k)+kd[△e(k)- △e(k-1)]

其中

△e(k) =e(k)-e(k-1)

△e(k-1)=e(k-1)-e(k-2)

Ki=Kp*T/Ti

Kd=Kp*Td/T

Kp为比例系数

Ki为积分系数

Kd为微分系数

增量式PID控制算法优点:由于单片机输出是增量,所以误动作小。算法不需要累加,控制增量只与第K次采样值有关。

三、C语言实现增量式PID算法

clip_image028

clip_image030

以上就是PID控制的完整代码,是不是很简单呢?

比如要用电压来控制马达的转速,在气道得到一个稳定的压力。在气道的压力产生变化时,用PID算法使气道的压力快速回到设定的压力。

电压和压力是一个线性关系,函数为:

压力=8.62*电压-7.03

程序中首先调用

incPIDinit();

设置PID控制器的P,I,D系数,初始化PID结构变量。

设置PID控制器的给定目标PID.setpoint。

PID_setpoint(&PID,Pressure_Temp);

然后周期性执行下面两条语句就可以实现目的。

PID.sum_error+=incPIDcalc(&PID,Pmeasure);

MotoVal=(PID.sum_error+7.03)/8.62;//电压与实测压力的函数 /压力=8.62*电压-7.03

Pmeasure是当前实测的压力,incPIDcalc()函数实现增量式PID公式,

PID.sum_error是PID控制器的输出值,值根据incPIDcalc()计算的△u(k)值调整,当△u(k)为正时增加,当△u(k)为负时减小,达到稳定气道压力的目的。PID.sum_error初始值可以设置为设定的压力,这样PID控制器可以更快稳定到设定值。

四、PID参数整定

一般采用凑试法,对参数实行先比例,后积分,再微分的整定步骤。

1、 比例系数由小到大,然后找出超调小的Kp。

2、 积分时间常数Ti由大变小,适当调整Kp。

3、 微分时间常数Td由小变大,适当调整Ti和Kp。

发表评论

电子邮件地址不会被公开。 必填项已用*标注