RoboMaster

标题: 【分享帖】论CAN总线对电机的控制与接收数据 [打印本页]

作者: Alchemic Ronin    时间: 2020-3-30 22:33
标题: 【分享帖】论CAN总线对电机的控制与接收数据
从STM32开始的RoboMaster生活:进阶篇 VII [CAN]
项目&教程仓库-STM32-RoboMaster-


1.0 什么是CAN?

1.1 背景 + 定义
Controller Area Network 控制器局域网络 是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898及ISO11519进行了标准化,在欧洲已是汽车网络的标准协议。
CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。
1.2 意义 + 优势
2.0 CAN原理
2.1  Differential signal 差分信号

                               
登录/注册后可看帖子
从上图我们可以看到,与图中下部分的普通信号不同,并不是低电平表示0高电平表示1,而是当两根数据线在同一时刻,如果有电压差表示0无电压差表示1。
相对于单信号线传输的方式,使用差分信号传输具有如下优点:
由于差分信号线具有这些优点,所以在USB协议,485 协议,以太网协议,及 CAN 协议的物理层中,都使用了差分信号传输。

                               
登录/注册后可看帖子
虽然CAN是通过差分信号传输数据,但是MCU不是,所以需要CAN Transceiver来把MCU的普通信号转换成差分信号。STM32并不自己提供该功能,所以需要外接CAN Transceiver。
2.2 Time Quantum 时间量子

                               
登录/注册后可看帖子
2.3 Data Frame 数据帧
在CAN标准中,分为标准格式和扩展格式,而帧也分为5种
我们这里主要解析一下数据帧

                               
登录/注册后可看帖子
每个数据帧总共包含7个段
2.4 Arbitration 仲裁

                               
登录/注册后可看帖子
在CAN中,仲裁是为了解决当同一时刻有多个Node在试图发送信息的时候,让优先权最大的那个Node先发。在CAN中,1是隐性电平,0是显性电平,在ID中显性电平越靠前越多,也就是ID越小,优先权越大。在仲裁的时候,比如有上图中的3个Node同时发送数据,当他们同时发送帧ID的时候,CAN的特性之一就会起作用,隐性电平会被显性电平覆盖,也就是只要在同一时刻,CAN上既有Node发送隐性电平又有Node发送显性电平,那CAN上就只有显性电平,反过来说,只有当CAN上所有Node都只发送隐性电平的时候,CAN上才是隐性电平。这就是仲裁机制背后的物理机制。
然后接下来,我们继续谈谈仲裁的过程中到底发生了什么,继续上图的例子,在时刻5的时候,Node 2是隐性电平 ( 1 ) ,而其他Node是显性电平 ( 0 ) ,所以整个CAN上也是显性电平 ( 0 ) ,然后Node 2自己一对比自己的输入输出不同,很自觉得知道自己优先权比其他Node低,然后停止发送数据,转为监听模式,Node 1和Node 3继续仲裁。在时刻2的时候,Node 1是隐性电平 ( 1 ) ,而Node 3是显性电平 ( 0 ) ,所以Node 1也转为监听模式,最后当整个ID发送完,仲裁完成后,只有Node 3发现自己没事,就知道自己是优先权最大的那个,接下来就继续发送数据帧,而其他Node就暂停发送数据,一直监听Node 3的数据,直到Node 3发完数据,其他Node再继续仲裁下去,决定接下来的发送权。
3.0 STM32的CAN配置原理
3.1 图解CAN内部实现机构

                               
登录/注册后可看帖子
从图上我们可以看到,CAN 1与CAN 2为主从关系,CAN 1为Master ( 主 ) ,CAN 2为Slave ( 从 ) 。CAN 1和CAN 2有各自的3个发送邮箱,2个FIFO Buffer缓冲,6个接收邮箱。但是,28个Filter 过滤器却是共用的,我们可以规定,哪些Filter给那个CAN用,甚至可以在程序运行的时候调控。

                               
登录/注册后可看帖子

                               
登录/注册后可看帖子
上面俩图是发送邮箱和接收邮箱的具体的流程和机制。具体的细节就实在太多了,本文毕竟不是参考手册,想更加深入的看官,可以去ST官方的Reference Manual查阅具体细节。
3.2 Filter 过滤器
Filter 过滤器就很简单了,就是过滤接收到的每一帧的ID,如果符合特定条件,那就将该帧放入接收FIFO中。
Filter 过滤器有两种模式:

                               
登录/注册后可看帖子
每种模式又有对应的16 Bit位,32 Bit位模式,具体的使用方法和区别,本文不深入讨论,这部分内容再出个完整的教程都足够了,所以这部分留给客官去看Reference Manuel来理解。
3.3 如何通过Bit Rate 比特率来选择Time Quantum 时间量子

                               
登录/注册后可看帖子
该图生成于CAN Bit Time Calculation,可以看出在iRM2018的时钟树配置下,42MHz的CAN总线,最推荐的是黄色的那条,是稳定和高速的交际范围,越往上越快,但是越不稳定,越往下越稳定,但是越慢。因为C620电调和M3508电机接收的比特率是1Mbps,所以我们只能选择最上面的那个最快的那组参数。
3.4 特殊功能选项3.5 RoboMaster Assistant
在用串口转接器后,可以在PWM接口连接上PC的RoboMaster Assitant来调试电机,重要的是可以调整电机的CAN数据发送频率,适当调低可以降低CPU的接收压力,把计算资源留给其他更加重要的功能。
4.0 CAN的用法
  1. HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs);
复制代码


  1. HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan);
复制代码


  1. HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig);
复制代码


  1. HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox);
复制代码


  1. uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);
复制代码


  [code]void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);

  HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);5.0 练习项目
5.1 项目简介5.2 项目代码
  因为论坛字数限制,详情请到 https://alchemicronin.github.io/posts/59eedfd8.html 观看
5.3 效果展示
http://player.bilibili.com/player.html?aid=242558868&bvid=BV1he411x7DN&cid=170233216&page=1


作者: 舟小羽    时间: 2020-4-30 18:41
好东西 顶一个
作者: Mr.xue    时间: 2020-5-10 00:02
好东西没有人评论!
作者: BruceLi    时间: 2020-5-10 15:41
围观学习~!
作者: Josh.Zhang    时间: 2020-5-10 22:05
两块板子间can通信搞过吗

作者: Alchemic Ronin    时间: 2020-5-12 08:08
Josh.Zhang 发表于 2020-5-10 22:05
两块板子间can通信搞过吗

一般用UART互相通讯,用CAN实在是大材小用了,通讯速度也没UART快
作者: 没有梦想的咸鱼    时间: 2020-9-5 23:19
好东西,顶一个
作者: 扫地僧    时间: 2020-10-5 09:51
这玩意不错啊
作者: lenkeble    时间: 2020-10-15 21:13
太好了,学习一波
作者: Artisans    时间: 2020-10-16 20:05
好东西 宝宝
作者: fumoumou    时间: 2021-2-3 00:37
学一手,   
作者: Plaris    时间: 2022-3-24 12:22
博主,你的项目代码网址显示不出来!!!
作者: djiuser_LuKb9Se    时间: 2024-2-4 23:22
新人小白,感谢前辈整理。




欢迎光临 RoboMaster (https://bbs.robomaster.com/) Powered by Discuz! X3.2