首页/文章/ 详情

做机器人控制的,建议这篇先收藏,早晚用得上

13小时前浏览1

关于机器人,我之前陆续写了几篇文章。今天再给大家分享一套方案,能用在机器人控制上,底层硬件和软件都有。如果说我以前的文章偏硬件,那这篇就比较偏软件。

文章有一定专业性,不做这块的朋友可能不太好懂。但万一哪天用得上,还是挺有帮助的。建议先收藏,需要的时候再翻出来看看。

01

前言

怎么让机器人看起来更像真人?我觉得很重要的一点就是反应要对。你跟我说一句话,我能接上话,或者做出对应的动作,至少不显得奇怪。

机器人身上有多个关节、很多电机,需要多轴联动。比如跑步,什么时候出左脚、什么时候出右脚、什么时候跑快、什么时候跑慢,早一点晚一点都可能摔倒。

用专业话说就是:每一次控制指令,必须在精确的时间点发出去,不能早也不能晚。说好每1ms发一次,就不能是0.5ms,也不能是1.5ms。节奏一乱,轨迹就抖,多轴同步就对不上。

麻烦的是,现在不少机器人控制器跑的是Linux。Linux本身是个通用系统,要同时照顾网络、文件、界面、后台服务……控制线程只是其中之一。哪怕优先级设到最高,周期说抖就抖。

那怎么办?咱们拿米尔MYD-LR3576开发板为例,他们官方出了参考案例,我结合自己的理解,跟大家聊聊这套方案是怎么落地的,以及在CPU隔离核和满负载压力下,通讯抖动怎么控制在ns到us级。

02

EtherCAT是机器人最主流的通讯方式

为照顾到大多数朋友,咱们先说说什么是EtherCAT。你可以把它理解成一条工业现场的高速数据总线。主站是调度中心,从站是各个执行节点,伺服电机、IO模块、传感器都算。数据报文像一列不停站的高速列车,把所有节点的信息一站收齐、一站下发。

它跟普通以太网最大的区别就一个字:准。普通以太网讲究尽力送到,EtherCAT讲究必须按时送到。工业现场多轴联动,靠的就是这个准字。

那这套东西靠什么跑?靠的是IgH EtherCAT Master这个开源协议栈。它跑在Linux内核空间,直接从驱动层收发报文,不走用户态那一套调度。好处是确定性好,配合分布时钟同步,能做到很精确的周期控制。

对懂行的工程师来说,IgH的好处很直接:能跟分布时钟配合,主站跑在内核里,跟通用以太网驱动搭得很顺,命令行和API也都有。它的抖动水平,直接反映整个实时系统的品质。我们要做的,就是让这个调度中心的心跳,在这个平台上跳得更稳、更准。

03

在RK3576上运行EtherCAT

测试环境交代一下

硬件:

  • 米尔MYD-LR3576核心板,RK3576处理器,4个A72加4个A53,双千兆网口;

  • 4台SV630N伺服驱动器,配汇川MS1H4电机。

软件:

  • buildroot系统,内核6.1.118打了Preempt-RT补丁;

  • IgH EtherCAT Master 1.6.0;

  • 主站内部高精度时间戳做测量。

测试口径:

  • 抖动定义就是实际周期减目标周期,正值是超调,负值是滞后;

  • 最大值最小值平均值都是原始数据直接算,没剔启动阶段测量方法:主站自己带了一个高精度时间戳,每个周期开始时记一下,两个起点之间的时间差,就是实际周期时长;

  • 空载和压力测试每组跑30分钟以上,长拷机跑12小时;

  • 压力测试用stress-ng对0到6核施加CPU满载、内存读写、IO压力,同时用hackbench制造调度延迟;

  • 从站是4台SV630N,标准PDO映射,DC同步以第一个支持DC的从站为参考时钟。

测量方法:主站自己带了一个高精度时间戳,每个周期开始时记一下,两个起点之间的时间差,就是实际周期时长。

空载测试:922纳秒是什么水平

先看空载。主站配成1ms周期同步速度模式,CPU核7专供主站实时线程,内核锁内存,线程优先级拉满,系统除了串口没其他负载。

连续跑半小时,1ms周期下最大抖动922ns,平均22ns。

ec_stmmac.ko 1000Hz 空载抖动:最大 922ns,平均 22ns

然后切到125微秒周期同步位置模式,也就是每秒8000帧,电机做连续微步定位。这个频率下,ec_stmmac.ko驱动的表现是:最大抖动还是922纳秒,平均22纳秒,执行耗时12.7微秒。

换ec_generic.ko通用驱动的话,125微秒空载下极端抖动正负11.7微秒,平均21.1纳秒,执行耗时26.4微秒,大于1微秒的尖峰只有1次,占比0.054%。

说实话,922纳秒这个数字,放在工业控制场景里已经相当能打了。很多传统方案还在微秒甚至毫秒级别晃悠,亚微秒级的抖动意味着上层轨迹规划有一个非常干净的时钟基准。直观感受就是电机噪音会小很多,多轴同步的精度也会明显提升。

压力测试:系统忙起来还稳不稳

空载好看不稀奇,关键是系统忙起来的时候还能不能稳住。

我启动stress-ng,对0到6核施加满负载,CPU跑满、内存轮番读写、文件系统疯狂IO,同时用hackbench制造大量调度延迟。这种情况下,隔离核7上的EtherCAT实时线程表现如下:

1ms周期压力测试:

  • ec_stmmac.ko:最大抖动1.63微秒,平均121纳秒,大于1微秒尖峰283次,占比11.58%

  • ec_generic.ko:极端抖动正负33.7微秒,平均36纳秒,大于1微秒尖峰只有5次,占比0.21%

125微秒周期压力测试:

  • ec_stmmac.ko:最大抖动1.30微秒,平均57纳秒,大于1微秒尖峰仅1次

  • ec_generic.ko:极端抖动正负43.5微秒,平均26.3纳秒,大于1微秒尖峰10次,占比0.55%

ec_stmmac.ko 8000Hz 压力测试:最大 1.30μs,平均 57ns

这里有个很有意思的现象。ec_generic.ko在压力下虽然大于1微秒的尖峰很少,但极端抖动值能到正负33.7微秒,说明它偶尔会抽一下大的。而ec_stmmac.ko在8000Hz下只有1次超过1微秒,极值控制在正负1.30微秒,高频场景下优势非常明显。

作为硬件工程师,我的理解是:ec_stmmac.ko是专门针对RK3576的STMMAC千兆网卡做了适配的,在NAPI调度和硬件时间戳上都做了优化,报文收发路径更短更确定。ec_generic.ko通用性强,但走的是通用路径,极端情况下的瞬时抖动就压不住。

ec_generic.ko 8000Hz 压力测试抖动分布:极端情况到 ±43.5μs,超过1μs的只有10次

满负载压力下的实时隔离示意:非隔离核跑得再满,隔离核上的抖动照样稳在亚微秒级

12小时长拷机:0丢帧

125微秒周期位置模式连续跑12小时,模拟车间日夜不关机的场景。

ec_stmmac.ko 8000Hz 长拷机抖动分布:47512 条记录,最大 1.25μs

结果:

  • 0丢帧,主站状态机没发生过一次OP到SAFEOP的异常跳变

  • DC时间漂移补偿稳定在正负20纳秒以内

  • 抖动统计和1小时测试高度吻合,没有周期性尖峰,也没有缓慢恶化

这个结果说明这套方案不只是能跑,而是能长期稳定跑。对于要从打样走向量产的设备来说,这个底气很重要。

04

细节展示:从内核到代码,一层层拆开看

如果你能看到这儿,说明你是真爱了,下面是更加专业的知识点,让工程师了解低抖动背后,到底是什么在起作用。

驱动选择是关键

ec_stmmac.ko是米尔专门为RK3576的STMMAC千兆以太网控制器适配的实时驱动。标准Linux网卡驱动用中断模型,响应时间受内核调度器影响,满足不了EtherCAT周期性通信的确定性要求。ec_stmmac.ko在通用MAC驱动基础上,针对Preempt-RT内核做了NAPI调度优化,开了硬件时间戳,把报文收发的时间标记和中断处理延迟压到最低。

ec_generic.ko是通用IgH网卡驱动,兼容性好,但执行效率低。1000Hz下耗时32.3微秒,是ec_stmmac的近3倍。

IgH 驱动栈与 Preempt-RT 内核的关系

内核配置要精细

  • 内核6.1.118-rt36,启用CONFIG_PREEMPT_RT完全内核抢占

  • CONFIG_HZ=1000提高定时器精度

  • CONFIG_HIGH_RES_TIMERS=y,CONFIG_NO_HZ_FULL=y针对隔离核关闭无干扰时钟

  • CONFIG_CPU_ISOLATION=y

  • bootargs:isolcpus=7 rcu_nocbs=7 nohz_full=7 irqaffinity=0-6

这样隔离核7上几乎不处理内核杂务和中断,全部算力留给EtherCAT实时线程。

应用层四件事

1、mlockall锁定内存,避免缺页延迟;

2、实时线程设SCHED_FIFO优先级99;

3、CPU亲和性绑定,实时线程在核7,日志监控等非实时线程在核0-6;

4、DC同步配置,以第一个支持DC的从站为参考时钟,补偿静态漂移,周期任务与DC信号对齐。

隔离核和非隔离核线程分配——实时线程占着核7,日志、界面都扔到别的核上,互不打扰

05

两种驱动怎么选

对比数据如下:

ec_generic.ko适合:

  • 系统有CPU压力负载,压力下大于1微秒尖峰仅5次,比ec_stmmac的283次少很多

  • 运行频率较低,大概1000Hz左右,执行耗时不是瓶颈

  • 不能容忍偶发性大抖动中断控制流程

  • 用独立PCIe网卡而不是DWMAC内置MAC

ec_stmmac.ko适合:

  • CPU资源充裕、无压力干扰,抖动低至922纳秒,执行耗时仅11微秒

  • 高频率运行,8000Hz及以上,执行耗时优势明显,压力下表现反而更好

  • 长时间不间断运行,47512条记录仅10次微小超限

  • 对执行效率有要求,每周期能省约20微秒CPU时间

测试现场图片

简单说:ec_stmmac.ko性能好效率高,但CPU压力场景下大于1微秒尖峰多;ec_generic.ko慢一些,但低频压力下尖峰少,抗突发干扰好。选哪个看你的实际负载特征和周期要求。

06

几个落地时容易踩的坑

1、中断亲和性别马虎

光隔离CPU不够,还得通过/proc/irq/*/smp_affinity把千兆网口中断绑到非隔离核,否则隔离核会被频繁唤醒,前面做的隔离就白费了。

2、实时驱动别用错

通用网卡驱动在RT内核下可能出现锁反转,务必用适配的ec_stmmac驱动。遇到丢帧先检查DMA缓冲区大小和中断合并设置。

3、DC时钟冷启动要等

刚进入OP状态时,驱动系统漂移补偿需要几秒收敛。建议应用层检测DC稳定标志后再开始严格同步的运动指令,别一上来就发。

4、监控别打扰实时线程

实时数据通过共享内存传到非RT核,由非实时核负责存储或网络上报。直接printf或者写磁盘,会引起各种意想不到的延迟。

这套方案还能怎么用

RK3576内置6 TOPS NPU,双千兆以太网。这套EtherCAT主站方案能满足32轴甚至更多轴的微秒级同步控制,还能无缝融入边缘AI推理。

想象一下,同一块板子上,隔离核跑125微秒高精度运动控制,其余核跑视觉抓拍和缺陷检测。这种运动+视觉实时一体化架构,能大幅简化产线控制器设计,对柔性制造、协作机器人这些领域来说,是个很实用的思路。

米尔MYD-LR3576开发板接口完备,工业级温度范围,本身就可以作为量产核心板直接嵌入设备,缩短产品上市周期。

07

总结

基于MYD-LR3576的RK3576平台,配合Linux Preempt-RT实时内核和IgH EtherCAT Master,可以构建具备工业实时控制能力的EtherCAT主站方案。测试条件下能稳定运行1ms和125微秒控制周期,长时间测试主站状态稳定。

ec_stmmac.ko专用驱动在执行耗时和高频周期场景下优势明显,适合8000Hz等高控制周期应用。ec_generic.ko通用驱动兼容性更好,适合快速验证和通用网卡场景。

实际项目里怎么选,结合周期频率、极端抖动容忍度和开发维护成本来定就行。

来源:硬件笔记本
通用通信电机机器人控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-09-24
最近编辑:13小时前
硬件笔记本
本科 一点一滴,厚积薄发。
获赞 158粉丝 52文章 1122课程 0
点赞
收藏
作者推荐

15A、超小封装、外围极简,很难不爱

今天给大家分享一个低压大电流电源方案,15A、超小封装、外围极简,很难不爱。01背景介绍这两年AI推理、边缘计算、5G基站都是比较火的行业,需求越来越多,上下游都在抢跑,在咱们硬件圈来说,聊的更多的是用哪家的方案更靠谱、更稳当、更让人省心。一个很典型的场景:核心电压1.0V左右,电流做到15A甚至20A,电压精度要求±3%以内,动态响应要快,板上空间还被主芯片越挤越小。常规的DCDC芯片选择其实不少,但能扛住这么大电流的,要么是内置MOS的降压芯片配个功率电感,外围阻容一大堆;要么是控制器搭外置MOS,布板面积更大,走线更讲究。不管哪种,都不是最完美的。常规芯片外置大电感和MOS最近我们项目也遇到了这种低压大电流的需求,根据行业老哥MPS原厂推荐,锁定了MPM3685这颗料,下面跟大家简单分享一下。02体积小是最直观的感受体积小,外围电路简洁,这是最直观的感受。先来看看外围电路,没有外置MOS,没有大电感。你拿到这颗芯片,外围只需要加上:输入输出电容(按手册推荐值来)几个反馈分压电阻(设置输出电压)一个软启动电容(调启动时间)好了,一个能输出15A持续电流、20A峰值电流的完整电源方案就搭起来了。典型参考设计再看Layout就更直观了,当板子被主芯片挤得满满当当的时候,这个5mm×5mm的封装往那儿一放,省出来的空间感一下就出来了。layout设计推荐 MPM3865本质上是一个完整的电源系统级封装。它把PWM控制器、高低侧MOSFET、功率电感,还有一堆必要的补偿阻容,全部集成到了一个ECLGA 封装,尺寸5mm×5mm×2.76mm的封装里。内部功能框图但凡自己搭过普通DC/DC芯片的兄弟都知道,功率电感选型相对来说会麻烦一些,DCR要低、饱和电流要够、尺寸要合适,还得考虑EMI。环路补偿更是玄学,调不好就振荡。MPS把这些全包了,咱们只需要简单配置外围就行了。一个小建议:如果你是第一次用这种高集成度模块,别以为就很简单,可以仔细看看手册里PCB Layout Guidelines那一节,尤其是输入电容的摆放位置和PGND的处理。手册一共需要有8个细节提示,模块虽集成,但Layout好不好直接决定实际表现。其实,除了MPM3865,还有好几款其它芯片,单路、多路输出都有,电流覆盖5A到100A,顺手帮大家罗列一下:这几个型号看下来,从5A到100A、从单路到多路、从模拟到数字,MPS基本把加速卡和FPGA供电的各个场景都覆盖到了。这一系列的芯片资料以及相关参考资料都可以点击图片下载。做硬件选型就是这样,你手上积累的参考资料越多,下个项目启动的时候就越从容。临时上网搜,效率可能会慢一点。03设计要点1、宽电压输入输出这颗芯片的输入电压是2.7V到16V,覆盖了常见的5V、12V供电轨,甚至一些电池供电场景也能用。输出从0.6V到5.5V,不管是FPGA和ASIC的核电压、DDR内存的VTT,还是板上各种I/O电压,基本都覆盖了。有个小细节值得提一下:它支持外接3.3V VCC供电。芯片内部逻辑电路需要VCC供电才能工作,默认情况下是靠内部LDO从VIN取电。但如果VIN低于4V,内部LDO就无法 正常工作,这时直接从外部给VCC引脚供一路3.3V就行,芯片照样能跑。这个细节其实很多芯片都有类似设计,手册里也都写清楚了,但说实话,项目一急起来,谁还记得翻到那一页去看。通常都是板子贴回来发现低压启动不了,才一拍脑袋想起来,哦,还有这回事。所以这里跟大家提一下,选型的时候多留个心眼,提前确认清楚,能省不少事。关于输出电压的设定、反馈电阻的选型与摆放、PCB走线的注意事项,这些要点手册里都讲得很细,大家可以下载资料后慢慢看。另外提醒一句:R1上别忘了并一颗1nF的前馈电容,对瞬态响应有明显提升。关于这个电容的作用,我前几天也写过一篇文章聊过,MPS手册里也有专门说明,并且不同的输出电压给出了不同的取值,这点需要注意,大家可以把资料下载后查看。2、COT控制,快速动态响应聊到这颗芯片的核心优势,不得不提它的控制架构。MPM3865采用自适应恒定导通时间控制。它不像传统固定频率PWM控制器那样需要复杂的外部环路补偿,输出电压一有波动,功率管立刻响应,反应速度非常快。实际应用中,AI加速卡这类负载的电流跳变是出了名的猛,可能会从几毫安瞬间跳到十几安培。而MPM3865这种COT架构,从波形来看恢复很快、跌落很小,动态性能确实能打。第8页有一张 Load Transient波形图,第9页也有效率曲线和温升曲线,间接反映了COT架构下的整体性能表现。而且它的开关频率可以选择600kHz、800kHz或1000kHz,通过一个MODE引脚接不同电阻就行。频率选高一点,瞬态响应更快;选低一点,开关损耗小效率更高。这个权衡看具体需求。3、两个设计细节这些不仔细看手册可能注意不到,但实际用起来非常加分:差分远程电压采样VSNS±15A电流流过PCB走线,线上压降不是闹着玩的。差分采样直接拉到负载端的VOUT和GND,芯片能感知真实电压,自动补偿走线损失。这对大电流、低电压输出尤为重要。Pre-Biased启动如果你的输出端在芯片启动前已经有一个预偏置电压,MPM3685会暂时禁止开关动作,等到TRK/REF引脚的电压超过这个预偏置电压之后才开始正常软启动。整个过程输出一直平滑往上升,不会掉下来再回去。FPGA对启动单调性有硬性要求,这个功能很实用。保护功能齐全OCP过流保护、OVP过压保护、OTP过温保护,该有的全都有。其中OCP故障解除后自动恢复;OTP温度降下来自动重启。这些保护平时感觉不到存在,但真要遇到一次异常情况,少烧一颗主芯片,成本就全回来了。OCP支持外部电阻配置阈值,可以根据实际负载灵活设定限流点。OVP检测到输出电压超过116%参考值时,会主动把输出往下拉,保护后面的主芯片。毕竟FPGA和ASIC可不便宜,烧一颗够买一堆电源模块了。来源:硬件笔记本

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈