打印

C程序中的错误

[复制链接]
2160|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjucsd|  楼主 | 2010-6-11 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uchar PIDCalc(uint setpoint,uint nextpoint)
{
   int  idata Error;
   int  idata dError;
   int  idata freecont;
   uchar idata com;
//pid算法部分
   Error = (int)(setpoint - nextpoint) ;
   SumError = (int)(SumError + Error);
   dError = (int)(lasrError - PrevError);
   PrevError = lasrError;
   lasrError = Error;
   
   freecont += (int)(Error * KPConst);
   
   freecont += (int)(SumError * KIConst);
   freecont += (int)(dError * KDConst);
   if(freecont <= 0)
   {
           com = 0;
   }
   else if(freecont > 200)
   {
      com = 200;
   }
   else
   {
      com = (freecont & 0xff);
   }

   return (com);
}
好心的大哥大姐,帮我看看,这个程序中什么地方出错了?本人最后获得的返回值总是错误的!!!

相关帖子

沙发
egood| | 2010-6-11 15:38 | 只看该作者
应该使用静态变量,改为:
   static int  idata Error=0;
   static int  idata dError=0;
   static int  idata freecont=0;
   static uchar idata com=0;

使用特权

评论回复
板凳
zjucsd|  楼主 | 2010-6-11 15:51 | 只看该作者
为什么呢?

使用特权

评论回复
地板
zjucsd|  楼主 | 2010-6-11 15:58 | 只看该作者
试了一下,发现freecont一直在累加,使得com一直为200

使用特权

评论回复
5
egood| | 2010-6-11 16:12 | 只看该作者
刚才有点问题,只需要freecont改为静态变量:

static int  idata freecont=0;

因为这个变量看上去需要保持它的值

使用特权

评论回复
6
zjucsd|  楼主 | 2010-6-11 16:14 | 只看该作者
freecont需去除static;
但是为什么Error、dError两个变量需要变成静态变量呢?
好心的过路人帮忙解决一下!!!

使用特权

评论回复
7
tianya1977| | 2010-6-11 19:57 | 只看该作者
(freecont & 0xff) 得出的值是INT型 与 com 不匹配.

使用特权

评论回复
8
yuyetufu| | 2010-6-11 22:17 | 只看该作者
freecont += (int)(Error * KPConst);
freecont 初始值是多少?

返回值错误是怎么个错误法?

使用特权

评论回复
9
zjucsd|  楼主 | 2010-6-12 07:35 | 只看该作者
uchar PIDCalc(uint setpoint,uint nextpoint)
{
   static int  idata Error = 0;
   static int  idata dError = 0;
   int  idata freecont = 15000;
   uchar idata com = 0;

//pid算法部分

   Error = (int)(setpoint - nextpoint) ;
   SumError = (int)(SumError + Error);
   dError = (int)(lasrError - PrevError);

   PrevError = lasrError;
   lasrError = Error;
   
   freecont += (int)(Error * KPConst);
   
   freecont += (int)(SumError * KIConst);

   freecont += (int)(dError * KDConst);

   if(freecont <= 15000)
   {
      com = 0;
   }
   else        if(freecont > 15200)
   {
      com = 200;
   }
   else
   {
      com = (freecont - 15000) & 0xff;
   }

   return (com);
}
程序这样修改后,就没有问题了!但是我还是不明白为什么Error、dError两个变量需要变成静态变量呢?

使用特权

评论回复
10
gdqinci| | 2010-6-12 09:30 | 只看该作者
PID算法是什么??一直有听人家说,但没认真研究过,是不是一种程序算法?

使用特权

评论回复
11
sytu_chyq| | 2010-6-12 10:10 | 只看该作者
怎么感觉Error、dError两个变量改成静态变量对程序没啥影响呢
PID算法是控制算法,比例积分微分。。

使用特权

评论回复
12
zjucsd|  楼主 | 2010-6-12 10:42 | 只看该作者
我猜测是不是Error、dError不是静态变量的时候,在运算过程中,被影响从而导致改变了数据!

使用特权

评论回复
13
foolkun| | 2010-6-12 12:39 | 只看该作者
Error、dError是偏差和变差变化量,偏差变化量跟上一次的偏差有关系,所以在调用这段程序的时候,不能丢到之前的计算结果,需要让他保持不变,所以需定义成静态的,或者是全局变量。按照你之前的做法,每次调用这段程序的时候都丢掉了上一次计算的结果。加之你的变量没有初始化,每次进来的时候那些变量都不知道是什么值(这依赖于你的编译器)。得到错误结果是很正常的事情。

使用特权

评论回复
14
foolkun| | 2010-6-12 12:41 | 只看该作者
建议看看C语言基础:局部变量、全局变量、静态变量是怎样分配的,又是怎么样释放的。这样就能明白是怎么回事了!

使用特权

评论回复
15
cooklxq| | 2010-6-12 13:24 | 只看该作者
只是一个子程序吧!!!!

使用特权

评论回复
16
zjucsd|  楼主 | 2010-6-12 15:59 | 只看该作者
是的

使用特权

评论回复
17
gdqinci| | 2010-6-14 09:03 | 只看该作者
谢谢主11楼的兄弟

使用特权

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

本版积分规则

100

主题

351

帖子

3

粉丝