编辑: 此身滑稽 2019-07-09

1 PID 的诊定.凑试法,临界比例法,经验法.

2 T 的确定,采样周期应远小于过程的扰动信号的周期,在小车程序中一般是 ms 级别.

3 目标速度何时赋值问题,如何更新新的目标速度?这个问题一般的人都乎略了.目标速度 肯定不是个恒定的,那么何时改变目标速度呢?

4 改变了目标速度,那么 e(k) e(k-1) e(k-2)怎么改变呢?是赋

0 还是要怎么变?

5 是不是 PID 要一直开着?

6 error 为多少时就可以当速度已达到目标?

7 PID 的优先级怎么处理,如果和图像采集有冲突怎么办?

8 PID 的输入是速度,输出是 PWM,按理说 PWM 产生速度,但二者不是同一个东西,有 没有问题?

9 PID 计算如何优化其速度?指针,汇编,移位?都可以试! //定义 PID 结构体 typedef struct PID { int SetPoint;

//设定目标 Desired V alue double Proportion;

//比例常数 Proportional Const double Integral;

//积分常数 Integral Const double Derivative;

//微分常数 Derivative Const int LastError;

//Error[-1] int PrevError;

//Error[-2] } PID;

//定义相关宏 #define P_DA TA100 #define I_DA TA 0.6 #define D_DA TA

1 #define HAVE_NEW_VELOCITY0X01 //声明 PID 实体 static PID sPID;

static PID *sptr = &sPID;

//PID 参数初始化 void IncPIDInit(void) { sptr->LastError = 0;

//Error[-1] sptr->PrevError = 0;

//Error[-2] sptr->Proportion = P_DA TA;

//比例常数 Proportional Const sptr->Integral = I_DA TA;

//积分常数 Integral Const sptr->Derivative = D_DA TA;

//微分常数 Derivative Const sptr->SetPoint =100;

目标是

100 } //增量式 PID 控制设计 int IncPIDCalc(int NextPoint) { 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);

//返回增量值 } Int g_CurrentV elocity;

Int g_Flag;

void main(void) { DisableInterrupt InitMCu();

IncPIDInit();

g_CurrentVelocity=0;

//全局变量也初始化 g_Flag=0;

//全局变量也初始化 EnableInterrupt;

While(1) { if (g_Flag& HAVE_NEW_VELOCITY) { PWMOUT+= IncPIDCalc(CurrentV elocity);

g_Flag&=~ HAVE_NEW_VELOCITY;

} } } //采样周期 T Interrrupt TIME void { CurrentV elocity =GetCurrentVelocity;

g_Flag|= HAVE_NEW_VELOCITY;

}

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题