4. 编码器反馈配置
任务目标
在LinuxCNC中配置编码器反馈通道,使运动控制器能够读取电机或主轴的实际位置。本案例以并行端口编码器接口为例,完成从硬件接线到软件配置的完整闭环,最终通过halscope或halcmd观察编码器计数值变化,验证位置反馈链路有效。
硬件与依赖
- 支持并行端口编码器输入的控制器(如采用
hm2_eth或parport驱动的主板) - 增量式编码器(A+/A-、B+/B-、Z+/Z-信号,5V或差分输出)
- LinuxCNC运行环境(建议2.8+版本),已安装
hostmot2或hal_parport驱动
核心实现
以下配置通过HAL命令在运行时加载编码器驱动并建立信号连接。若需开机自动加载,可将命令写入custom.hal文件。
#!/bin/bash
# 编码器反馈配置 - 基于hostmot2驱动(以mesa 7i76e为例)
# 若使用并口编码器,将hm2_7i76e替换为hal_parport并调整引脚映射
# 1. 加载驱动并创建编码器实例
loadrt hm2_7i76e board_ip="10.10.10.10" config="num_encoders=4"
# 2. 加载编码器读取组件
loadrt encoder num_chan=4
# 3. 连接hostmot2原始计数器到通用编码器
addf hm2_7i76e.0.read servo-thread
addf encoder.capture-position servo-thread
addf encoder.update-counters servo-thread
addf hm2_7i76e.0.write servo-thread
# 4. 信号连接(以编码器0为例)
# 4.1 原始计数器值 → 编码器组件
setp hm2_7i76e.0.encoder.00.counter-mode 0 # 0=正交计数, 1=步进方向
setp hm2_7i76e.0.encoder.00.filter 500 # 500ns滤波
# 4.2 编码器组件输出 → 位置信号
net pos-cmd axis.0.motor-pos-cmd
net pos-fb axis.0.motor-pos-fb <= encoder.0.position
net pos-raw encoder.0.position <= hm2_7i76e.0.encoder.00.raw-count
# 5. 设置编码器计数方向(若方向反了,取反)
setp encoder.0.position-scale 1.0 # 每计数对应1个用户单位
# 6. 将反馈接入运动控制器的闭环(以servo-thread为例)
# 若使用stepgen,则跳过此步,直接使用encoder作为主轴反馈
运行与验证
- 启动LinuxCNC并加载上述配置后,在终端执行:
# 查看编码器原始计数值是否随手动旋转变化
halcmd getp hm2_7i76e.0.encoder.00.raw-count
# 查看经过scale后的位置反馈
halcmd getp encoder.0.position
# 监控Z脉冲锁存(每转一次清零)
halcmd getp encoder.0.zero-position
- 手动缓慢旋转电机轴,观察
raw-count数值应持续递增或递减(方向取决于接线)。若数值不变,检查A/B相接线是否接反或断线。 - 使用
halscope同时采集encoder.0.position和axis.0.motor-pos-cmd,给定阶跃指令后,反馈信号应在数百毫秒内跟随指令,稳态误差为0。
通过条件
- 旋转编码器一周,
raw-count变化量等于编码器线数×4(如2500线编码器变化10000) - Z信号触发时
zero-position被清零,且与机械原点偏差小于1个计数 - 在
halscope中观察到位反馈与指令位置最终重合,无持续振荡
常见问题
- 计数方向相反:交换A/B两相接线,或设置
setp hm2_7i76e.0.encoder.00.counter-mode 1(若硬件支持方向反转) - 计数跳变:增大滤波器设置值(如从500改为2000),或检查编码器供电是否稳定
- Z脉冲无效:确认Z信号接入对应引脚,并在HAL中启用索引捕获(
setp hm2_7i76e.0.encoder.00.index-enable 1)