深入解析CH32V EC11旋转编码器:从硬件原理到嵌入式开发实战

1次阅读
没有评论

共计 1553 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

背景与痛点

EC11 旋转编码器因其结构简单、成本低廉,在嵌入式人机交互界面 (HMI) 中被广泛用于参数调节、菜单选择等场景。但实际开发中常遇到两个核心问题:

深入解析 CH32V EC11 旋转编码器:从硬件原理到嵌入式开发实战

  • 信号抖动:机械触点闭合 / 断开时会产生 5 -10ms 的振荡波形(实测示波器截图见附录)。若直接读取电平会导致多次误触发
  • 方向误判:AB 两相信号相位差解读错误时,会出现旋转方向与操作意图相反的情况

这些问题在 CH32V 这类资源受限的 MCU 上尤为突出,需要硬件和软件协同解决。

硬件工作原理

EC11 本质是机械式正交编码器,其 AB 相输出典型波形如下:

 A 相: __|¯¯|____|¯¯|__
B 相: ____|¯¯|__|¯¯|____
         ↑ 顺时针旋转

当顺时针旋转时,A 相下降沿对应 B 相低电平;逆时针时 A 相下降沿对应 B 相高电平。CH32V 的 GPIO 中断支持双边沿触发,配置时应:

  1. 设置 AB 相为输入模式,启用内部上拉电阻
  2. 配置双边沿触发中断,建议用 EXTI 模块而非轮询
  3. 中断优先级设为高于主循环但低于实时任务

核心算法实现

状态机解码

采用 4 状态模型(状态转移图见附录):

  • S0:初始稳定态
  • S1:A 相变化等待确认
  • S2:B 相变化等待确认
  • S3:去抖延时态

状态转移条件基于:

  1. 当前 AB 相电平组合
  2. 定时器标记的消抖时间(建议 8 -10ms)

关键代码片段

// GPIO 初始化
void Encoder_Init() {GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = ENC_A_PIN | ENC_B_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING_RISING; // 双边沿触发
    GPIO_InitStruct.Pull = GPIO_PULLUP; // 启用内部上拉
    HAL_GPIO_Init(ENC_PORT, &GPIO_InitStruct);

    // 配置 NVIC 优先级
    HAL_NVIC_SetPriority(EXTIx_IRQn, 2, 0); 
    HAL_NVIC_EnableIRQ(EXTIx_IRQn);
}

// 中断服务函数
void EXTIx_IRQHandler(void) {
    static uint8_t state = S0;
    static uint32_t last_time = 0;

    uint8_t a = HAL_GPIO_ReadPin(ENC_PORT, ENC_A_PIN);
    uint8_t b = HAL_GPIO_ReadPin(ENC_PORT, ENC_B_PIN);
    uint32_t now = HAL_GetTick();

    switch(state) {
        case S0:
            if((now - last_time) > DEBOUNCE_MS) {
                state = S1;
                last_time = now;
            }
            break;
        // 其他状态处理...
    }
    __HAL_GPIO_EXTI_CLEAR_IT(ENC_PIN);
}

性能优化建议

通过改变中断采样频率测试解码准确率(测试数据):

采样间隔(ms) 误判率(%)
1 0.2
5 1.8
10 4.5

推荐配置:

  • 消抖时间:8ms(兼顾响应速度和稳定性)
  • 中断优先级:高于主任务但低于 PWM 等实时外设
  • 采用硬件滤波:100nF 电容并联 10kΩ 上拉电阻

PCB 设计要点

  • 走线:AB 相信号线等长,远离高频信号线
  • 滤波:在编码器引脚就近放置 100nF 电容
  • ESD 保护:信号线串联 100Ω 电阻 +TVS 管
  • 电源:LDO 单独供电,避免电机干扰

进阶功能扩展

基于现有框架可增加:

  1. 按键复合功能:通过定时器检测按下时长
  2. 加速度检测:根据旋转间隔时间动态调整步进值
  3. EEPROM 存储:保存最后操作位置实现断电记忆

完整工程代码已开源在 GitHub(见文末链接),包含状态图、PCB 设计文件和实测波形。开发者可根据实际需求调整消抖参数和状态转移条件,建议通过逻辑分析仪实时验证解码效果。

正文完
 0
评论(没有评论)