STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

这篇具有很好参考价值的文章主要介绍了STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

在机器人控制中,单片机(Arduino/STM32)与上位机(Raspberry Pi/NVIDIA Jetson nano)之间的通信经常采用串口通信的方式,那应该如何使用STM32的串口通信以及根据自己定义的协议来完成数据的接收与发送呢?在本篇文章中将给你演示如何通过自定协议来完成对电机的控制以及获取编码器的值,跟着我们的配置步骤,你会发现一切如此的简单!

本篇文章依旧采用我们的机器人控制板进行开发,关于电机的相关配置以及驱动代码可以参考前面的文章,本文着重介绍串口通信部分!

1 确定串口的数据协议

'e' 反馈两个电机的编码器脉冲计数值,该计数值达到最大值或最小值时自动清零。

'm' l_speed r_speed 'm'为控制标志,l_speed为左轮的速度值,r_speed为右轮的速度值,该值单位为 cm/s

2 配置串口  

为了提高串口通信的效率,减少因为字节传输而不断引起中断导致资源的浪费,可以采用DMA+串口空闲中断的方式对数据进行接收。

DMA

DMA:Direct Memory Access,可以实现一个数据从一个地址空间拷贝到另一个地址空间,并且在数据拷贝过程中无需CPU的干预,在数据拷贝结束后才告知CPU进行处理。因此使用DMA功能可以释放CPU资源。

串口空闲中断

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

STM32CubeMX中的配置

在串口1配置中打开DMA功能,其余配置可参考之前的工程

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

3 编写驱动代码

创建好工程后,打开工程文件中的stm32f1xx_it.c,找到串口1的中断服务函数,在中断服务函数中加入以下代码。

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  uint32_t tmp_flag = 0;
    uint32_t temp;
    tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
    if((tmp_flag != RESET))//idle标志被置位
    { 
      __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
      HAL_UART_DMAStop(&huart1); 
      temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数   
​
      rx_len =  BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
      recv_end_flag = 1;  // 接受完成标志位置1  
    }
  HAL_UART_Receive_DMA(&huart1,uart1_rx_buffer,BUFFER_SIZE);//重新打开DMA接收
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
​
  /* USER CODE END USART1_IRQn 1 */
}

并且在main函数中的主循环开始前加入使能语句

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断
HAL_UART_Receive_DMA(&huart1,uart1_rx_buffer,BUFFER_SIZE);

主循环中的代码如下:

while (1)
  {
    if(recv_end_flag == 1) //串口中断接收标志位
    {
      if(uart1_rx_buffer[0] == 0x6d)  //若接收到'm'
      {
        if(rx_len <=9)  
        {
          leftTargetSpeed = atof(uart1_rx_buffer+1);  //将接收到的字符转换为十进制数
          rightTargetSpeed = atof(uart1_rx_buffer+4);
           if(uart1_rx_buffer[2] == 0x2d)
          {
            leftTargetSpeed = atof(uart1_rx_buffer+1);  //将接收的字符串转换为float类型
            rightTargetSpeed = atof(uart1_rx_buffer+5);
          }
        }
        else if(rx_len > 9)  
        {
          leftTargetSpeed = atof(uart1_rx_buffer+1);
          rightTargetSpeed = atof(uart1_rx_buffer+5);          
        }
      }
      else if(uart1_rx_buffer[0] == 0x65)  //若接收到'e'
      {
        int leftPulse,rightPulse;
        leftPulse = encoderPulse[0];  //获得当前的编码器脉冲值
        rightPulse = encoderPulse[1];
        printf("%d %d\r\n",leftPulse,rightPulse);
      }
      recv_end_flag = 0; //标志位置零等待下一次接收
      rx_len = 0;
      memset(uart1_rx_buffer,0,rx_len); //初始化接收数组
    }
     /* USER CODE END WHILE */
  }

4 测试结果演示

当发送"m 0 0"时,电机停止,并返回"OK"表示已经成功设置两轮速度

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

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

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

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

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

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

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)

这样控制板和上层设备之间的基本的串口控制和通信就建立好啦,快去试试效果吧!文章来源地址https://www.toymoban.com/news/detail-424604.html

到了这里,关于STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32 ARM+ FPGA 的软体机器人的 CAN总线运动控制器的设计

    针对在软体机器人控制时 , 多电机协同控制过程中难度大 、 通用性差 、 协同性差等缺点 , 设计了基于 ARM 和 FPGA 的软体机器人的控制器局域网络 ( controller area network , CAN ) 总线运动控制器 , 采用 ARMCortex-M4 为内核的 STM32F407 开发板和 AX7102 FPGA 开发板设计一种基于 C

    2024年02月13日
    浏览(48)
  • STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!

    01 前言 之前,我们出了一系列的STM32机器人控制开发教程,收到不少小伙伴的反馈,于是我们对教程进行了优化,并将增加新的内容和工具。 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口、SWD下载调试接口、航模遥控接口、USB5V输出接

    2024年02月05日
    浏览(124)
  • 78、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图  六、程序源码 七、资料包括  在当今大规模制造业中,企业为提高生产效率,保障产品质量,普遍重视生产过程的自动化程度,工业机器人作为自动

    2024年02月09日
    浏览(43)
  • 基于STM32F103控制舵机 仿真 简单二轴机器人逆运动学(20220615完成 正在处理三轴)

    本项目基于 正点原子精英(stm32f103zet6) 控制小舵机 模拟 二轴机器人逆运动学控制。 目录 概述: 1. 我的问题总结 2.stm32控制部分 与机械部分 2.1 对于二轴机器人设计 2.2 stm32 输出 pwm 2.3 舵机控制 3.正运动学 3.1 D-H建模下对姿态的描述 4.逆运动学 4.1 几何解法 4.2 代数解法 4.3 多重

    2023年04月20日
    浏览(51)
  • 超详细API插件使用教程,教你开发AI垃圾分类机器人

    本文分享自华为云社区【案例教学】华为云API对话机器人的魅力—体验AI垃圾分类机器人,作者:华为云PaaS服务小智。 体验用Huawei Cloud API开发AI垃圾分类机器人,并学习AI自然语言的情感分析、文本分词、文本翻译等能力。 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为

    2024年02月08日
    浏览(33)
  • 88、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

    单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大。其片内的4K程序存储器是FLASH工艺的,这种单

    2024年02月13日
    浏览(47)
  • 有方机器人 STM32智能小车 项目学习笔记1

    今天开始学习有方机器人--智能小车项目,正点原子部分的学习先放一放,还是小车更有吸引力哈哈。 目前常用的 STM32 的开发方式主要有基于寄存器编程、基于标准库函数编程、基于 HAL 库编程这三种。 寄存器版本---最高效,最直接,需要对STM32内部结构十分了解,难度系数

    2024年02月21日
    浏览(33)
  • 有方机器人 STM32智能小车 项目学习笔记2

    今天是学习有方机器人课程的第二天,通过课程复习GPIO相关知识点,很有收获,老师讲的非常好! 处理器在日常工作时有两种功能,第一个是负责 基本的数据运算和逻辑运算 ,第二是 控制硬件外设。 对于处理器来说,正常工作时需要去运行程序,而处理器本身只能运行程

    2024年02月22日
    浏览(35)
  • 【毕业设计】基于STM32的解魔方机器人

    1、方案设计 1.采用舵机作为魔方机器人的驱动电机,从舵机的驱动原理可知:舵机运行的速度和控制器的主频没有关系,所以采用单片机和采用更高主频的嵌入式处理器相比在控制效果上没有什么差别。单片机编程过程简单,非常容易上手,而且不需要进行操作系统的移植,

    2024年02月04日
    浏览(48)
  • 【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制

    🎉欢迎来到Labview专栏~四足爬行机器人仿真与控制 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: Labview-3D虚拟平台 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🔸 四足机器人整

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包