单片机 编码器锁存

如果你说的 “单片机编码器锁存” 是指读取旋转编码器的位置,然后把当前计数值锁存下来,那么一般有两种常见含义。

1. 编码器计数

比如增量式编码器有:

 
A相 ─────┐
         │ → MCU定时器/编码器接口
B相 ─────┘
 

编码器转动:

 
A:  ──┐    ┌──    ┌──
      └────┘  └────┘

B:    ──┐    ┌──    ┌──
        └────┘  └────┘
 

MCU 根据 A/B 相位关系判断:

 
顺时针 → Count +1
逆时针 → Count -1
 

例如:

 
当前位置 = 12586
 

2. “锁存”是什么意思?

假设编码器一直在转:

 
时间       编码器计数

10.000s    12586
10.001s    12587
10.002s    12588
10.003s    12589
 

突然来了一个锁存信号:

 
LATCH
  │
  ↓
MCU ─────→ 把当前12589保存下来
 

于是:

 
Encoder Count = 12589
                    ↓
                 锁存
                    ↓
Latch Value = 12589
 

之后编码器继续转:

 
Encoder Count
12590
12591
12592
...
 

但:

 
Latch Value
12589
 

不会跟着变化。


3. 单片机里面通常这么做

例如 STM32:

 
volatile int32_t encoder_count;
volatile int32_t encoder_latch;

void LatchEncoder(void)
{
    encoder_latch = encoder_count;
}
 

如果锁存信号来自 GPIO 中断:

 
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == LATCH_Pin)
    {
        encoder_latch = encoder_count;
    }
}
 

这样就是最基本的:

外部触发 → MCU瞬间保存编码器当前值。


4. 但工业控制里还有一种更重要的“硬件锁存”

如果你的应用要求非常精确的时间点,例如:

编码器高速运行,在外部传感器触发瞬间,必须记录当时的编码器位置。

那么最好不要:

 
GPIO中断
   ↓
CPU进入ISR
   ↓
读取编码器
 

因为中断响应会有延迟和抖动。

更好的结构是:

 
编码器
  ↓
STM32 Timer Encoder Mode
  ↓
     CNT
      │
      │
      ├──────→ 正常位置读取
      │
      │
外部触发 ──→ 硬件Capture/Latch
                 ↓
             保存CNT
                 ↓
            CCR / 寄存器
 

这种方式可以做到:

在硬件触发的那个瞬间锁存计数器值。

对于高速编码器、运动控制、激光测量、点胶、贴标、飞剪、位置检测等场景特别有用。

posted on 2026-09-28 20:42  lydstory  阅读(5)  评论(0)    收藏  举报

导航