双电机同步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) 将参数输入,运行算法,获取输出结果。

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

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

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值