当前位置: 首页 > 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.wxhsa.cn/company.asp?id=3468

相关文章:

  • 题解:P12546 [UOI 2025] Convex Array
  • Java并发编程(1)
  • 玩转 hostnamectl set-hostname:Linux 主机名管理的优雅方式 - 实践
  • DES原理与举例说明
  • Spring八股文 - 实践
  • Morpheus 审计报告分享2:ChianLink 数据源有着不同的“心跳”
  • 「嘶吼」第一章:吃饭睡觉打豆豆
  • Clion 基础设置
  • 《Vuejs设计与实现》第 16 章(解析器) 上 - 教程
  • go代码(1)
  • 7种常见的入侵检测系统规避技术解析
  • js的引用
  • P3957 [NOIP 2017 普及组] 跳房子
  • C++中常用的STL容器
  • 我的数据科学探索之旅:从兴趣到公考与学习计划
  • MySQL 核心记录解析:从配置到存储的 “说明书 + 记录仪” 系统
  • JavaScript Array 对象
  • 代码规范
  • mac远程连接windows
  • 子类不依赖泛型,重写父类方法,通过强制类型转换父类方法参数出现的问题。——— 一个例子引发的思考
  • WebStorm代码一键美化
  • 3分钟搞定Vue组件库
  • Golang中设置HTTP请求代理的策略
  • [开源免费] iGTTS(Gemini TTS) 文本转语音(TTS)的命令行工具。
  • 结合Spring和MyBatis实现DAO层操作综述
  • 202205_CHIMA_follow
  • Lua脚本协助Redis分布式锁实现命令的原子性
  • 快读快写 学习笔记
  • Ubuntu 安装 CLion
  • AI编程实战