编码器Z相信号的一圈脉冲捕获
增量式编码器通过A、B两相正交脉冲输出位置信息,而Z相(Index或Zero Mark)信号作为每转一圈仅出现一次的零位参考点,是实现绝对位置校准和消除累积误差的关键。准确捕获Z相信号不仅需要硬件接线正确,更依赖于严谨的逻辑判断。以下指南将详细拆解从信号特性分析到软件逻辑实现的全过程。
一、 理解Z相信号的物理特性
在编写捕获逻辑前,必须明确Z相的物理行为,这直接决定了算法的鲁棒性。
-
确认 Z相脉冲宽度。
通常情况下,Z相脉冲宽度相当于A相的一个电气周期(360度电角度),或者是一个固定的窄脉冲。在某些高分辨率编码器中,Z相可能由多个方波组成,但中心位置是唯一的。 -
识别 电压类型。
确认编码器输出是推挽式、集电极开路(NPN/PNP)还是差分信号(RS422)。差分信号能提供更强的抗干扰能力,建议优先使用。 -
对齐 ABZ相位关系。
大多数标准编码器的Z相上升沿会与A相的特定状态(如低电平)在机械零点对齐。但在换相后,这种关系可能会反转,因此逻辑上不应仅依赖A相状态判断Z相,而应将其作为辅助验证。
二、 硬件接线与信号调理
稳定的信号输入是软件捕获的基础。干扰或边沿抖动会导致“多圈”计数错误。
-
连接 差分信号线。
若使用差分编码器,接入Z+和Z-信号至控制器的高速输入端。切勿只接Z+而将Z-悬空,这会大幅降低共模抑制比。 -
配置 输入滤波。
在控制器或PLC硬件组态中,设置 输入滤波时间常数。对于高速旋转应用,滤波时间应短于Z相脉冲的低电平持续时间;对于低速应用,可适当增大滤波值以消除抖动。 -
测量 边沿陡峭度。
使用示波器观察 Z相上升沿和下降沿的时间。如果边沿过于平缓(上升时间超过微秒级),需检查线路阻抗匹配或增加终端电阻。
三、 基础脉冲捕获逻辑(上升沿检测)
核心目标是识别Z相从低电平变为高电平的瞬间,并触发计数器清零或置位动作。
下面是通用的上升沿检测逻辑流程:
Current_Z] B --> C[判断 Current_Z = 1?] C -- 否 --> E[更新 Last_Z = Current_Z] C -- 是 --> D["判断 Last_Z = 0?"] D -- 否 --> E D -- 是 --> F["触发事件: 捕获成功"] F --> E E --> B
-
定义 状态变量。
在程序中创建两个布尔变量:Z_Current(当前状态)和Z_Last(上一周期状态)。 -
读取 物理输入。
在每个扫描周期开始时,将 物理输入点(例如I_X0)的状态赋值 给Z_Current。 -
执行 边沿逻辑判断。
使用公式逻辑判断上升沿:
$$ RisingEdge = Z\_Current \land \neg Z\_Last $$
即:当前为1,且上一次为0。 -
更新 历史状态。
在扫描周期结束前,将Z_Current的值传送 给Z_Last,为下一次比较做准备。
四、 高级精准定位(ABZ同步锁存)
仅捕获Z相的上升沿可能会存在±1个脉冲的偏差,因为Z相信号可能会在A相跳变的临界点出现。为了实现高精度的“零点对齐”,必须结合A、B相状态。
-
锁定 ABZ状态组合。
当检测到Z相上升沿时,不要立即复位,而是读取 当前A相和B相的电平状态。 -
比对 标准相位表。
根据编码器旋转方向,Z相有效时的AB相位是固定的。例如,正向旋转时Z相上升沿可能对应 A=0, B=1。 -
实施 校正逻辑。
如果捕获到的AB状态与标准状态不符,说明发生了信号抖动或干扰。此时应丢弃 本次捕获信号,或记录 报警,防止误复位。
| 旋转方向 | Z相上升沿时刻 A相电平 | Z相上升沿时刻 B相电平 | 校准动作 |
|---|---|---|---|
| 正转 (CW) | 0 | 1 | 执行 复位 |
| 反转 (CCW) | 1 | 1 | 执行 复位 |
| 正转 (CW) | 1 | 1 | 视为 干扰,忽略 |
五、 代码实现范例(PLC结构化文本)
以下是基于IEC 61131-3标准的结构化文本(ST)代码示例,展示了带AB校验的Z相捕获逻辑。
(* 定义变量 *)
VAR
// 输入信号
Encoder_Z AT %I0.0 : BOOL;
Encoder_A AT %I0.1 : BOOL;
Encoder_B AT %I0.2 : BOOL;
// 内部状态
Z_Last_Cycle : BOOL := FALSE;
Z_Edge_Detected : BOOL := FALSE;
// 输出控制
Execute_Reset : BOOL := FALSE;
END_VAR
(* 1. 捕获Z相上升沿 *)
Z_Edge_Detected := Encoder_Z AND NOT Z_Last_Cycle;
(* 2. 更新历史状态 *)
Z_Last_Cycle := Encoder_Z;
(* 3. ABZ同步校验与复位触发 *)
IF Z_Edge_Detected THEN
(* 假设正向旋转标准零点为 A=0, B=1 *)
IF (Encoder_A = FALSE) AND (Encoder_B = TRUE) THEN
Execute_Reset := TRUE; (* 触发计数器复位 *)
ELSE
(* 状态异常,可能是干扰或反向旋转,根据需求处理 *)
Execute_Reset := FALSE;
END_IF;
ELSE
(* 脉冲消失后复位触发信号,形成单周期脉冲 *)
Execute_Reset := FALSE;
END_IF
六、 常见问题处理
-
处理 信号震荡。
如果在Z相高电平期间,Execute_Reset信号多次跳变,说明逻辑中缺少了“自锁”或“单稳态”处理。确保 复位指令仅在一个扫描周期内有效,或者使用沿检测指令驱动复位功能块。 -
解决 停机时的漂移。
当轴缓慢爬行或停止时,Z相可能恰好停留在上升沿附近,导致信号在0和1之间反复跳变。增加 迟滞逻辑:只有当Z相信号稳定保持高电平超过一定时间(例如10ms)后,才确认为有效信号。 -
计算 位置偏移量。
如果机械零点与电气零点存在偏角,不要通过物理旋转编码器来校正。记录 Z相触发时刻的计数值,在软件中加减 该偏移量作为最终坐标。

暂无评论,快来抢沙发吧!