单片机如何写PID程序?

单片机如何写PID程序?,第1张

具体如下:

1、如果加入D抖动的特别厉害,试试只用PI控制。

2、还有PID参数都是一步一步调出来的,我建议你做个上位机,就是个简单的VB串口程序,用来设置PID参数

3、然后在单片机这边弄个串口接收程序,这里就是个简单的串口程序,人人都会,把接收到的PID存储在缓冲区里。

4、然后单片机程序直接调用。单片机带EEPROM的话,当接收到改变的PID参数时,存储这些参数。去STC官网下你的单片机资料,上面有EEPROM测试程序,直接套用。

作者: 风中的歌

最近从网上看到了一种对PID的解释,比较通俗易懂,也好记住,经过自己的整理后说明如下。

控制模型:你控制一个人让他以PID控制的方式走110步后停下。

(1)P比例控制,就是让他走110步,他按照一定的步伐走到一百零几步(如108步)或100多步(如112步)就停了。

说明:P比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。

(2)PI积分控制,就是他按照一定的步伐走到112步然后回头接着走,走到108步位置时,然后又回头向110步位置走。在110步位置处来回晃几次,最后停在110步的位置。

说明:在积分I控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入积分项。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。

(3)PD微分控制,就是他按照一定的步伐走到一百零几步后,再慢慢地向110步的位置靠近,如果最后能精确停在110步的位置,就是无静差控制;如果停在110步附近(如109步或111步位置),就是有静差控制。

说明:在微分控制D中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳,其原因是由于存在有较大惯性组件(环节)或有滞后(

这是C语言的程序用的的积分分离,增量式算法你可以看看~在我用的片子是89C52

/*********************************************************/

/* 名称: float PIDprocess1*/

/* 功能: PID adjust */

/* 说明: */

/* 调用: */

/* 输入: float xdata *Yn, float xdata *Rn */

/* 返回值: deltaPn */

/*********************************************************/

float PIDprocess1()

{

int data E_0

float data deltaPn,deltaPi,deltaPp,deltaPd,PsumCopy

E_0=SetTemperature1-CurrentTemperature1

if(abs(E_0)>Emax)

{

deltaPp=(float)Kp*(E_0-E_11)

deltaPd=(float)Kd*(E_0-2*E_11+E_21)

// if(deltaPd>=dPdmax) deltaPd=0

deltaPn=deltaPp+deltaPd

}

else

{

if(abs(E_0)>E0)

{

deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0)

}

else

{//小误差时的处理

deltaPi=(float)Ki*E_0

// if(fabs(deltaPi)<dPimin) deltaPi=0

}

deltaPp=(float)Kp*(E_0-E_11)

deltaPd=(float)Kd*(E_0-2*E_11+E_21)

// if(deltaPd>=dPdmax) deltaPd=0

deltaPn=deltaPp+deltaPi+deltaPd

}

/* if(fabs(deltaPn)>dPmax)

{

if(deltaPn>0) deltaPn=dPmax

else deltaPn=-dPmax

} */

Psum1+=deltaPn

PsumCopy=Psum1

if(PsumCopy>Pmax) PsumCopy=Pmax

if(PsumCopy<Pmin) PsumCopy=Pmin

E_21=E_11

E_11=E_0

return(PsumCopy)

}

/*********************************************************/

/* 名称: float PIDprocess2 */

/* 功能: PID adjust */

/* 说明: */

/* 调用: */

/* 输入: float xdata Yn, float xdata Rn*/

/* 返回值: Psum2 */

/*********************************************************/

float PIDprocess2()

{

int data E_0

float data deltaPn,deltaPi,PsumCopy

E_0=SetTemperature2-CurrentTemperature2

if(abs(E_0)>Emax)

{

deltaPn=(float)Kp*(E_0-E_12)+(float)Kd*(E_0-2*E_12+E_22)

}

else

{

if(abs(E_0)>E0)

{

deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0)

}

else

{//小误差时的处理

deltaPi=(float)Ki*E_0

}

deltaPn=(float)Kp*(E_0-E_12)+deltaPi+(float)Kd*(E_0-2*E_12+E_22)

}

/* if(fabs(deltaPn)>dPmax)

{

if(deltaPn>0) deltaPn=dPmax

else deltaPn=-dPmax

}*/

Psum2+=deltaPn

PsumCopy=Psum2

if(PsumCopy>Pmax) PsumCopy=Pmax

if(PsumCopy<Pmin) PsumCopy=Pmin

E_22=E_12

E_12=E_0

return(PsumCopy)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12173732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存