当前位置: 首页 > news >正文

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 */
}
http://www.zskr.cn/news/4333.html

相关文章:

  • Java并发编程(1)
  • 「嘶吼」第一章:吃饭睡觉打豆豆
  • go代码(1)
  • 7种常见的入侵检测系统规避技术解析
  • MySQL 核心记录解析:从配置到存储的 “说明书 + 记录仪” 系统
  • 结合Spring和MyBatis实现DAO层操作综述
  • 202205_CHIMA_follow
  • Ubuntu 安装 CLion
  • 面向对象编程(OOP)的原则
  • 25/9/12(补,上一篇是9/11的)
  • 实用指南:操作系统类型全解析:从批处理到嵌入式
  • 111111111
  • 深入解析:“纳米总管”——Arduino Nano 的趣味生活
  • 洛谷题目难度系统优化
  • 202112_摆烂杯_WhatAHack!
  • 3 线性模型
  • windows系统缺失DLL库文件下载方法
  • Qt/C++开发监控GB28181系统/公网对讲/代码实现28181语音对讲/采集本地麦克风数据/支持udp和tcp模式
  • P3195 [HNOI2008] 玩具装箱 (斜率优化)
  • sh-2025模拟赛
  • Java 注解机制全解析:原理、用途与框架中的实战
  • 暑假
  • 6G 驱动的智慧城市新格局
  • Java 在移动开发与跨平台应用中的应用
  • PySimpleGUI安装4.60.5老版本安装教程!
  • PySimpleGUI-免注册版本
  • PySimpleGUI 开始注册了,怎样能免注册使用早期版本?
  • 阅读 |《虚空》观后感以及一些想法——万物简史
  • Python进阶必看:深入解析yield的强大功能
  • DearPyGui-最强大的一款Python GUI工具