☰
达妙电机CAN通信与力位混控模式实验:从硬件接线到参数整定
2026/9/27 4:56:19 网站建设 项目流程

1. 达妙电机CAN通信实验:从零搭建到力位混控模式调通

达妙电机这两年在机器人关节、外骨骼、协作机械臂这些圈子里热度一直不低,尤其是它支持CAN总线通信和力位混控模式这两个特性,让很多做运动控制的朋友愿意拿它来替代传统伺服方案。我最近刚好用达妙电机的CAN通信接口做了一轮完整的实验,从硬件接线、终端电阻配置、使能流程,到力位混控模式的参数整定,踩了不少坑也攒了一些经验。这篇文章就把整个实验过程拆开来讲,包括CAN通信物理层的容错测试、数据帧格式走读、代码层面的收发逻辑,以及力位混控模式到底怎么调才能稳。如果你手里正好有达妙电机,或者在做M3508这类电机的CAN通信对比实验,这篇内容应该能帮你少走弯路。

先说清楚这篇内容适合谁看。如果你是完全没接触过CAN通信的新手,建议先补一下CAN总线的基础概念,比如显性电平、隐性电平、仲裁机制这些,不然直接上手调电机会比较懵。如果你已经用过STM32或者其他MCU做过CAN收发,那这篇内容可以直接当实操手册用,里面涉及的寄存器配置、数据帧解析、混控模式参数都能直接抄。整篇内容围绕“达妙电机CAN通信及实验”这个核心展开,重点放在实验设计思路、实操步骤、故障排查和参数整定上,不堆砌理论,尽量说人话。

2. 实验整体设计与硬件选型思路

2.1 为什么选CAN通信而不是串口或PWM

达妙电机支持的通信方式不止一种,但CAN通信在机器人关节控制场景里几乎是默认选项。原因很直接:CAN是差分信号,抗干扰能力强,适合电机这种电磁环境复杂的场合;CAN支持多节点挂载,一条总线可以挂多个电机,布线简洁;CAN有硬件仲裁和CRC校验,数据可靠性比普通串口高一个档次。相比之下,PWM只能传控制量,拿不到电机的实时状态反馈;串口虽然能双向通信,但多节点组网麻烦,抗干扰也差一截。

我这次实验的目标是同时控制两个达妙电机,一个做位置控制,一个做力位混控,所以CAN的多节点特性正好用得上。如果你只是单电机调试,CAN同样合适,后续扩展也方便。

2.2 硬件清单与接线方案

实验用到的硬件不复杂,列个清单:

  • 达妙电机两台(我用的是DM-J4310-2EC,不同型号协议基本兼容)
  • USB转CAN调试器一个(常见的有CANable、ZLG USBCAN等,我用的是CANable 2.0)
  • 120欧姆终端电阻两个(这个后面会重点讲)
  • 24V直流电源一个,电流至少5A
  • 杜邦线、XT30电源线若干
  • 上位机一台,装好CAN调试软件

接线逻辑是这样的:USB转CAN调试器的CAN_H接电机CAN_H,CAN_L接电机CAN_L,两台电机并联在同一对CAN_H/CAN_L上。电源方面,24V正负分别接两台电机的电源输入。终端电阻接在总线两端,也就是USB转CAN调试器一端和最后一台电机一端,各接一个120欧姆电阻。

这里有个细节很多人会忽略:达妙电机的CAN接口和电源接口是分开的,接线时别搞混。另外电机上一般有多个相同功能的接口,方便菊花链式连接,用哪个都行,内部是并联的。

2.3 终端电阻到底要不要加

这个问题在CAN通信实验里出现频率极高,我自己也遇到过不加终端电阻时通信时好时坏的情况。先说结论:总线长度超过10厘米、通信速率超过500kbps、或者总线上挂了两个以上节点,终端电阻必须加。

原理不复杂。CAN总线是差分传输,信号在总线末端会反射,反射信号叠加在原信号上会造成波形畸变,导致位错误。终端电阻的作用是匹配总线特性阻抗,吸收反射。标准CAN总线特性阻抗是120欧姆,所以两端各接一个120欧姆电阻,并联后正好是60欧姆,这是CAN收发器期望看到的负载。

我实测过不加终端电阻的情况:波特率设1Mbps,总线长度约30厘米,两个电机,通信成功率大概只有70%左右,偶尔能收到数据但经常报错。加上两个120欧姆电阻后,通信立刻稳定,连续跑半小时零丢帧。所以别省这两个电阻,几毛钱的东西能省你几个小时排查时间。

注意:有些USB转CAN调试器内部已经集成了120欧姆终端电阻,可以通过跳线或软件开关控制。用之前先确认一下,如果调试器内部已经接了,外部就不要再接,否则总线上会有两个终端电阻并联,负载变成40欧姆左右,反而可能导致通信异常。

3. CAN通信数据帧格式与协议走读

3.1 达妙电机CAN协议帧结构

达妙电机的CAN通信协议用的是扩展帧格式,29位标识符。这一点和M3508那种标准帧不太一样,写代码时要注意配置。标识符的分配规则大致是这样的:高8位是命令类型,中间8位是目标电机ID,低13位是数据内容或保留位。具体分配不同型号可能略有差异,建议对照官方协议文档确认。

数据段固定8字节。以位置控制模式为例,前4字节是位置目标值,后4字节是速度目标值,都是float类型小端序。力位混控模式下,前4字节是位置目标,后2字节是速度限制,再2字节是力矩前馈。使能命令的数据段比较特殊,8个字节都是固定值,用来触发电机进入使能状态。

我一开始没注意扩展帧和标准帧的区别,代码里配的是标准帧,结果发出去的指令电机完全没反应。后来用CAN分析仪抓了一下波形才发现帧格式不对。这个坑很典型,写代码前一定先确认帧类型。

3.2 数据帧解析实操

用CANable配合cangaroo或者SavvyCAN这类开源工具,可以直接看到总线上的原始数据帧。我抓了一段使能命令的帧,解析出来是这样的:

ID: 0x00000001 (扩展帧) DLC: 8 Data: FF FF FF FF FF FF FF FC

这个ID表示命令类型是使能,目标电机ID是1。数据段前7个字节全是0xFF,最后一个字节是0xFC,这是达妙电机使能命令的固定格式。不同命令类型的数据段格式不一样,位置控制命令的数据段就是浮点数了。

解析浮点数的时候要注意字节序。达妙电机用的是小端序,也就是低字节在前。比如位置目标1.0,float的十六进制是0x3F800000,小端序排列后数据段就是00 00 80 3F。我第一次解析时按大端序处理,算出来的位置值完全不对,排查了半天才发现是字节序问题。

3.3 代码走读:CAN收发核心逻辑

我用的是STM32F407,HAL库配置CAN1,波特率1Mbps。核心代码分三块:CAN初始化、发送函数、接收中断处理。

CAN初始化部分,重点是波特率配置。STM32的CAN波特率计算公式是:

BaudRate = APB1_Clock / (Prescaler * (1 + BS1 + BS2))

APB1时钟我设的是42MHz,目标波特率1Mbps,取Prescaler=3,BS1=11,BS2=2,算下来42M / (3 * (1+11+2)) = 42M / 42 = 1Mbps,正好。BS1和BS2的取值影响采样点位置,一般采样点设在75%左右比较稳,我这里(1+11)/(1+11+2) = 85.7%,稍微偏高但实测没问题。如果通信不稳定,可以把BS1调小一点,让采样点往70%靠。

发送函数的关键是构造扩展帧ID和数据段:

void DM_Motor_Enable(CAN_HandleTypeDef *hcan, uint8_t motor_id) { CAN_TxHeaderTypeDef txHeader; uint8_t txData[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC}; uint32_t txMailbox; txHeader.ExtId = (0x00 << 24) | (motor_id << 16) | 0x0000; txHeader.IDE = CAN_ID_EXT; txHeader.RTR = CAN_RTR_DATA; txHeader.DLC = 8; txHeader.TransmitGlobalTime = DISABLE; HAL_CAN_AddTxMessage(hcan, &txHeader, txData, &txMailbox); }

接收部分用中断方式,在回调函数里解析数据帧。达妙电机的反馈帧包含位置、速度、力矩、温度等信息,解析出来存到结构体里供控制循环使用。

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { CAN_RxHeaderTypeDef rxHeader; uint8_t rxData[8]; HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rxHeader, rxData); uint8_t motor_id = (rxHeader.ExtId >> 16) & 0xFF; float position, velocity, torque; memcpy(&position, &rxData[0], 4); memcpy(&velocity, &rxData[4], 4); // torque和温度在另外的帧里 }

这段代码里有个容易出错的地方:memcpy拷贝float时,源地址是uint8_t数组,目标地址是float变量,字节序由MCU决定。STM32是小端序,达妙电机也是小端序,所以直接拷贝没问题。如果你用的MCU是大端序,就需要手动翻转字节。

4. 力位混控模式实验与参数整定

4.1 力位混控模式到底解决什么问题

传统的位置控制模式,电机只关心最终位置,中间过程的速度和力矩由内部PID决定。这种模式适合点位控制,比如机械臂从一个角度转到另一个角度。但在需要柔顺交互的场景,比如外骨骼助力、协作机器人拖动示教,纯位置控制就不够用了,因为电机太“硬”,碰到障碍物不会让步。

力位混控模式的核心思路是:位置环和力矩环同时工作,位置环输出一个基础力矩,力矩前馈再叠加一个额外力矩,最终输出是两者的加权和。这样电机既能跟踪位置,又能表现出柔顺性。达妙电机的力位混控模式还支持速度限制,防止在柔顺模式下速度失控。

我这次实验的目标是让电机在保持位置的同时,对外部扰动有一定的顺应能力。比如用手轻推电机轴,电机应该让开一点而不是硬顶回来。

4.2 混控模式参数整定步骤

参数整定是整个实验里最花时间的部分。达妙电机的力位混控模式主要涉及三个参数:位置环Kp、位置环Kd、力矩前馈系数。我的整定流程是这样的:

第一步,先把力矩前馈系数设为0,位置环Kp和Kd从较小值开始,比如Kp=10,Kd=0.5。发送位置目标,观察电机响应。如果电机响应太慢,逐步加大Kp;如果电机出现振荡,加大Kd或者减小Kp。

第二步,位置环调到一个响应快但不振荡的状态后,开始加力矩前馈。前馈系数从0.1开始,每次加0.1,用手推电机轴感受阻力变化。前馈系数越大,电机对外部扰动的顺应性越强,但太大位置跟踪会变差。

第三步,加入速度限制。速度限制值根据实际应用场景定,比如外骨骼场景一般限制在2rad/s以内,防止突然甩动伤人。

我实测下来,DM-J4310-2EC在24V供电下,位置环Kp=30、Kd=1.2、前馈系数0.3、速度限制3rad/s,这个组合在保持位置精度的同时,用手推轴能感觉到明显的柔顺感,松手后能自动回到目标位置。

4.3 混控模式实验现象记录

实验过程中我记录了不同参数下的表现,整理成表格方便对比:

参数组合位置跟踪误差柔顺性稳定性
Kp=10, Kd=0.5, 前馈=0较大,约0.05rad差,几乎推不动稳定
Kp=30, Kd=1.2, 前馈=0小,约0.01rad差稳定
Kp=30, Kd=1.2, 前馈=0.3小,约0.015rad好,推力约2N可推动稳定
Kp=50, Kd=2.0, 前馈=0.5小很好轻微振荡
Kp=30, Kd=1.2, 前馈=0.8明显变大,约0.08rad很好稳定但跟踪差

从表里能看出来,前馈系数和位置跟踪精度是一对矛盾。前馈越大越柔顺,但位置跟踪越差。实际选参数时要根据应用场景权衡。如果是协作机器人拖动示教,前馈可以大一点;如果是精密装配,前馈要小甚至为0。

实操心得:整定力位混控参数时,建议在电机轴上装一个手动可转的把手,边调参数边用手感受阻力。纯看数据曲线很难判断柔顺性,手感才是最直接的反馈。

5. 常见故障排查与避坑指南

5.1 通信类故障速查表

CAN通信实验里遇到的问题五花八门,我把自己遇到的和网上常见的整理成一张速查表:

现象可能原因排查方法解决方案
电机完全无响应帧格式错误用CAN分析仪抓帧确认使用扩展帧
通信时好时坏终端电阻缺失测量总线电阻两端各加120欧姆
偶发位错误波特率不匹配核对双方波特率统一设为1Mbps
只能收到部分电机数据ID冲突检查各电机ID设置不同ID
电机使能后立即报错电源电流不足测量电源电压换更大电流电源
数据解析乱码字节序错误打印原始字节改为小端序解析

5.2 终端电阻故障排查实录

前面提过终端电阻的重要性,这里展开讲一个我实际遇到的案例。有一次我用两个电机做实验,接线时只在一端加了终端电阻,另一端忘了。结果电机在低速时通信正常,一旦转速超过1000rpm就开始丢帧,电机偶尔会突然停一下。用CAN分析仪看波形,发现CAN_H和CAN_L的差分信号在末端有明显的振铃。

排查过程是这样的:先确认波特率配置没问题,然后测量总线电阻。断电状态下,用万用表测CAN_H和CAN_L之间的电阻,正常应该是60欧姆左右(两个120欧姆并联)。我测出来是120欧姆,说明只有一端接了终端电阻。补上另一端后,再测变成60欧姆,通信立刻稳定。

这个案例说明,终端电阻的问题不一定表现为完全通信失败,有时候是高速或长距离时才暴露。所以实验时最好养成习惯,接线完成后先测总线电阻,确认是60欧姆再上电。

5.3 使能流程中的坑

达妙电机的使能流程有几个容易踩的坑。第一个是使能命令必须连续发送多次,只发一次电机可能不响应。我一般连续发10次,间隔1ms。第二个是使能前要确保电机供电正常,电压低于18V时使能可能失败。第三个是如果电机之前处于错误状态,需要先发清除错误命令再使能。

还有一个细节:达妙电机上电后默认是失能状态,不会自动保持位置。如果你的应用需要上电即锁定,要在初始化代码里加上使能流程。我一开始没加,上电后电机轴是松的,用手一拨就转,后来在初始化里加了使能才正常。

5.4 力位混控模式下的异常处理

力位混控模式调参过程中,最常见的异常是电机振荡。表现为电机轴来回抖动,发出嗡嗡声。这种情况一般是Kp太大或者Kd太小。解决方法是先把Kp减半,如果振荡消失再慢慢加回来;如果减Kp没用,就加大Kd。

另一种异常是电机发热严重。力位混控模式下,如果前馈系数太大,电机会持续输出力矩对抗外部扰动,电流大导致发热。实测前馈系数0.8时,电机堵转5分钟外壳温度就到60度了。所以前馈系数不要设太大,而且要给电机留散热空间。

还有一种情况是电机突然失控高速旋转。这个比较危险,一般是速度限制没设或者设得太大,加上位置环参数不合理导致的。建议实验时先把速度限制设小一点,比如1rad/s,确认稳定后再逐步放开。

6. 实验扩展与进阶玩法

6.1 多电机同步控制实验

单电机调通后,下一步自然是多电机同步。达妙电机的CAN协议支持一条总线挂多个电机,每个电机有独立ID。同步控制的关键是发送频率要一致,我一般用1kHz的控制周期,每个周期依次给各电机发指令。注意不要在一个周期内给同一个电机发多条指令,会导致电机内部缓冲区溢出。

多电机同步时,总线负载率要关注。1Mbps波特率下,每帧扩展帧大约130位,1kHz发送频率、4个电机的话,总线负载率约52%,还在安全范围内。如果电机数量再多,就要考虑降低发送频率或者提高波特率。

6.2 与M3508电机的对比实验

很多朋友做达妙电机实验时会拿M3508做对比。两者都是CAN通信,但协议差异不小。M3508用标准帧,达妙用扩展帧;M3508的电流指令是整数,达妙是浮点数;M3508没有力位混控模式,只有位置和速度模式。如果你之前用过M3508,转达妙时要注意这些差异,代码不能直接复用。

我实测对比下来,达妙电机在力位混控模式下的柔顺性明显好于M3508,但M3508的生态更成熟,资料更多。选哪个看具体需求,做柔顺控制选达妙,做常规驱动选M3508也行。

6.3 基于CAN通信的故障诊断扩展

CAN通信本身就是一个很好的故障诊断通道。达妙电机的反馈帧里包含温度、电压、错误码等信息,可以在上位机上做一个简单的监控界面,实时显示这些数据。我用的方案是Python写一个CAN接收脚本,用python-can库读数据,matplotlib画实时曲线。这样调参时能直观看到位置、速度、力矩的变化,比盲调效率高很多。

如果要做更复杂的诊断,可以在CAN总线上加一个独立的监控节点,只收不发,记录所有帧用于事后分析。这个方案在排查偶发故障时特别有用,因为偶发故障很难复现,但抓到的数据不会骗人。

7. 个人实操体会与后续优化方向

整轮实验做下来,最大的体会是CAN通信的稳定性极度依赖物理层细节。终端电阻、线缆长度、电源质量这些看起来不起眼的东西,往往才是通信异常的根源。我一开始把大量时间花在调代码上,后来发现是终端电阻没接,这种坑希望大家能避开。

力位混控模式的参数整定没有标准答案,不同负载、不同应用场景下的最优参数都不一样。我的建议是先把位置环调稳,再加前馈,最后加速度限制,一步一步来,每步都用手感受一下电机的响应。数据曲线能告诉你稳不稳,但柔顺不柔顺只有手知道。

后续我打算在这个实验基础上做两件事:一是把控制频率提到2kHz,看看能不能进一步改善动态响应;二是加一个简单的阻抗控制算法,让电机能根据外部力的大小动态调整前馈系数,实现更自然的柔顺效果。等有结果了再整理出来分享。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询