编辑: 此身滑稽 | 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;
}