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

低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计

人工智能 麻辣小蘑菇 2677次浏览 0个评论

写在前面

  在上一节中我们讲到了测绘小车的基本架构。今天我们来一起学习机器人的下位机。   我们测绘小车的下位机采用STM32F103RCT6,下位机的四个基本功能为:  

  1. 接收轮胎编码器的数据获取机器人轮胎里程,同时对轮胎进行控制
  2. 驱动两路舵机实现二维云台的控制
  3. 与Linux处理器进行通讯,执行Linux处理器的控制指令,并上传硬件状态
  4. 其他功能(电量采集,蜂鸣器,灯光控制等)

  下面我们来学习机器人STM32对轮胎的控制:  

基于STM32+A4950芯片的机器人里程驱动设计

 

轮胎驱动的硬件连接

  我们使用两块A4950芯片实现对机器人两路轮胎控制电机的驱动;A4950的功能与TB6612FNG类似,不同点在于:TB6612FNG有2路Pin控制电机正反转,1路PWM输入信号(也就是说一个电机需要三个引脚控制)。而A4950使用两路输入的信号差分进行正反转和速度的控制,如下图:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   我们使用下面的电路图来实现电机的驱动,其中Header6代表了两个电机的接口,其中两个电机的驱动输入分别对应STM32的PB6,PB7(左侧电机)以及PB8,PB9(右侧电机)。两个电机的编码器对应PA0,PA1(左侧电机,Timer5的CH1和CH2)以及PA2,PA3(右侧电机,TIM2的CH3和CH4)   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计  

轮胎驱动的软件设计

 

PWM输出驱动信号

  STM32RCT6的TIM4可以生成4路独立的PWM信号,我们使用前两路的差分PWM控制左侧轮子,使用3,4路PWM控制右侧轮子。软件程序流程如下:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   我们首先配置好TIM,其中包括基础TIMER与PWM功能:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   PWM定时器初始化完成后,就可以使用下面这个语句控制四个通道的PWM:   TIM4->CCR1 =[电机1—CH1] TIM4->CCR2 =[电机1—CH2] TIM4->CCR3 =[电机2—CH1] TIM4->CCR4 =[电机2—CH2]   完整的函数可以这样:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计  

电机的编码器里程反馈

  为了使轮胎控制形成闭环,必须要实现轮胎的里程计反馈。我买的机器人电机上带有正交编码器,STM32可以将一路Timer的两个捕获输入用于正交编码以获取轮子的转动方向和转动角度。   我们购买的电机为6端子直流减速电机(2端子为电机电源输入,4端子为编码器相关),我们以一个6线端子表示表示电机;它与STM32的连接如下:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   读取编码器的数值可以采用两种不同的方法:  

  • 使用Timer对应的正交编码器,这种方式适用于轮速非常快且编码器分辨率的机器人。
  • 使用EXTI外部中断,适用功能较为复杂(需要更多Timer)的机器人。

  我们使用EXTI外部中断的方式来捕获机器人编码器数据:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   初始化完成以后,我们可以通过以下两个中断函数获得左右轮胎编码器的数值:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   注意:轮胎转速非常快,分辨率特别高时时,会出现编码器大量占用CPU资源的现象,此时我们需要想一些新的策略(不过正常情况下时不用的):   现在我们完成了轮胎驱动以及编码器的读取初始化,同时可以通过几个简单的函数读取到相关数值。   接下来我们测试以下: 首先,我们写一个测试main函数:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   拿出我们的小车,使用Keil配合ST-Link的调试模式(如图,不懂的可以文末联系方式小窗我),监控轮胎的运动和编码器的状态:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计  

微分算法——机器人电机控速巡航

  我们通电,5秒后电机转起来了,但是用手一按就停下了。   这种直接用PWM控制的方式叫做开环控制,是无法精确控制速度的。为了控制电机,我们需要引入闭环反馈控制,可以理解为常见的PID控制算法。   传统的PID算法比较适用于小型电机,但是PID的参数调整过于困难,所以我们使用了微分算法,可以大大减少我们调参的工作量,微分算法的具体思想可以参考我之前在csdn的博客。   要控制机器人的定速,那么我们要实时读取机器人轮胎的数据,并进行反馈调整相关的PWM参数,如下图:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   我们使用一个间隔20ms的主循环函数,来调整电机速度。   第一步,初始化Timer寄存器(我们用Timer2):   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   第二步:在Timer中加入中断程序,判断电机的实时速度:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   程序中的PULSE_PER_METER对应电机转动1米输出的脉冲数。我们调试的方法测试这个值,发现轮子转一圈输出205个脉冲,而我们轮子的直径是70mm(0.07m),所以我们可以精确计算出轮子的每转动一米的脉冲数:   我的没米脉冲数大概为933个。但是不同的电机轮子右不同的脉冲数量。   第三步:反馈调节PWM占空比   在这里就使用了我们的微分函数(跟PID差不多),我把代码沾上来:   低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计   再配合之前的PWM控制程序,就完成了轮子的实时调速了。  

本章小结和下节预告

  本章我们一起学习了智能车使用STM32驱动一双轮子,一般情况下我们可以使用L298N,TB6612FNG,A4950等芯片进行轮子驱动。每个芯片的驱动方式不同,有两线和三线驱动的。   我们使用的A4950使用两线PWM驱动。使用一路Timer(Timer4)做PWM输出,一路Timer做电机回环控制(Timer2);两路EXTI做编码器里程计读取。   下一节我们将学习机器人底盘的舵机驱动与下位机/上位机的串口通讯机制。  


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明低成本3D空间导航/测绘机器人(2)——基于STM32+A4950芯片的机器人里程驱动设计
喜欢 (0)

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

加载中……