在机器人控制中,单片机(Arduino/STM32)与上位机(Raspberry Pi/NVIDIA Jetson nano)之间的通信经常采用串口通信的方式,那应该如何使用STM32的串口通信以及根据自己定义的协议来完成数据的接收与发送呢?在本篇文章中将给你演示如何通过自定协议来完成对电机的控制以及获取编码器的值,跟着我们的配置步骤,你会发现一切如此的简单!
本篇文章依旧采用我们的机器人控制板进行开发,关于电机的相关配置以及驱动代码可以参考前面的文章,本文着重介绍串口通信部分!
‘e’ 反馈两个电机的编码器脉冲计数值,该计数值达到最大值或最小值时自动清零。
’m’ l_speed r_speed ’m’为控制标志,l_speed为左轮的速度值,r_speed为右轮的速度值,该值单位为 cm/s
为了提高串口通信的效率,减少因为字节传输而不断引起中断导致资源的浪费,可以采用DMA+串口空闲中断的方式对数据进行接收。
DMA
DMA:Direct Memory Access,可以实现一个数据从一个地址空间拷贝到另一个地址空间,并且在数据拷贝过程中无需CPU的干预,在数据拷贝结束后才告知CPU进行处理。因此使用DMA功能可以释放CPU资源。

串口空闲中断
普通的串口处理数据方式为单字节接收,并且接收一帧数据时,需要自行判断帧头帧尾确定是否为一帧完整数据,并且当数据量大会导致频繁进入中断。而采用串口空闲中断,在串口空闲时(发送完一帧数据)产生中断,并且可以在中断服务函数中计算得到的数据长度,对整帧数据进行处理。
STM32CubeMX中的配置
在串口1配置中打开DMA功能,其余配置可参考之前的工程

创建好工程后,打开工程文件中的stm32f1xx_it.c,找到串口1的中断服务函数,在中断服务函数中加入以下代码。
并且在main函数中的主循环开始前加入使能语句
主循环中的代码如下:
当发送“m 0 0”时,电机停止,并返回“OK”表示已经成功设置两轮速度


当发送“m 10 10”时,左右轮以10cm/s的速度转动


若要向反方向运动,则发送负的速度值,例如发送“m -10 -10”时,左右轮以10cm/s反向转动


当发送“e”时,可以得到当前编码器脉冲计数值。

这样控制板和上层设备之间的基本的串口控制和通信就建立好啦,快去试试效果吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/146767.html