最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

PID及前馈个人理解

来源:动视网 责编:小OO 时间:2025-09-29 06:27:17
文档

PID及前馈个人理解

pid总的时间过程是过完一个周期时间反馈一次还是每两个点时间???floatKp=43.0f,Ki=0.02f,Kd=0.0f;//放置在开始主函数之前(声明部分地方)staticint16Ierror=0,Derror,Derror1=0;Uint16sdata1;int16Err;Uint16CurrentPosition;if(Control_En==1){CurrentPosition=EvaRegs.T2CNT;//反馈值Err=Position_Command-CurrentPos
推荐度:
导读pid总的时间过程是过完一个周期时间反馈一次还是每两个点时间???floatKp=43.0f,Ki=0.02f,Kd=0.0f;//放置在开始主函数之前(声明部分地方)staticint16Ierror=0,Derror,Derror1=0;Uint16sdata1;int16Err;Uint16CurrentPosition;if(Control_En==1){CurrentPosition=EvaRegs.T2CNT;//反馈值Err=Position_Command-CurrentPos
pid 总的时间过程是过完一个周期时间反馈一次还是每两个点时间???

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!

}

文档

PID及前馈个人理解

pid总的时间过程是过完一个周期时间反馈一次还是每两个点时间???floatKp=43.0f,Ki=0.02f,Kd=0.0f;//放置在开始主函数之前(声明部分地方)staticint16Ierror=0,Derror,Derror1=0;Uint16sdata1;int16Err;Uint16CurrentPosition;if(Control_En==1){CurrentPosition=EvaRegs.T2CNT;//反馈值Err=Position_Command-CurrentPos
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top