从入门小白成长为嵌入式高手(二)——CAN通信协议(大疆3508电机驱动)(RoboMater篇)(上)
声明:本文仅是自己的阅读笔记,不作为任何商业用途,大多数资料是通过大疆官网查询的,如有雷同,纯属巧合!!!
目录
一、大疆M3508电机
1.大疆电机简介
大疆M3508是大疆公司推出的一款高性能无刷直流电机,主要用于无人机、航模及机甲机器人等领域 。
2.驱动方式
(1)、PWM驱动
大疆的C620电调内部自带PID闭环控制,当使用PWM控制大疆3508电机搭配的C620电调时,只需要给电调发送占空比信号,电调内部会自动进行PID控制计算,形成转速闭环 。电调会根据接收到的PWM信号脉宽来确定目标转速,同时通过内部的传感器(如霍尔传感器等)实时检测电机的实际转速,将实际转速与目标转速进行比较,然后通过PID算法调整输出,以保证电机转速稳定在目标值附近。
(2)、CAN通信驱动
硬件连接 :将大疆开发板(如A型、C型)的CAN接口(如CAN1或CAN2)的CAN_H和CAN_L线分别连接到C620调速器的CAN_H和CAN_L接口,C620调速器输出端连接M3508电机。
软件设置 :CAN总线初始化:使用STM32CubeMX配置CAN外设,启用CAN模块,设置波特率(M3508常用1Mbps,需与电调一致),并配置接收过滤器。例如,设置接收标准ID为0x200~0x207的报文,过滤器模式为屏蔽位模式,FIFO0模式。
发送控制指令:M3508电机的控制指令通过标准数据帧发送,ID为“0x200 + 电机编号”,数据域为8字节,包含目标电流值。如向1号电机发送目标电流值,可先将电流值转换为字节数组,再通过HAL库函数HAL_CAN_AddTxMessage发送。
接收反馈数据:M3508电机会返回包含转子位置、转速、电流的反馈帧,ID为“0x200 + 电机编号”。可通过设置接收中断回调函数HAL_CAN_RxFifo0MsgPendingCallback,在回调函数中处理接收到的数据,获取电机的状态信息。
PID闭环控制:由于使用CAN控制时,C620电调不执行内部的速度PID控制,需要外部控制器进行PID运算 。可在控制循环中,根据电机的目标转速和实际转速,通过PID算法计算出目标电流值,再通过CAN总线下发给电机,从而实现速度闭环控制。
二、CAN通信协议
1.CAN通信简介
CAN通信全称控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。
CAN总线是两根差分信号线,分别是CAN_H和CAN_L,这是CAN通信实现抗干扰、远距离传输的核心。
CAN_H(CAN High):高电平信号线,显性电平约3.5V,隐性电平约2.5V;
CAN_L(CAN Low):低电平信号线,显性电平约1.5V,隐性电平约2.5V;
通信时靠两者的电压差(约2V) 传输信号,差分设计能大幅抵御电磁干扰,适配工业/车载/机器人等复杂环境。
CAN总线本质是“差分闭环”设计,开环是异常/简化场景,闭环是标准工作状态,核心差异在信号回路和可靠性。
(1). 闭环结构(标准工作模式)
定义:CAN_H与CAN_L构成完整差分回路,两端接120Ω终端电阻,信号通过两线电压差传输。
特点:抗干扰极强、传输距离远、信号稳定,是汽车、机器人(RoboMaster)等工业/嵌入式场景的标准用法。
(2). 开环结构(异常/简化模式)
定义:仅用CAN_H或CAN_L单线传输,或未接终端电阻、总线断开,无完整差分回路。

特点:抗干扰极差、传输距离极短(仅几米)、易丢包,仅用于调试排查(如测试收发器是否输出信号)或极端简化场景(不推荐正式使用)。
2.CAN通信格式

以CAN 2.0核心的数据帧(标准帧+扩展帧)为例:
(一)、数据帧的完整组成段落(从左到右传输顺序)
1. 帧起始(SOF)
位数:1位
逻辑值:固定为显性位(逻辑0)
核心功能:标志一帧数据的开始,同时触发总线上所有节点的时钟同步(CAN总线是异步通信,靠SOF校准时序)
规则:只有当总线处于空闲状态(隐性位,逻辑1)时,才能发送SOF,避免帧冲突
2. 仲裁段(Arbitration Field)
核心功能:定义帧的ID(标识数据用途),同时决定总线竞争优先级(显性位优先级高于隐性位,ID越小优先级越高)
标准帧(11位ID):
组成:11位标识符(ID10~ID0) + 1位远程传输请求位(RTR)
细节:RTR=0(显性)表示数据帧,RTR=1(隐性)表示远程帧;ID是核心,比如大疆电调的控制帧会用特定ID标识“转速指令”“状态反馈”
扩展帧(29位ID):
组成:11位基础ID(ID28~ID18) + 1位替代远程请求位(SRR,隐性1) + 1位ID扩展标志(IDE,隐性1) + 18位扩展ID(ID17~ID0) + 1位RTR位
细节:SRR用于替代标准帧的RTR位,避免格式冲突;IDE=1区分扩展帧(标准帧IDE=0),确保标准帧优先级高于同基础ID的扩展帧
3. 控制段(Control Field)
位数:4位(标准帧+扩展帧一致)
组成:2位保留位(r0、r1,默认显性0,预留未来扩展) + 2位数据长度码(DLC[3:0])
核心功能:告知接收方“数据段有多少字节”
细节:DLC取值0~8,对应数据段长度0~8字节(比如DLC=3表示数据段3字节);即使DLC=8但实际数据不足8字节,也需填充至8字节(或按协议约定处理)
4. 数据段(Data Field)
长度:0~8字节(CAN 2.0),CAN FD可扩展至0~64字节
核心功能:存储实际要传输的业务数据(比如传感器数值、设备控制指令)
细节:字节顺序按“高位在前(MSB)”或“低位在前(LSB)”约定(比如大疆协议通常指定MSB);每个字节8位,无校验位(靠后续CRC保障)
5. CRC段(CRC Field)
组成:15位CRC校验序列(CRC[14:0]) + 1位CRC界定符(CRC Delimiter,隐性1)
核心功能:检测数据传输错误(比如总线干扰导致的位翻转)
细节:CRC校验基于“帧起始+仲裁段+控制段+数据段”的所有位计算;接收节点会同步计算,若结果与发送的CRC序列不一致,判定为错误并触发错误帧
6. ACK段(Acknowledgment Field)
组成:1位应答槽(ACK Slot) + 1位应答界定符(ACK Delimiter,隐性1)
核心功能:确认“接收节点已正确接收帧”
规则:发送方在应答槽发送隐性1;只要总线上有一个接收节点正确接收,就会发送显性0填充应答槽(表示“确认收到”);若应答槽仍为隐性1,发送方判定为“接收失败”,会重发该帧
7. 帧结束(EOF)
位数:7位
逻辑值:固定为隐性位(逻辑1)
核心功能:标志一帧数据传输结束,告知所有节点“本帧已完成”
规则:EOF期间总线必须保持隐性,若出现显性位,会被判定为错误(比如帧中断)
(二)、其他帧类型的关键段落补充
远程帧:无数据段,仲裁段RTR=1(隐性),DLC表示“请求的数据长度”,其余段落(SOF、控制段、CRC、ACK、EOF)与数据帧一致
错误帧:无SOF、仲裁段等常规结构,由6位错误标志(主动错误=显性0,被动错误=隐性1) + 8位错误界定符(隐性1)组成
过载帧:无SOF,由6位过载标志(显性0) + 8位过载界定符(隐性1)组成,用于请求发送方延迟传输
帧间隔:由3位间歇场(隐性1) + 总线空闲场(任意长度隐性1)组成,仅用于分隔“数据帧/远程帧”与下一帧,避免信号叠加
3.大疆电机CAN数据帧报文格式
(1).电调接收报文数据格式(对应芯片发送报文格式)
标准帧格式:用于向电调发送控制指令控制电调的电流输出,两个标识符(0x200和0x1FF)各自对应控制4个ID的电调。控制电流值范围
-16384~0~16384,对应电调输出的转矩电流范围-20~0~20A。

电调ID一般设置为1-7,ID8一般不用。当ID设为8时,电机会自校准,疯狂转。具体原因就是电调反馈频率为1000hz,一条CAN报文108Bit,总线挂载7个电机,外加两个控制报文,108×9×1000=0.972Mbps,刚好是1M波特率上限。如果需要增加控制电机的数量,可以通过上位机(RM Assistant)来降频处理。

(2).电调发送报文数据格式(对应芯片接收报文格式)

三、STM32cubeMX配置
文章太长了,这些放到下一节
四、代码展示
文章太长了,这些放到下一节
更多推荐



所有评论(0)