单片机 编码器锁存
如果你说的 “单片机编码器锁存” 是指读取旋转编码器的位置,然后把当前计数值锁存下来,那么一般有两种常见含义。
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 / 寄存器
这种方式可以做到:
在硬件触发的那个瞬间锁存计数器值。
对于高速编码器、运动控制、激光测量、点胶、贴标、飞剪、位置检测等场景特别有用。
浙公网安备 33010602011771号