背景
之前买了一个EC11,想要拿来实现音量调节之类的功能,现在终于有时间研究了。
原理图
一开始R1、R2、R3选择的是100k,测试发现下降沿只有几百纳秒,但上升沿过于平缓,如下图,旋转较快时容易丢步。
最后选择了10k。经过修改后,最终的原理图如下。
我选用的单片机是F042,定时器的输入引脚为3.3V耐压,接5V就要冒烟了。
CubeMX配置
配置如下图。经过我的测试,只会在两个通道Polarity设置的上边沿或下边沿处产生中断,找了手册也没发现原因。所以把编码器模式设置为Encoder Mode TI1 and TI2,方便后续判断。Counter Period 随便设置一个就好,一般用不着那么大。
代码
由于需要使用中断,在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 */
}