智能车制作

标题: 函数返回值一直为0的问题 [打印本页]

作者: 沉默遇上寡言    时间: 2013-4-22 13:28
标题: 函数返回值一直为0的问题
下面的函数返回值一直为0是怎么回事     我主函数里ceshi=IncPIDCalc(15);      出来结果也是0     


int IncPIDCalc(int NextPoint)//PID算法
{
   int iError,iIncpid; //当前误差
   iError = sptr->SetPoint - NextPoint; //增量计算
  iIncpid = sptr->Proportion * iError //E[k]项
             -sptr->Integral * sptr->LastError //E[k-1]项
             + sptr->Derivative * sptr->PrevError; //E[k-2]项
    sptr->PrevError = sptr->LastError; //存储误差,用于下次计算
    sptr->LastError = iError;
    return(iIncpid);
//返回增量值
}


作者: 机遇    时间: 2013-4-22 13:53
不要用返回值了 用全局变量试试
作者: exiao    时间: 2013-4-22 14:07
在函数里设置断点,看下变量的值
作者: 沉默遇上寡言    时间: 2013-4-22 14:07
机遇 发表于 2013-4-22 13:53
不要用返回值了 用全局变量试试

用全局也是一样啊

作者: 沉默遇上寡言    时间: 2013-4-22 14:41
exiao 发表于 2013-4-22 14:07
在函数里设置断点,看下变量的值

晕死  把结构体去掉就行了    我表示对C语言表示很神秘啊   好多都莫名其妙   

作者: 249176669    时间: 2013-4-22 14:53
沉默遇上寡言 发表于 2013-4-22 14:41
晕死  把结构体去掉就行了    我表示对C语言表示很神秘啊   好多都莫名其妙

结构体使用方法不正确?

作者: 沉默遇上寡言    时间: 2013-4-22 15:18
249176669 发表于 2013-4-22 14:53
结构体使用方法不正确?

我是看不出有啥问题    你们看看    去掉结构体就OK了   不知道是我哪里弄错了

typedef struct PID
{
    int SetPoint; //设定目标 Desired Value
    int Proportion; //比例常数 Proportional Const
    int Integral; //积分常数 Integral Const
    int Derivative; //微分常数 Derivative Const
    int LastError; //Error[-1]
    int PrevError; //Error[-2]
} PID;
#define P_DATA 2
#define I_DATA 0
#define D_DATA 0
#define HAVE_NEW_VELOCITY 0X01//反馈

static PID sPID;
static PID *sptr = &sPID;

void IncPIDInit(void)//初始化PID
{
sptr->LastError = 0; //Error[-1]
sptr->PrevError = 0; //Error[-2]
sptr->Proportion = P_DATA; //比例常数 Proportional Const
sptr->Integral = I_DATA; //积分常数Integral Const
sptr->Derivative = D_DATA; //微分常数 Derivative Const
sptr->SetPoint =10; //目标是100
}

int IncPIDCalc(int NextPoint )//PID算法
{
   int iError;int iIncpid; //当前误差
  iError = sptr->SetPoint - NextPoint; //增量计算
  iIncpid = sptr->Proportion * iError //误差
             -sptr->Integral * sptr->LastError //前次误差
             + sptr->Derivative * sptr->PrevError; //前前次误差
    sptr->PrevError = sptr->LastError; //存储误差,用于下次计算
    sptr->LastError = iError;
    return(iIncpid);
//返回增量值
}






欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2