具体如下:
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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)