STM32 HAL学习笔记:EC11的使用和定时器中编码器模式的中断

背景

之前买了一个EC11,想要拿来实现音量调节之类的功能,现在终于有时间研究了。

原理图

一开始R1、R2、R3选择的是100k,测试发现下降沿只有几百纳秒,但上升沿过于平缓,如下图,旋转较快时容易丢步。

DS2_20250914103356

最后选择了10k。经过修改后,最终的原理图如下。

Snipaste_2025-09-14_10-38-39

我选用的单片机是F042,定时器的输入引脚为3.3V耐压,接5V就要冒烟了。

CubeMX配置

配置如下图。经过我的测试,只会在两个通道Polarity设置的上边沿或下边沿处产生中断,找了手册也没发现原因。所以把编码器模式设置为Encoder Mode TI1 and TI2,方便后续判断。Counter Period 随便设置一个就好,一般用不着那么大。

Snipaste_2025-09-14_11-17-22

代码

由于需要使用中断,在main.c启动定时器时需要使用HAL_TIM_Encoder_Start_IT,两个通道都要启动:

HAL_TIM_Encoder_Start_IT(&htim2, TIM_CHANNEL_ALL);

中断函数位于文件stm32f0xx_it.c中。函数读取unsigned long int类型的计数值,并判断模4是否为0。如果不为0,说明编码器旋转到中间位置,不需要更新音量。

unsigned long int cnt = 0;

void TIM2_IRQHandler(void)
{
    /* USER CODE BEGIN TIM2_IRQn 0 */
    /* USER CODE END TIM2_IRQn 0 */
    HAL_TIM_IRQHandler(&htim2);
    /* USER CODE BEGIN TIM2_IRQn 1 */
    cnt = __HAL_TIM_GET_COUNTER(&htim2);
    my_printf("_CNT=%lu\r\n", cnt);
    if (cnt % 4 == 0)
    {
        update_volume(cnt / 4);
    }
    /* USER CODE END TIM2_IRQn 1 */
}
posted @ 2025-09-14 11:32  GongYeSUDA  阅读(138)  评论(0)    收藏  举报