尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

BeagleY-AI与DM542T步进驱动器及直线执行机构集成实战

BeagleY-AI与DM542T步进驱动器及直线执行机构集成实战 1. 项目缘起与整体设计思路1.1 为什么要把这三样东西凑在一起BeagleY-AI 是一块基于 TI AM67A 处理器的单板计算机四核 Cortex-A53 加双核 RISC-V 协处理器还带了一个 4 TOPS 算力的 AI 加速单元。DM542T 是雷赛Leadshine出品的数字式步进驱动器支持 20-50VDC 供电、峰值 4.2A 电流细分最高到 12800 步/转。Linear Actuation 说白了就是直线执行——把电机的旋转运动变成推杆的直线伸缩。这三样东西凑一块本质上是在搭一套“能自己看、自己判断、自己动”的直线运动控制系统。BeagleY-AI 负责视觉识别和决策DM542T 负责把弱电信号放大成能驱动步进电机的强电脉冲直线执行机构负责把旋转变成推拉。整套东西可以理解成一个简化版的机械臂直线轴或者一个自动推料、自动压装、自动定位的工位。我最初接触这个组合是因为一个朋友在做小型自动化装配台需要根据摄像头拍到的零件位置自动把推杆伸到对应位置去压紧。市面上的 PLC 方案要么太贵要么视觉功能得外挂工控机体积和成本都下不来。BeagleY-AI 这种带 AI 加速的单板机刚好卡在中间——比树莓派多了一点实时性和 AI 算力比工控机便宜一大截。1.2 方案选型的几个关键考量先说 BeagleY-AI 为什么合适。它最核心的优势是引出了 40-pin 的 RPi 兼容排针同时还有专门的 PRU可编程实时单元和 RISC-V 协处理器。PRU 这个东西很关键它能在不占用 Linux 主核的情况下以纳秒级精度产生脉冲序列。DM542T 需要的脉冲信号是方波频率从几百赫兹到几十千赫兹不等如果直接用 Linux 的 GPIO 库去翻转引脚系统调度一抖动脉冲就不均匀了电机走起来会有明显的顿挫感。用 PRU 来发脉冲抖动可以压到几十纳秒以内这是这套方案能跑顺的根本原因。DM542T 的选择逻辑更直接。它支持 5V 差分信号输入BeagleY-AI 的 GPIO 是 3.3V 电平中间需要加一级电平转换或者光耦隔离。DM542T 内部自带光耦输入级是双端差分结构共阳或共阴接法都行。它的细分设置通过拨码开关完成从 400 到 12800 步/转共 8 档电流也是 8 档可调。对于直线执行机构来说细分越高运动越平滑但高细分下脉冲频率也越高对控制器的脉冲发生能力要求就上去了。我一般建议在 1600 到 3200 步/转之间选兼顾平滑度和脉冲频率。直线执行机构这块常见的有三种丝杆滑台、同步带滑台、电动推杆。丝杆滑台精度最高重复定位能到 0.01mm 级别但速度慢同步带滑台速度快精度差一些电动推杆结构最紧凑但行程和推力受限。如果做的是压装、点胶、精密定位这类活丝杆滑台是首选。我这次用的是 1605 滚珠丝杆导程 5mm配 57 步进电机水平行程 300mm。1.3 整体控制架构长什么样整个系统的信号流是这样的BeagleY-AI 上的摄像头采集图像AI 加速单元跑一个轻量目标检测模型算出目标位置偏差。这个偏差经过运动学换算变成脉冲数和方向信号通过 GPIO 传给 DM542T。DM542T 把脉冲放大后驱动 57 步进电机旋转电机通过联轴器带动丝杆丝杆螺母把旋转变成直线运动推动滑台到达目标位置。反馈环节有两个层次。第一层是电机端的编码器如果电机带的话用来检测丢步第二层是滑台上的限位开关和原点开关用来做回零和硬限位保护。BeagleY-AI 的 GPIO 中断响应在 Linux 层面大概是微秒级做限位保护够用但做高速位置锁存就不行了那种场景得用 PRU 来抓。供电方面要特别注意。BeagleY-AI 用 5V/3A 的 Type-C 供电DM542T 用 24V 或 36V 开关电源两个电源的地要共在一起否则脉冲信号没有参考地驱动器会丢步或者乱转。我见过有人用两个独立电源不共地结果电机走一步停三步查了半天以为是脉冲频率问题其实是地没接对。2. 核心细节解析与实操要点2.1 BeagleY-AI 的 GPIO 与 PRU 配置细节BeagleY-AI 的 40-pin 排针上能用的 GPIO 不少但要注意有些引脚默认被其他功能占用了。比如 PIN 8 和 PIN 10 默认是 UARTPIN 3 和 PIN 5 默认是 I2C。如果你要用这些脚做脉冲输出得先改设备树覆盖层把功能复用改掉。我选的是 PIN 29GPIO 5_14做脉冲输出PIN 31GPIO 5_15做方向输出PIN 33GPIO 5_16做使能输出。这三个脚在默认状态下都是普通 GPIO不用改设备树省事。但要注意BeagleY-AI 的 GPIO 编号方式和树莓派不一样它用的是 TI 的 GPIO 分组编号bank 5 对应的是 /dev/gpiochip5 或者类似的设备节点。用 libgpiod 操作的时候得先 gpiodetect 看一下实际有哪些 chip。PRU 的配置稍微麻烦一点。BeagleY-AI 有两个 PRU 核PRU0 和 PRU1每个都有 8KB 的指令 RAM 和 8KB 的数据 RAM。要往 PRU 里加载固件得用 remoteproc 框架。具体流程是把编译好的 PRU 固件.out 文件放到 /lib/firmware/ 目录下然后 echo 固件名 /sys/class/remoteproc/remoteproc0/firmware再 echo start /sys/class/remoteproc/remoteproc0/state。启动之后PRU 就能独立于 Linux 主核运行了。PRU 发脉冲的代码逻辑不复杂核心就是一个循环拉高引脚、延时半个周期、拉低引脚、延时半个周期。关键是延时要用 PRU 的周期计数器来做不能用空循环因为 PRU 的主频是 200MHz空循环的周期数不好精确控制。我一般用 PRU 的 IEP工业以太网外设计数器它有一个 64 位的自由运行计数器精度是 5ns足够用了。注意PRU 固件编译需要 TI 的 PRU 编译器pru-gcc在 BeagleY-AI 上可以直接 apt install pru-gcc 安装。编译的时候要指定 -mcpucortex-m4 之类的参数具体看 PRU 的架构版本。2.2 DM542T 的拨码开关与接线要点DM542T 的拨码开关一共 8 位SW1-SW3 设电流SW4 设半流/全流SW5-SW8 设细分。电流设置这块57 步进电机的额定电流一般是 2.8A 到 4.2ADM542T 的峰值电流档位从 1.0A 到 4.2A。我一般把电流设成电机额定电流的 80% 到 90%留一点余量避免电机发热太厉害。比如 3A 的电机设到 2.8A 左右就行。细分设置要结合丝杆导程和需要的分辨率来算。假设丝杆导程是 5mm电机步距角是 1.8 度200 步/转如果细分设成 1600那电机转一圈需要 1600 个脉冲滑台移动 5mm每个脉冲对应 5/1600 0.003125mm也就是 3.125 微米。这个分辨率对于大多数装配应用足够了。如果细分设成 3200分辨率翻倍到 1.5625 微米但脉冲频率也翻倍BeagleY-AI 的 PRU 在 200MHz 主频下最高能发大概 1MHz 的脉冲对应 3200 细分时电机转速是 1MHz/3200 312 转/秒这已经远超步进电机的响应能力了实际用不到这么高。接线方面DM542T 的 PUL、PUL-、DIR、DIR-、ENA、ENA- 是差分输入。BeagleY-AI 的 GPIO 是单端 3.3V 输出接法有两种共阳接法是把 PUL、DIR、ENA 都接到 5V 电源正极PUL-、DIR-、ENA- 分别接 GPIO共阴接法是把 PUL-、DIR-、ENA- 都接到地PUL、DIR、ENA 接 GPIO。我推荐共阳接法因为 DM542T 内部光耦的阳极接 5V 时阴极只需要拉低到 0.5V 以下就能导通3.3V 的 GPIO 拉低时能到 0.2V 左右完全够用。共阴接法的话GPIO 输出高电平 3.3V光耦阳极只有 3.3V电流可能不够尤其是线长的时候压降更明显。提示如果通信距离超过 1 米建议用双绞线或者屏蔽线PUL 和 DIR 分开走线避免串扰。我遇到过脉冲线跟电机线捆在一起结果电机每走几步就抖一下分开走线之后问题消失。2.3 直线执行机构的机械装配与校准丝杆滑台的装配精度直接决定最终定位精度。联轴器连接电机轴和丝杆时一定要保证同轴度。我见过有人直接用刚性联轴器硬连电机轴和丝杆不同心转起来之后丝杆别着劲走几步就卡死。正确的做法是用弹性联轴器它能补偿 0.1mm 到 0.2mm 的径向偏差和 1 度到 2 度的角度偏差。丝杆的预压也很关键。滚珠丝杆如果预压不够反向间隙会很大正向走 10mm反向回来可能只走了 9.8mm。预压靠的是双螺母结构调整两个螺母之间的垫片厚度来改变预紧力。预紧力太小间隙大预紧力太大摩擦阻力大电机发热。一般用手转动丝杆感觉有一点阻力但能顺畅转动就行。限位开关的安装位置要留足安全余量。我一般把硬限位开关装在行程两端再往外 5mm 的位置原点开关装在行程中间偏一端的位置。这样即使程序跑飞了滑台撞到限位开关之前还有 5mm 的缓冲不会把丝杆撞弯。限位开关的触发信号接到 BeagleY-AI 的 GPIO 上用中断方式检测一旦触发立即停止脉冲输出。3. 实操过程与核心环节实现3.1 系统搭建的完整步骤第一步是硬件连接。先把 BeagleY-AI 用 Type-C 线接到 5V/3A 电源上HDMI 接显示器USB 接键盘鼠标开机进系统。然后把 DM542T 的电源接到 24V 开关电源上注意正负极不要接反。接着把电机的四根线A、A-、B、B-接到 DM542T 的对应端子用万用表测一下电机线圈的通断确认接线正确。最后把 BeagleY-AI 的 GPIO 接到 DM542T 的信号输入端共阳接法。第二步是配置 BeagleY-AI 的 GPIO。先安装 libgpiod 工具sudo apt install gpiod libgpiod-dev。然后用 gpiodetect 查看有哪些 gpiochip用 gpioinfo 查看每个 chip 的引脚占用情况。找到 PIN 29、31、33 对应的 gpiochip 和 line 编号记下来。我这边实测 PIN 29 对应 gpiochip1 的 line 14PIN 31 对应 line 15PIN 33 对应 line 16。第三步是编译和加载 PRU 固件。PRU 固件的源码我放在 /opt/pru/ 目录下主要就是一个 main 函数里面初始化 IEP 计数器然后进入一个循环根据共享内存里的指令来发脉冲。编译命令是 pru-gcc -o pulse.out pulse.c -mcpucortex-m4 -mthumb。编译好之后复制到 /lib/firmware/然后通过 remoteproc 加载。第四步是写上位机控制程序。我用 Python 写了一个简单的控制类封装了回零、绝对运动、相对运动、停止这几个方法。回零的逻辑是先往负方向走直到碰到原点开关然后反向走一点脱离开关再慢速靠近记录下原点位置。绝对运动就是根据目标位置和当前脉冲计数算出需要发的脉冲数和方向写到 PRU 的共享内存里PRU 自动发完。第五步是联调。先不接丝杆让电机空转用示波器看 PUL 引脚的波形确认频率和占空比正常。然后接上丝杆手动发几个脉冲看滑台动不动。最后跑一个简单的往复运动测试从 0 走到 100mm再走回来用百分表测重复定位精度。3.2 脉冲频率与运动参数的换算这套系统里脉冲频率决定了电机的转速进而决定了滑台的移动速度。换算公式是滑台速度mm/s 脉冲频率Hz÷ 细分步/转× 丝杆导程mm/转。举个例子细分设 1600丝杆导程 5mm如果脉冲频率是 10kHz那滑台速度 10000 ÷ 1600 × 5 31.25 mm/s。这个速度对于精密装配来说偏快一般用 2kHz 到 5kHz对应 6.25 到 15.6 mm/s。加速和减速也要考虑。步进电机不能瞬间从 0 跳到高速会丢步。我一般用梯形加减速加速时间设 0.1 到 0.3 秒。在 PRU 固件里加速的实现方式是让脉冲间隔逐渐减小比如从 500 微秒开始每个脉冲减 1 微秒减到 100 微秒为止。减速反过来。注意加速曲线不要太陡尤其是负载惯量大的时候。我试过加速时间设 0.05 秒结果电机堵转发出嗡嗡声但不转。后来改成 0.2 秒就正常了。判断加速是否合适的方法是用手摸电机如果加速时电机有明显的震动或者声音突变说明加速太猛了。3.3 视觉定位与运动控制的联动BeagleY-AI 的 AI 加速单元跑的是 YOLOv5 的轻量版本输入分辨率 640x480检测目标是一个红色圆点。模型输出圆点的中心坐标然后跟画面中心坐标做差得到像素偏差。像素偏差要转换成实际物理偏差需要标定。标定方法是在视野里放一个已知尺寸的物体比如 10mm 的方块看它在画面里占多少像素算出像素当量mm/pixel。假设像素当量是 0.1mm/pixel画面中心是 (320, 240)检测到的圆点中心是 (350, 220)那 X 方向偏差是 (350-320)×0.1 3mmY 方向偏差是 (220-240)×0.1 -2mm。然后把这个偏差加到目标位置上算出新的脉冲数发给 PRU 执行。整个闭环的周期大概是 50ms 到 100ms取决于模型推理速度和图像采集速度。对于慢速装配来说够用了但如果要跟踪快速移动的物体就得用 PRU 做硬件触发让摄像头曝光和脉冲输出同步。4. 常见问题与排查技巧实录4.1 电机不转或抖动不转这是最常见的问题原因大概有五六种。我整理了一个排查表按可能性从高到低排列。现象可能原因排查方法解决方法电机完全不转但有嗡嗡声缺相或接线错误万用表测电机线圈通断重新接线确认 A A- B B- 对应电机抖动但不连续转脉冲频率太高降低脉冲频率到 1kHz 以下调整 PRU 脉冲间隔电机走一步停一步地线没共万用表测 BeagleY-AI 和 DM542T 的地是否连通把两个电源的地接在一起电机只往一个方向转方向信号没接或接反用万用表测 DIR 引脚电平检查 DIR 接线交换 DIR DIR-电机发热严重但不转电流设太大或细分太低摸电机外壳温度降低电流档位提高细分我踩过最坑的一次是电机走一步停三步查了半天以为是脉冲问题后来发现是 DM542T 的使能信号没接驱动器处于半使能状态时通时断。把 ENA 接到 5VENA- 接地之后电机就正常了。所以使能信号一定要接不能悬空。4.2 丢步与定位精度差丢步的表现是发 1000 个脉冲滑台应该走 3.125mm实际只走了 3.0mm。原因可能是负载太大、加速太猛、电流不够、或者机械卡涩。排查丢步的第一步是空载测试。把丝杆和电机的联轴器拆开让电机空转发 10000 个脉冲看电机转了多少圈。如果空转不丢步说明问题在机械负载上。第二步是测电流用钳形表夹住电机的一相线看电流是否达到设定值。如果电流偏低可能是电源功率不够或者驱动器限流了。机械卡涩的排查方法是断开电机用手转动丝杆感觉一下阻力是否均匀。如果某个位置特别紧可能是丝杆弯曲或者导轨不平行。我遇到过导轨安装时两端高度差 0.5mm滑台走到中间就卡调整导轨垫片之后解决。提示提高定位精度的一个小技巧是双向逼近。比如要从 0 走到 100mm不要直接走到 100而是先走到 102再反向走到 100。这样每次都是从同一个方向逼近目标消除了反向间隙的影响。代价是运动时间变长但对于精度要求高的场合很值得。4.3 PRU 固件加载失败PRU 固件加载失败的表现是echo start 之后/sys/class/remoteproc/remoteproc0/state 还是 offline或者变成 running 但引脚没输出。常见原因有几个。一是固件路径不对remoteproc 默认从 /lib/firmware/ 找固件文件名要跟 echo 进去的名字完全一致。二是固件格式不对PRU 固件必须是 ELF 格式不能是 bin 或者 hex。三是 PRU 被其他驱动占用了比如某些引脚默认被 PRU 的 UART 或者 IEP 功能占用需要在设备树里 disable 掉。排查方法是看 dmesg 的输出。加载失败时dmesg 里会有 remoteproc 相关的报错信息比如 failed to load firmware 或者 invalid ELF header。根据报错信息去搜基本都能找到原因。4.4 视觉识别受光照影响大YOLO 模型对光照变化很敏感。白天窗户进来的自然光和晚上日光灯的光色温和亮度都不一样同一个红色圆点白天检测置信度 0.9晚上可能只有 0.5。解决办法有三个。一是加补光灯用环形 LED 灯从镜头周围打光保证光照稳定。二是做颜色空间转换把 RGB 转成 HSV在 HSV 空间里做阈值分割对光照变化的鲁棒性更好。三是数据增强训练模型的时候加入不同亮度和色温的样本让模型适应各种光照条件。我一般用第一种加第二种的组合。环形补光灯成本很低几十块钱效果立竿见影。HSV 阈值分割作为预处理把红色区域先提取出来再送给 YOLO 做精细定位这样即使光照有波动检测也不会完全失效。4.5 系统长时间运行后位置漂移跑几个小时之后发现滑台回到原点时位置跟刚开始差了 0.1mm 到 0.2mm。这种漂移一般是热膨胀引起的。丝杆和导轨在电机发热的烘烤下会伸长尤其是丝杆5mm 导程的丝杆温度升高 10 度300mm 长度大概会伸长 0.02mm 到 0.05mm。虽然不大但对于精密装配来说已经超差了。解决办法是定期回零。我一般设一个定时器每运行 100 个循环就自动回一次零把累积误差清零。回零的时候要等系统热稳定刚开机的时候回零不准因为丝杆还没热起来。我通常让系统先空跑 10 分钟预热然后再开始正式工作。另一个办法是用光栅尺做全闭环。光栅尺直接测滑台的实际位置不依赖丝杆的机械精度。但光栅尺成本高安装也麻烦对于 0.1mm 级别的精度要求定期回零就够了。4.6 常见问题速查表问题快速排查步骤大概率原因电机不转测脉冲引脚有无波形 → 测使能引脚电平 → 测电机线圈通断使能没接或脉冲没发电机抖动降低脉冲频率 → 检查地线 → 检查接线频率太高或地没共丢步空载测试 → 测电流 → 手动转丝杆负载大或电流不够PRU 加载失败dmesg 看报错 → 检查固件路径 → 检查设备树固件格式或引脚冲突视觉检测不稳加补光灯 → 转 HSV → 检查模型光照变化或模型过拟合位置漂移预热 → 定期回零 → 测丝杆温度热膨胀5. 几个容易被忽略的实操心得5.1 电源的选择与噪声抑制DM542T 的供电电压范围是 20-50VDC我推荐用 36V 而不是 24V。电压高一点电机的高速力矩会好一些不容易丢步。但也不能太高超过 48V 有些驱动器会保护。开关电源的功率要留足余量57 步进电机 3A 相电流两相同时通电就是 6A36V 下功率 216W选 350W 的电源比较稳妥。噪声抑制方面在 DM542T 的电源输入端并一个 1000uF 的电解电容和一个 0.1uF 的陶瓷电容能有效吸收电机换向时产生的反电动势。我试过不加电容电机启停时 BeagleY-AI 会重启加了之后就没再出现过。5.2 联轴器的选择与安装弹性联轴器有几种梅花联轴器、膜片联轴器、波纹管联轴器。梅花联轴器便宜但弹性体容易老化膜片联轴器刚性好适合高扭矩波纹管联轴器零背隙适合高精度。我一般用膜片联轴器兼顾刚性和成本。安装的时候电机轴和丝杆的插入深度要够一般不少于联轴器长度的一半。顶丝要拧紧最好加一点螺纹胶防止震动松脱。我遇到过顶丝松了电机转但丝杆不转查了半天以为是程序问题。5.3 限位开关的接线与去抖限位开关用常闭型比常开型安全。常闭型在正常情况下是导通的一旦线断了或者开关坏了信号变成断开系统会立即停止这是故障安全的设计。常开型相反线断了系统不知道继续走直到撞坏。去抖方面机械开关的抖动时间大概 1ms 到 5ms在 Linux GPIO 中断里可以用软件去抖检测到边沿之后延时 10ms 再读一次如果还是触发状态就确认。但软件去抖会占用中断上下文时间更好的办法是用 RC 低通滤波加施密特触发器硬件去抖。5.4 固件升级与版本管理BeagleY-AI 的系统和 PRU 固件都要做版本管理。我一般用 git 管理 PRU 固件源码每次修改都提交commit message 写清楚改了什么。系统镜像用 dd 备份到 SD 卡出问题了直接换卡。提示PRU 固件升级后一定要重新加载 remoteproc不能只重启系统。因为 remoteproc 有缓存不重新加载的话还是跑的老固件。我踩过这个坑改了固件死活不生效后来发现是没重新加载。5.5 安全防护的硬措施软件限位不可靠一定要加硬件限位。我在行程两端各装了一个机械限位开关直接串在 DM542T 的使能回路上。一旦撞到限位使能断开电机立即失电停止不依赖任何软件。这是最后一道防线希望永远用不上但不能没有。另外滑台上装一个急停按钮直接切断 DM542T 的电源。急停按钮要用蘑菇头带自锁的按下去锁住旋转才能复位。不要用普通按钮误触了弹回来系统又动了很危险。这套 BeagleY-AI 加 DM542T 加丝杆滑台的组合我从搭第一版到现在稳定运行前前后后调了大概两个月。最开始的版本用软件 GPIO 发脉冲电机走起来像得了帕金森后来换成 PRU 才彻底解决。视觉部分也是一开始用 OpenCV 的轮廓检测光照一变就废换了 YOLO 加 HSV 预处理才稳下来。如果你也在搭类似的系统我的建议是先把脉冲和电机调通再搞视觉不然两个问题混在一起排查起来很痛苦。
返回列表