
float Kp=43.0f,Ki=0.02f,Kd=0.0f; //放置在开始主函数之前(声明部分地方)
static int16 Ierror=0,Derror,Derror1=0;
Uint16 sdata1;
int16 Err;
Uint16 CurrentPosition;
if(Control_En==1)
{
CurrentPosition=EvaRegs.T2CNT; //反馈值
Err=Position_Command-CurrentPosition; //偏差
Ierror=Ierror+Err; //积分部分
if(Ierror>9000)
Ierror=9000;
if(Ierror<-9000)
Ierror=-9000;
Derror=Err-Derror1; //微分部分
//sdata1=Ierror;
sdata1=30298+Kp*Err+Ki*Ierror+Kd*Derror; //PID校正后的位置
mcbsp_xmit(sdata1); //send the data
Derror1=Err;
// sdata1=0x7ed0;
while(!McbspaRegs.SPCR2.bit.XEMPTY){}//Important!
}
30298 // 初始位置
PID+前馈:
float Kp=43.0f,Ki=0.02f,Kd=0.0f; //PID校正的参数定义
Uint16 Uf1=3800,Uf2=300; //前馈参数的定义
static int16 Ierror=0,Derror,Derror1=0,Uf,Drin1=0,Drin2=0,Drin3;
Uint16 sdata1;
int16 Err;
Uint16 CurrentPosition;
if(Control_En==1) //高电平显示工作状态
{
CurrentPosition=EvaRegs.T2CNT;
Err=Position_Command-CurrentPosition;
Ierror=Ierror+Err; //积分部分
if(Ierror>9000)
Ierror=9000;
if(Ierror<-9000)
Ierror=-9000;
Derror=Err-Derror1; //微分部分
Drin3=Position_Command-Drin1; // 两次理论位置的差值
Uf=Uf1*Drin3+Uf2*(Drin3-Drin2); //前馈部分
//sdata1=Ierror;
sdata1=30298+Kp*Err+Ki*Ierror+Kd*Derror+Uf; //PID和前馈校正后的位置
mcbsp_xmit(sdata1);//send the data
Derror1=Err; //对参数进行定义进行下一步操作准备
Drin1=Position_Command; //理论位置
Drin2=Drin3; //本次的理论位置之差
while(!McbspaRegs.SPCR2.bit.XEMPTY){}//Important!
}
//计算速度分析: ?注意时间问题是两点之间距离的时间还是每个周期的总时间
每50ms运动过1000个点(时间是可以设的,1000个是固定的)。两点之间的时间50/1000ms 本次运动点的位置是CurrentPosition
上次点的位置是c 两点之间的距离为p p=CurrentPosition-c
float Kp=43.0f,Ki=0.02f,Kd=0.0f;
static int16 Ierror=0,Derror,Derror1=0,Uf,Drin1=0,Drin2=0,Drin3,p,c=32767;
Uint16 sdata1;
int16 Err;
Uint16 CurrentPosition;
if(Control_En==1)
{
CurrentPosition=EvaRegs.T2CNT;
p=(CurrentPosition-c)*1000/50;
Err=Position_Command-CurrentPosition;
Ierror=Ierror+Err;
if(Ierror>9000)
Ierror=9000;
if(Ierror<-9000)
Ierror=-9000;
Derror=Err-Derror1;
Drin3=Position_Command-Drin1;
Uf=Uf1*Drin3+Uf2*(Drin3-Drin2);
//sdata1=Ierror;
sdata
1=30298+Kp*Err+Ki*Ierror+Kd*Derror+Uf;
mcbsp_xmit(sdata1);//send the data
Derror1=Err;
Drin1=Position_Command;
Drin2=Drin3;
c=CurrentPosition;
while(!McbspaRegs.SPCR2.bit.XEMPTY){}//Important!
}
