如何实现旋转编码器的电路设计?
增量式编码器轴旋转时,有相应的相位输出。其旋转方向的判别和脉冲数量的增减,需借助后部的判向电路和计数器来实现。
更多
实现旋转编码器的电路设计需要根据其类型(增量式或绝对值式)进行,增量式旋转编码器因其成本低、接口简单而最为常用。以下是针对增量式旋转编码器的完整电路设计步骤及注意事项:
一、硬件电路设计
1. 基础连接
- 引脚定义:
- A相(CLK):脉冲输出1
- B相(DT):脉冲输出2(与A相差90°相位)
- C相(COM/GND):接地或公共端
- SW(可选):按钮开关引脚(按下时接地)
2. 电路设计
+-----------------+ +-----------------+
| 旋转编码器 | | 微控制器 |
| | | (如MCU) |
| A相 -----------|----------> GPIOx (如PC0) |
| B相 -----------|----------> GPIOx (如PC1) |
| SW -----------|----------> GPIOx (如PC2) |
| COM -----------|----------| GND |
+-----------------+ +-----------------+
3. 关键外围电路
-
上拉电阻(必需):
- 在A、B、SW信号线上添加 1kΩ~10kΩ上拉电阻至VCC(3.3V/5V)。
- 作用:避免引脚悬空导致误触发。
- 电路示例:
VCC | R (上拉电阻) | |-----> 到MCU的GPIO | A相/B相/SW
-
硬件消抖电路(可选但推荐):
- 采用 RC低通滤波器(100nF电容 + 10kΩ电阻)滤除抖动噪声。
- 电路示例:
A相/B相 --- R (10kΩ) ---|-----> 到MCU | C (100nF) | GND
-
ESD保护(高速应用):
- 在信号线上并联 TVS二极管(如SMAJ5.0A)防止静电损坏。
二、软件解码逻辑
1. 状态检测(四步法)
通过检测A、B相的当前状态(current) 和前一状态(previous) 变化确定方向:
// 定义引脚
#define ENC_A PC0
#define ENC_B PC1
// 状态存储
uint8_t prevState = 0;
uint8_t currState = 0;
void readEncoder() {
prevState = currState;
currState = (digitalRead(ENC_A) << 1) | digitalRead(ENC_B); // 组合为2bit状态
// 状态变化表
if (prevState == 0b00 && currState == 0b10) direction = CW; // 顺时针
if (prevState == 0b00 && currState == 0b01) direction = CCW; // 逆时针
// 其他状态转换逻辑类似(完整需16种组合)
}
2. 完整四步状态机
| 前状态 | 新状态 | 方向 |
|---|---|---|
| 00 | 10 | CW |
| 00 | 01 | CCW |
| 01 | 00 | CW |
| 01 | 11 | CCW |
| 11 | 01 | CW |
| 11 | 10 | CCW |
| 10 | 11 | CW |
| 10 | 00 | CCW |
3. 代码优化(位运算)
// 高效解码函数(每步变化调用一次)
void handleEncoderInterrupt() {
static uint8_t prev = 0;
uint8_t curr = (GPIOA->IDR & 0x03); // 假设A/B接PA0/PA1
// 状态变化检测:仅当A或B变化时处理
if (curr == prev) return;
// 方向判定(XOR与移位组合)
if ((prev == 0x00 && curr == 0x02) ||
(prev == 0x02 && curr == 0x03) ||
(prev == 0x03 && curr == 0x01) ||
(prev == 0x01 && curr == 0x00)) {
position++; // 顺时针
} else {
position--; // 逆时针
}
prev = curr;
}
三、防抖动处理
软件消抖方案
// 在中断服务程序(ISR)中添加延时消抖
void EXTI0_IRQHandler() { // A相中断
if (EXTI->PR & EXTI_PR_PR0) {
delayMicroseconds(200); // 阻塞延时200μs
readEncoder(); // 读取状态
EXTI->PR |= EXTI_PR_PR0; // 清除中断标志
}
}
优化方案(非阻塞)
// 定时器中断中周期性采样(推荐)
void TIM2_IRQHandler() {
if (TIM2->SR & TIM_SR_UIF) {
static uint8_t lastA = 0;
uint8_t currentA = digitalRead(ENC_A);
if (lastA != currentA) {
readEncoder();
}
lastA = currentA;
TIM2->SR &= ~TIM_SR_UIF;
}
}
四、高级优化技巧
-
正交编码器接口(QEI):
- STM32等MCU内置硬件编码器模块,自动计数方向与步数。
- 配置示例(STM32CubeIDE):
htim3.Instance = TIM3; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; TIM_EncoderInterfaceConfig(&htim3, TIM_ENCODERMODE_TI12, TIM_POLARITY_RISING, TIM_POLARITY_RISING); HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
-
高速应用建议:
- 使用光耦隔离(如HCPL-2630)减少电气干扰。
- PCB布局:信号线差分走线,避免并行长走线。
五、完整电路示例(带消抖与ESD)
+-----------------+ +-----------------+
| 旋转编码器 | | 微控制器 |
| A相 --[10kΩ]---+----------| PA0 |
| | | | |
| [100nF] | | |
| | | | |
| GND | | |
| | | |
| B相 --[10kΩ]---+----------| PA1 |
| | | | |
| [100nF] | | |
| | | | |
| GND | | |
| | | |
| SW --[10kΩ]---+----------| PA2 |
| | | | |
| GND | | |
| COM -----------|----------| GND |
+-----------------+ +-----------------+
设计验证要点
- 示波器检测A/B相信号相位差是否为90°。
- 旋转时检查波形是否有抖动毛刺。
- 通过串口输出位置值测试连续旋转计数精度。
按此方案可实现稳定可靠的旋转编码器接口,适用于工业控制、人机交互等场景。
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 芯片的工作原理是什么?
- ssd是什么意思
- 什么是蓝牙?它的主要作用是什么?
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- dtmb信号覆盖城市查询
- 怎样挑选路由器?
- 华为芯片为什么受制于美国?
- 元宇宙概念股龙头一览
- type-c四根线接法图解
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- BLDC电机技术分析
- 复位电路的原理及作用
- dsp是什么意思?有什么作用?
- iphone13promax电池容量是多少毫安
- 苹果无线充电器怎么使用?
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 传感器常见类型有哪些?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机