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作为主轴反馈

运行与验证

  1. 启动LinuxCNC并加载上述配置后,在终端执行:
# 查看编码器原始计数值是否随手动旋转变化
halcmd getp hm2_7i76e.0.encoder.00.raw-count

# 查看经过scale后的位置反馈
halcmd getp encoder.0.position

# 监控Z脉冲锁存(每转一次清零)
halcmd getp encoder.0.zero-position
  1. 手动缓慢旋转电机轴,观察raw-count数值应持续递增或递减(方向取决于接线)。若数值不变,检查A/B相接线是否接反或断线。
  2. 使用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)