ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

达妙电机CAN通信与力位混控模式实验:从硬件接线到参数整定

达妙电机CAN通信与力位混控模式实验:从硬件接线到参数整定 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.0120欧姆终端电阻两个这个后面会重点讲24V直流电源一个电流至少5A杜邦线、XT30电源线若干上位机一台装好CAN调试软件接线逻辑是这样的USB转CAN调试器的CAN_H接电机CAN_HCAN_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.0float的十六进制是0x3F800000小端序排列后数据段就是00 00 80 3F。我第一次解析时按大端序处理算出来的位置值完全不对排查了半天才发现是字节序问题。3.3 代码走读CAN收发核心逻辑我用的是STM32F407HAL库配置CAN1波特率1Mbps。核心代码分三块CAN初始化、发送函数、接收中断处理。CAN初始化部分重点是波特率配置。STM32的CAN波特率计算公式是BaudRate APB1_Clock / (Prescaler * (1 BS1 BS2))APB1时钟我设的是42MHz目标波特率1Mbps取Prescaler3BS111BS22算下来42M / (3 * (1112)) 42M / 42 1Mbps正好。BS1和BS2的取值影响采样点位置一般采样点设在75%左右比较稳我这里(111)/(1112) 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从较小值开始比如Kp10Kd0.5。发送位置目标观察电机响应。如果电机响应太慢逐步加大Kp如果电机出现振荡加大Kd或者减小Kp。第二步位置环调到一个响应快但不振荡的状态后开始加力矩前馈。前馈系数从0.1开始每次加0.1用手推电机轴感受阻力变化。前馈系数越大电机对外部扰动的顺应性越强但太大位置跟踪会变差。第三步加入速度限制。速度限制值根据实际应用场景定比如外骨骼场景一般限制在2rad/s以内防止突然甩动伤人。我实测下来DM-J4310-2EC在24V供电下位置环Kp30、Kd1.2、前馈系数0.3、速度限制3rad/s这个组合在保持位置精度的同时用手推轴能感觉到明显的柔顺感松手后能自动回到目标位置。4.3 混控模式实验现象记录实验过程中我记录了不同参数下的表现整理成表格方便对比参数组合位置跟踪误差柔顺性稳定性Kp10, Kd0.5, 前馈0较大约0.05rad差几乎推不动稳定Kp30, Kd1.2, 前馈0小约0.01rad差稳定Kp30, Kd1.2, 前馈0.3小约0.015rad好推力约2N可推动稳定Kp50, Kd2.0, 前馈0.5小很好轻微振荡Kp30, Kd1.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看看能不能进一步改善动态响应二是加一个简单的阻抗控制算法让电机能根据外部力的大小动态调整前馈系数实现更自然的柔顺效果。等有结果了再整理出来分享。
返回列表