OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2761|回复: 2

PID调节的理解

[复制链接]

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2017-1-12 17:43:14 | 显示全部楼层 |阅读模式
1金钱
准备要调平衡了,在yfrobot.com 上参考了他们的代码;
float PWM, PWM_L, PWM_R;
float err, speed_need = 0,turn_need = 0;  
float position_dot, position_dot_filter, position;
void PID_balance(float vertical)
{
    position_dot = (TIM2_Encoder_Read_1() + TIM4_Encoder_Read_2())*0.5;//编码器值读出
position_dot_filter *= 0.85;
position_dot_filter += position_dot*0.15;
position += position_dot_filter;  //电机行驶距离由position_dot_filter累加而来
position += speed_need; //给小车一定速度
if(position > 100000)            
{
     position = 100000;
}
else if(position < -100000)
{
     position = -100000;
}
err = Roll - vertical;  //得到实际偏差角度
if(err<-40 || err>40)               //角度过大,关闭电机
{  
     M1_1 = 1;
  M1_2 = 1; //电机1刹车
  M2_1 = 1;
  M2_2 = 1; //电机2刹车
     return;
}
PWM = err*PID_value.p
       + (gyro[0]-11)*0.0153*PID_value.d*0.1 //静止初始化时 gyrox=11       *0.0153将单位换算为(°/s)
       - position_dot_filter*PID_value.kp*0.1   
    - position*PID_value.kd*0.001;  
PWM_L = PWM + turn_need ;
PWM_R = PWM - turn_need ;
Motor_Speed_Control(PWM_L, PWM_R);   //电机输出
}

先说我的理解;这里PID引入一个角度环,一个速度环;如果只是站立,应该只有角度换就行了(没有突然施加的外力来打破平衡;)
那么,这里就可以理解为:PWM = P*角度+D*角速度;
那么,我想问,这跟增量式有什么关系?

与其感慨路难行,不如马上出发
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
 楼主| 发表于 2017-1-12 17:52:00 | 显示全部楼层
大家谈谈对这段代码的理解吧
与其感慨路难行,不如马上出发
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-1-13 22:10:06 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-30 11:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表