ARTICLE DETAIL

资讯详情

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

达妙电机CAN通信与力位混控调试全攻略

达妙电机CAN通信与力位混控调试全攻略 达妙电机这两年在一批做机器人关节、云台、外骨骼的团队里出镜率很高尤其是它那套力位混控模式配合CAN总线做多电机协同几乎是绕不开的方案。但很多人第一次上手时都会卡在同一个地方电机上电了、线也接了、代码也照着例程写了结果要么使能没反应要么数据帧发出去石沉大海要么电机转起来一顿一顿的。问题往往不在代码本身而在CAN通信这条链路的物理层、帧格式、时序配置这些看不见的细节上。这篇内容就把达妙电机的CAN通信从硬件接线、终端电阻、数据帧结构到使能流程、力位混控模式的实际调试再到物理层容错测试和故障排查完整地捋一遍。不管你是刚拿到电机的新手还是已经在调多电机协同但总出玄学问题的老手都能从里面找到能直接抄作业的配置和排查思路。1. 达妙电机CAN通信的物理层基础与接线要点1.1 为什么CAN总线对物理层这么敏感CAN总线和串口最大的区别在于它是差分信号加总线仲裁机制。串口是点对点你接错了顶多是不通CAN是总线型拓扑所有节点挂在同一对差分线上任何一处的阻抗不匹配、终端电阻缺失、线序接反都会让整条总线的信号质量下降表现出来就是随机丢帧、偶发错误帧、通信时好时坏。达妙电机的CAN收发器工作在标准的高速CAN模式标称速率常见的是1Mbps这个速率下信号边沿很陡对反射和阻抗匹配的要求比低速CAN高得多。我见过太多人用杜邦线随便一插就开始调短距离、低速率下可能侥幸能通一旦线拉长到半米以上或者挂了三四个电机问题立刻暴露。所以物理层这块必须先讲清楚不然后面所有软件调试都是在流沙上盖楼。1.2 接线、终端电阻与共地达妙电机的CAN接口一般是H和L两根差分线部分型号还带GND。接线时H接H、L接L这个不能反反了虽然理论上差分信号取反后仍能识别但实际收发器对共模电压范围有要求接反大概率直接不通。线材建议用双绞线绞距越密抗干扰越好普通杜邦线在1Mbps下超过20厘米就开始不稳。终端电阻是CAN总线的灵魂。标准要求总线两端各有一个120欧姆的终端电阻用来吸收信号反射。一条总线上如果只有两个节点那就是两端各一个如果多个节点只有物理上最远的两个端点需要接。很多达妙电机的开发板或者转接板上已经集成了可跳线的120欧姆电阻用之前一定要确认跳线状态别出现两端都接了但中间节点也接了导致总线阻抗掉到60欧姆以下的情况。场景终端电阻配置常见错误两个节点直连两端各120欧姆只接一端反射严重多节点总线仅物理两端各120欧姆每个节点都接阻抗过低短距离调试至少一端120欧姆完全不接低速侥幸能通共地这件事经常被忽略。CAN是差分传输理论上不需要共地也能工作但前提是各节点的收发器共模电压在允许范围内。实际中如果电机由独立电源供电、上位机由USB供电两者地电位差过大就会出现通信不稳定甚至烧收发器的风险。稳妥做法是把所有节点的GND连到一起或者至少保证电源共地。提示调试阶段先用短双绞线加两端终端电阻跑通再逐步加长线缆、增加节点这样能把物理层问题和软件问题分开定位。2. CAN数据帧结构与达妙电机的报文格式拆解2.1 标准帧与扩展帧的选择CAN数据帧分标准帧11位标识符和扩展帧29位标识符。达妙电机的通信协议通常使用扩展帧因为29位标识符里可以塞进更多的信息比如设备类型、电机ID、控制模式、目标地址等字段。如果你用标准帧去发电机大概率不响应因为它的固件里解析的是扩展帧格式。这一点在代码走读时特别容易看漏很多人直接拿现成的标准帧例程改改完发现没反应其实是帧类型就不对。扩展帧的29位标识符在达妙电机的协议里一般是这样划分的高位若干位表示通信类型或命令类型中间位表示目标电机ID低位表示源地址或保留位。具体位域划分要以你手上电机型号的通信手册为准不同批次或固件版本可能有差异。我建议拿到电机第一件事就是把手册里的标识符位域表抄下来贴在显示器边上调的时候对照着看。2.2 数据段的字节序与缩放因子数据段最多8字节达妙电机的控制报文里通常包含目标位置、目标速度、力矩前馈、Kp、Kd这些参数。这里有两个坑一是字节序CAN协议本身不规定字节序全靠厂商约定达妙电机一般用小端序低字节在前但某些字段可能是大端必须逐字段确认二是缩放因子比如位置可能用定点数表示实际角度等于原始值乘以一个系数这个系数在手册里会给出算错了电机就会转到离谱的位置。举个实际例子假设位置字段是16位有符号整数缩放因子是0.01度每LSB那么原始值1000代表10度。如果你按1度每LSB去算发1000过去电机就转到1000度直接撞限位。这种错误在第一次调试时非常常见建议先用小幅度、低速度的目标值试探确认缩放关系正确后再放大。2.3 使能帧与模式切换帧的区别达妙电机的使能不是简单发一个开机命令就完事。通常流程是先发使能帧让电机进入工作状态再发模式配置帧设定为力位混控模式最后才发控制帧。这三类报文的标识符和数据段含义都不同顺序错了电机不会按预期动作。有些固件版本还要求使能帧和控制帧之间保持一定的时间间隔太快了电机来不及响应。我在实际调试中总结出一个稳妥的上电序列上电后先等待电机自检完成一般几百毫秒发送使能帧延时50毫秒发送模式配置帧再延时50毫秒然后开始以较低频率发送控制帧确认电机有响应后再提高频率。这个序列不是手册强制要求的但能避开大部分时序相关的玄学问题。3. 力位混控模式的原理与参数整定3.1 力位混控到底混的是什么力位混控模式英文一般叫hybrid force-position control或者impedance control的简化版核心思想是电机同时接受位置指令和力矩指令最终输出是两者的加权组合。用生活化的类比就像你用手去推一扇装了弹簧的门你既指定了门应该停在哪个角度位置又施加了一个推力力矩门最终停在哪里取决于弹簧刚度和你的推力。达妙电机的力位混控里Kp相当于弹簧刚度Kd相当于阻尼位置误差乘以Kp得到位置项力矩速度误差乘以Kd得到阻尼项力矩再加上前馈力矩合起来就是最终输出。这个模式的好处是在需要柔顺交互的场景里特别有用比如机械臂抓取易碎物体、外骨骼跟随人体运动纯位置控制会太硬纯力矩控制又太软不好稳定力位混控刚好在中间。3.2 Kp、Kd与前馈力矩的整定顺序整定这三个参数有个经验顺序先把Kd设为零、前馈设为零只调Kp。Kp从小往大加加到电机能快速响应位置指令但不振荡为止。然后加KdKd的作用是抑制振荡但加太多会让响应变迟钝一般从Kp的十分之一开始试。最后加前馈力矩前馈用来补偿重力、摩擦力这些已知的恒定负载比如机械臂在某个姿态下重力矩是固定的直接把这个值作为前馈加上去能大幅减小稳态误差。参数作用整定起点过大表现过小表现Kp位置刚度从0逐步加高频振荡响应慢、软Kd阻尼Kp的1/10迟钝、滞后振荡抑制不足前馈力矩补偿恒定负载按重力/摩擦估算过冲稳态误差大整定过程中一定要在电机空载或者带轻载的情况下做带重载整定出来的参数换到空载会振荡反之亦然。我一般会准备两套参数一套空载调试用一套实际负载用切换时注意平滑过渡。3.3 力位混控模式下的安全边界力位混控因为有力矩输出安全边界比纯位置控制更重要。必须设置力矩上限防止参数整定错误或者指令异常时电机输出过大扭矩损坏机构或伤人。达妙电机的控制帧里一般有力矩限制字段把它设成一个保守的值比如额定扭矩的30%调试阶段再逐步放开。另外位置指令也要做限幅别让目标位置超出机械行程。注意力位混控模式下电机是主动的断电瞬间如果机构有重力负载电机会失去力矩支撑可能自由下落。设计机构时要考虑断电抱闸或者机械限位。4. 从零跑通达妙电机CAN通信的实操步骤4.1 硬件准备与上电检查先把硬件清单列清楚达妙电机本体、CAN转USB适配器常见的是带收发器的USB-CAN盒、双绞线、120欧姆终端电阻、独立电源。电源这块要注意达妙电机一般需要24V或48V供电电流能力要留足余量尤其是多电机同时加速时瞬时电流可能很大。上电前用万用表确认电源电压正确、极性没接反这一步省不得反接烧电机的事故我见过不止一次。上电后先不接CAN单独确认电机有没有异常发热、有没有异响。然后接上CAN适配器用适配器自带的调试软件或者candump这类工具监听总线看有没有电机主动发出的心跳帧或状态帧。如果有说明物理层和电机固件基本正常可以进入下一步。4.2 适配器配置与波特率匹配USB-CAN适配器需要在系统里配置波特率和采样点。达妙电机常用1Mbps采样点一般设在75%到87.5%之间。采样点这个参数很多人不知道它决定了每一位的采样时刻采样点设错会导致高波特率下误码率飙升。适配器软件里如果有波特率预设选项直接选1Mbps的标准预设最省事如果要手动填记住采样点别低于75%。Linux下用socketcan的话配置命令大概是这样sudo ip link set can0 type can bitrate 1000000 sample-point 0.875 sudo ip link set can0 up配好之后用candump can0监听用cansend发测试帧先确认适配器自己能收发再连电机。4.3 使能与模式配置的代码走读使能帧和模式配置帧的构造是跑通的关键。以扩展帧为例伪代码逻辑大致是def build_enable_frame(motor_id): # 标识符位域按手册拼接 arb_id (CMD_ENABLE 24) | (motor_id 8) data [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] return arb_id, data def build_mode_frame(motor_id, mode): arb_id (CMD_SET_MODE 24) | (motor_id 8) data [mode, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] return arb_id, data实际代码里标识符的移位位数、命令码的取值都要以手册为准。发完使能帧后最好读一下电机的状态反馈帧确认它真的进入了使能状态而不是你以为它使能了。状态反馈帧里通常有错误码、当前模式、当前位置速度等信息是排查问题的金矿。4.4 控制帧的发送频率与实时性控制帧的发送频率直接影响控制效果。太低比如10Hz电机会一顿一顿的太高比如超过1kHz总线负载率上去了可能挤占状态反馈帧的带宽。一般关节控制用200Hz到500Hz比较合适。发送时要注意如果用的是非实时操作系统定时精度可能只有几毫秒抖动大了控制效果会打折。对实时性要求高的场景建议用实时内核或者微控制器来发CAN帧。我实测下来在Linux普通内核上用定时器发500Hz控制帧抖动大概在1到2毫秒对于大多数关节应用够用如果做力控或者高动态运动还是上MCU更稳。5. 物理层容错测试与故障排查实战5.1 终端电阻到底要不要加一个实测对比回到那个高频问题故障排查时需不需要增加终端电阻答案是看情况但绝大多数通信时好时坏的问题加上正确的终端电阻就能解决。我做过一组对比测试两个达妙电机加一个USB-CAN适配器线长1米双绞线。终端电阻配置通信表现完全不接低速能通1Mbps下丢帧率约5%只接适配器端丢帧率降到1%左右两端各接120欧姆丢帧率接近0稳定三处都接阻抗过低反而出现错误帧结论很明确两端各一个120欧姆是标准答案。但要注意如果你的适配器内部已经焊了120欧姆且不可跳线那电机端接一个就够了别重复接。5.2 常见故障的排查链路遇到通信问题我一般按这个顺序排查从物理层往上层走万用表测H-L之间电阻断电状态下应该是60欧姆左右两个120欧姆并联。如果是120欧姆说明只接了一个如果是40欧姆说明接了三个如果是无穷大说明一个都没接。示波器看CAN_H和CAN_L波形正常应该是清晰的差分方波如果边沿圆钝、有振铃说明阻抗不匹配或线太长。用candump看总线上有没有帧有帧但电机不响应说明标识符或数据格式不对完全没帧说明物理层或适配器配置有问题。确认波特率和采样点用示波器测一位的时间宽度反推波特率。检查电机供电和使能状态有些电机供电不足时会拒绝使能。这个链路的好处是每一步都能独立验证不会几个问题混在一起。5.3 错误帧与总线负载的监控CAN总线有完善的错误检测机制错误帧本身就是排查线索。如果candump里看到大量错误帧通常是物理层问题如果错误帧很少但偶发丢帧可能是总线负载过高。总线负载率可以用公式估算负载率等于所有帧的位数之和乘以帧率再除以波特率。1Mbps下一帧扩展帧大约130到150位如果每秒发1000帧控制帧加1000帧反馈帧负载率大概在30%左右还算健康超过70%就要考虑降频或者优化协议了。提示调试多电机系统时先把每个电机单独跑通再逐个加入总线每加一个观察负载率和错误帧变化这样出问题能快速定位到具体节点。6. 多电机协同与代码架构的一点经验6.1 多电机总线的ID规划多电机挂在同一条CAN总线上时每个电机的ID必须唯一而且标识符里的目标ID字段要能区分。规划ID时建议留出余量比如按功能分组0x01到0x0F给左腿关节0x10到0x1F给右腿这样后期扩展不用重新编号。另外要注意某些命令帧是广播的所有电机都会响应这类帧要慎用容易造成总线拥塞。6.2 控制循环的架构建议一个稳定的多电机控制程序我建议分成三层底层是CAN收发驱动负责帧的打包解包和收发中间层是电机对象每个电机维护自己的状态、参数和使能状态机上层是控制逻辑负责轨迹规划和控制律计算。这样分层的好处是换电机型号或者换总线适配器时只改底层上层逻辑不动。状态机这块特别重要电机的使能、运行、故障、失能这些状态要明确管理别用一个布尔变量糊弄。我见过因为状态管理混乱导致电机在故障状态下还接收控制帧结果动作异常的案例。6.3 调试工具与日志调试阶段一定要有日志。把每一帧的收发时间、标识符、数据都记下来出问题时回放日志比现场猜快得多。Linux下可以用candump的重定向功能把原始帧存成文件再写个脚本解析。另外建议做一个简单的可视化把电机的位置、速度、力矩实时画出来参数整定的时候看着曲线调比盲调快十倍。我个人在实际操作中的体会是达妙电机的CAN通信本身不复杂复杂的是把物理层、协议层、控制层这三层都照顾到。新手最容易犯的错是只盯着代码忽略了终端电阻和线材老手容易犯的错是参数整定凭感觉不做系统性的对比测试。把这两头都抓住力位混控模式调起来其实很顺手。最后再分享一个小技巧每次改动硬件接线或者参数后先用一个固定的、小幅度的正弦位置指令跑一遍看跟踪曲线是否平滑这个体检动作能提前发现大部分隐患。
返回列表