当前位置:   article > 正文

双电机同步PID调试方法(二)_两台电机编码器脉冲数做pid调整同步

两台电机编码器脉冲数做pid调整同步

        由于双电机的PID上升曲线难以完全重合,造成左右电机速度不一致。本文为了解决该问题设计了一种方法。
        主要思想是将不同速度对应的PWM占空比曲线拟合出来,减1000(总10000)占空比后作为预设值给PID,然后在预设值的基础上调左右电机的PID。这样控制的时候,左右电机在不同速度下都只需要PID控制1000的区域。具体步骤分为三步:

第二步:将拟合后的曲线插入模型中,在预设值基础上调前进后退的PID

1. 在simulink中插入拟合后的曲线;

 2. 在拟合曲线的基础上调PID参数,让两条曲线尽量靠近。(上图是累积误差,下图是两个电机的速度曲线)

 3. 在simulink中调试成功后,将需要代码的内容,放在一个模块中,打包代码,生成.c文件。

(1)模型中将所有需要打包的部分,放在Motor的模块(自己起任意的名字)中。

 (2)点击打包代码

 (3)一路next,下面两页需要配置

System页中,需要选择Subsystem,如果你有多个模块,需要自己选择。

Word Size页中,需要选择自己单片机的型号,我的是STM32 

 (4)获取生成的代码,融入keil工程中。

生成的代码一般在matlab根目录下,xxx_ert_rtw的文件夹中,需要xxx.c、xxx.h、rtwtypes.h。

第三步:将打包的算法融入到keil工程中

(1)将xxx.c导入到工程中,头文件包含进来。

(2) 将参数输入,运行算法,获取输出结果。

  1. // PID control
  2. rtU.In1 = enc0_signed; // 左电机速度(100ms内编码器感应次数)
  3. rtU.In2 = enc1_signed; // 右电机速度
  4. rtU.In3 = pwr0; // 左电机目标速度
  5. rtU.In4 = pwr1; // 右电机目标速度
  6. rtU.In5 = servo_duty; // 舵机旋转角度
  7. rtU.In6 = TIME_INTERVAL; // 运行间隔,100ms/20ms,自己定义
  8. Motor_step(); // PID调整
  9. pwr0 = rtY.Out1; // 输出左电机PWM
  10. pwr1 = rtY.Out2; // 输出右电机PWM
  11. servo_pwm = rtY.Out3; // 输出舵机PWM

        最终,上位机只需要发送0.2m/s的指令,底盘自己控制达到对应速度,从而做到控制算法与决策算法的隔离,方便调试。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/429149
推荐阅读
相关标签
  

闽ICP备14008679号