• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

人工智能 小虎哥哥爱学习 2491次浏览 0个评论

摘要

运动底盘是移动机器人的重要组成部分,不像激光雷达、IMU、麦克风、音响、摄像头这些通用部件可以直接买到,很难买到通用的底盘。一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的;另一方面是因为底盘包含软硬件整套解决方案,是很多机器人公司的核心技术,一般不会随便公开。出于强烈的求知欲与学习热情,我想自己DIY一整套两轮差分底盘,并且将完整的设计过程公开出去供大家学习。说干就干,本章节主要内容: 1.stm32主控硬件设计 2.stm32主控软件设计 3.底盘通信协议 4.底盘ROS驱动开发 5.底盘PID控制参数整定 6.底盘里程计标


2.stm32主控软件设计

上一节搭建好了底盘的stm32主控硬件,现在就来说说怎么开发配套的stm32软件。关于建立stm32工程、使用stm32开发库、stm32软件调试方法等基础知识就不多说了,有需要的可以查阅相关资料学习,我觉得http://www.openedv.com《正点原子》的开发资料写的还可以。我就直接从底盘控制的项目入手,直接进行项目中各个功能需求开始分析讲解,如图11,是我的底盘控制stm32工程项目。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图11)底盘控制stm32工程项目

2.1.电机控制

电机控制分为两个部分(电机转向控制、电机转速控制),这些都集成在了电机驱动芯片TB6612FNG里面,所以只需要用单片机的IO口产生控制转向的高低电平和控制转速的PWM波就能实现。   首先,初始化IO口作为输出脚,用于产生高低电平输出来控制转向,实例代码如图12。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图12)电机转向控制IO口初始化

  然后,用通用定时器TIM4的通道CH1和CH2分别产生两路PWM输出用于两个电机的转速控制,定时器默认引脚分配如图13。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图13)stm32定时器通道默认引脚分配

  初始化通用定时器TIM4的通道CH1和CH2为PWM输出,实例代码如14。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图14)电机转速控制IO口初始化

  最后,将电机转向和速度控制的操作封装在一个函数中,便于其它地方调用,实例代码如图15。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图15)电机转向和速度控制封装

2.2.编码器数据读取

编码器对底盘来说至关重要,一方面底盘通过编码器的反馈进行PID闭环速度控制,另一方面底盘通过编码器进行航迹推演得到里程计用于后续的定位与导航等高级算法中。这里用到的编码器是正交编码器,所以直接使用通用定时器的输入捕获中的编码器模式来读取编码器。采用通用定时器TIM2的通道CH1和CH2捕获encoder1的A相和B相脉冲,采用通用定时器TIM3的通道CH1和CH2捕获encoder2的A相和B相脉冲。   先初始化TIM2作为编码器encoder1的捕获,实例代码如图16。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图16)初始化TIM2作为编码器encoder1的捕获

  然后,将读取编码器计数值的操作封装在一个函数中,便于其它地方调用,实例代码如图17。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图17)读取编码器encoder1计数值封装

  最后,编写TIM2计数溢出时的中断处理函数,实例代码如图18。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图18)TIM2计数溢出中断处理函数

  同理可得TIM3捕获encoder2的代码实现,这里就不在赘述了。  

2.3.串口数据收发

串口2是数据接口,负责接收上位机发送过来的控制指令,同时将编码器值返回给上位机;串口1是debug接口,负责接收上位机发送过来的版本信息请求、PIDm默认值恢复、PID值设定等调试指令,同时将程序中的debug打印信息返回给上位机。但是在底盘正常工作时,只需要连接串口2;串口1是预留出来给有需要自己动手修改PID参数使用的。   首先,配置串口1,先对串口1的输出进行printf函数打印支持,实例代码如图19。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图19)串口1的输出进行printf函数打印支持

  然后,初始化串口1,实例代码如图20。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图20)初始化串口1

  最后,编写串口1接收中断处理函数,此函数主要进行对上位机发过来的数据进行协议解析,实例代码如图21。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图21)串口1接收中断处理函数

  接下来,介绍串口2,初始化串口2,实例代码如图22。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图22)初始化串口2

  然后,将串口2发送数据的操作封装到函数中,便于其它地方调用,实例代码如图23。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图23)串口2发送数据封装

  最后,编写串口2接收中断处理函数,此函数主要进行对上位机发过来的数据进行协议解析,实例代码如图24。  

SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图24)串口2接收中断处理函数

  到这里,串口有1和串口2的数据发送与接收都编写好了,依据我们定义的usart2数据通信协议和usart1调试通信协议,上位机就可以编写对应的程序来跟底盘的串口2和串口1进行通信了。关于通信协议的具体内容,将在后续做展开。  

2.4.电机速度PID控制

我在底盘中采用的是增量型PID算法,编程涉及到的数学表达式有3个,分别是: SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计   将这3个数学表达式封装到函数中,便于其它地方调用,实例代码如图25。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图25)串口2接收中断处理函数

  电机1与电机2采用同样的PID算法,所以电机2的PID算法代码实现就不赘述了。关于PID参数的整定方法,将在后续做展开。  

2.5.周期性控制

通过上面的讲解,各个模块的驱动代码都准备就绪了,现在需要产生一个周期性的过程,在里面实现编码器计数值采样、PID控制等具体实现。这里采用定时器TIM1产生一个周期性的中断,在中断处理函数中实现各模块的具体操作。   首先,配置定时器TIM1,实例代码如图26。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图26)配置定时器TIM1

  然后,编写中断处理函数,实例代码如图27。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图27)TIM1中断处理函数

2.6.stm32主控软件整体框图

通过上面的讲解,对底盘控制的stm32程序实现有了一定的了解,接下来就来做一个总结。

  先来看看main()函数实现,如图28。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

(图28)main()函数实现

  结合上面TIM1中断处理函数,不难发现,整个stm32程序的执行过程:   a.在main()函数中初始化各个模块; b.TIM1中断处理函数周期性的读取编码器值、反馈获取的编码值、PID控制; c.剩下的就是串口1和串口2的通信交互。   具体stm32主控软件整体框图如图29。   SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计 (图29)stm32主控软件整体框图   需要说明的是,在周期性循环体中,要首先读取编码器的值,来保证严格的等间隔采样。  


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计
喜欢 (0)

您必须 登录 才能发表评论!

加载中……