keil 做PID控制时,浮点数历史误差累加值被无规律变0
时间:10-02
整理:3721RD
点击:
一个温控项目,用到PID运算,历史误差累加值,经常无规律的变为接近0,不知道问题出在哪里
#define Proportion 0.05
#define Integral 0.0002
#define Derivative 4
int xdata dError,LastError,num_counter,open_duty;
int setPoint;
float xdata SumError=0.0;
int Error;
float xdata real_error;
每3秒值执行一下PID调整运算,SumError经常无规律变为0,可是没有理由啊,加热也还未到设定点。
============================================*/
void auto_adjust(int NextPoint)
{
int i;
int xdata i1,i3,i4,i5;
float xdata i6;
long xdata i6a;
float xdata i2;
long xdata i2a;
Error = setPoint - NextPoint; // 偏差
if(Error > 500)
{
open_duty = 50;//全开通
}
else
{
SumError += Error; // 积分
dError = Error - LastError; // 当前微分
LastError = Error; CLWDT;
real_error = SumError*Integral + Proportion*Error+ Derivative * dError; CLWDT;
i1=Proportion*Error;i2=(SumError*Integral);i3=Derivative * dError;i5=real_error;CLWDT;
open_duty = (int)(real_error+0.5);
}
#define Proportion 0.05
#define Integral 0.0002
#define Derivative 4
int xdata dError,LastError,num_counter,open_duty;
int setPoint;
float xdata SumError=0.0;
int Error;
float xdata real_error;
每3秒值执行一下PID调整运算,SumError经常无规律变为0,可是没有理由啊,加热也还未到设定点。
============================================*/
void auto_adjust(int NextPoint)
{
int i;
int xdata i1,i3,i4,i5;
float xdata i6;
long xdata i6a;
float xdata i2;
long xdata i2a;
Error = setPoint - NextPoint; // 偏差
if(Error > 500)
{
open_duty = 50;//全开通
}
else
{
SumError += Error; // 积分
dError = Error - LastError; // 当前微分
LastError = Error; CLWDT;
real_error = SumError*Integral + Proportion*Error+ Derivative * dError; CLWDT;
i1=Proportion*Error;i2=(SumError*Integral);i3=Derivative * dError;i5=real_error;CLWDT;
open_duty = (int)(real_error+0.5);
}
觉得应该是keil 数据类型转换的问题,
可是我用软件仿真没有出现转换错误。
用在硬件上运行,就可能出现这问题。
硬件原因我也大致查找了,无干扰复位。也加强了地线,屏蔽,远离干扰源。而且程序其它数值运行一直正常。就这个SumError偶尔跳回0附近。
如果这个值不出问题,温度可以稳定为99.8---100.5之间。性能还算可以。
定义为long就对了。
但还是有点疑问,软件仿真时就没出这个错。