打印

STC单片机PID控制时,浮点数累计误差经常变为0

[复制链接]
1770|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
piaoran|  楼主 | 2017-3-24 19:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个温控项目,用到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);                 
        }

相关帖子

沙发
piaoran|  楼主 | 2017-3-24 19:14 | 只看该作者
SumErro 一直加,有时无规律的变为很小,接近0

使用特权

评论回复
板凳
piaoran|  楼主 | 2017-3-24 22:43 | 只看该作者
觉得应该是keil 数据类型转换的问题,
可是我用软件仿真没有出现转换错误。
用在硬件上运行,就可能出现这问题。
硬件原因我也大致查找了,无干扰复位。也加强了地线,屏蔽,远离干扰源。而且程序其它数值运行一直正常。就这个SumError偶尔跳回0附近。
如果这个值不出问题,温度可以稳定为99.8---100.5之间。性能还算可以。

使用特权

评论回复
地板
airwill| | 2017-3-24 22:50 | 只看该作者
不应该是溢出吧, 会不会是 XDATA 的问题, 试试放到 IDATA 后看看有这问题么

使用特权

评论回复
5
piaoran|  楼主 | 2017-3-24 23:00 | 只看该作者
就是怀疑 data 有问题,才放到xdata的。但问题没有得到解决。

使用特权

评论回复
6
kensilong| | 2017-3-24 23:03 | 只看该作者
积分会饱和的,要设置最大值。虽然是浮点,也会有溢出的可能。

使用特权

评论回复
7
piaoran|  楼主 | 2017-3-24 23:12 | 只看该作者
谢谢提醒,我也设置了最大值,但远远没有达到最大值。

使用特权

评论回复
8
linqing171| | 2017-3-25 13:38 | 只看该作者
real_error  是你的激励信号吧,用来驱动占空比的?这个超过50会怎么样?
setPoint  和 NextPoint 相等的时候是你的理论上的稳态么? 是不是setPoint是100,NextPoint是当前的反馈温度? 此时 error = derror=0,假设散热导致的驱动信号为10,则SumError=10/0.0002=50000, 和你的实测值一致么?

读书的时候玩过pid,你这个是不是叫差分pid? 正常pid应该是 激励信号=误差*p;比如普通的DC-DC都是类似这样, (Vref_set_point-Vfb_monitor)*误差放大器开环放大倍数=>激励信号=>驱动开关占空比。

你的nextPoint变为-1会有什么影响? 你系统有开中断么? 3秒定时准不准?堆栈剩余了多少?函数有递归么? ... ...

使用特权

评论回复
9
piaoran|  楼主 | 2017-3-25 22:43 | 只看该作者
定义为long 就对了

使用特权

评论回复
10
linqing171| | 2017-3-26 09:55 | 只看该作者
那看来我估算的 50000 还是小了一些,65536都到了。你系统的鲁棒性不行啊。

使用特权

评论回复
11
@若水| | 2017-3-27 08:57 | 只看该作者
PID算法一直不会用,一直处于观望中,看到你们会用的,真的好崇拜啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

17

帖子

0

粉丝