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

定时器怎么玩?做个LED渐变灯练手

🕰️ 定时器怎么玩?做个LED渐变灯练手

“定时器玩得溜,嵌入式不发愁。今天不聊玄学,只带你做个会呼吸的灯。”


💡 1. 为什么学定时器要从“呼吸灯”开始?

想当年刚学嵌入式的时候,笔者天真地以为 MCU 就是控制 LED 闪一闪。

直到后来遇见了定时器、PWM、ADC、DMA……
才知道,闪灯也有风度,LED 也能“深呼吸”。

这篇文章,我们就通过一个实战项目:
👉 做一个LED渐变(呼吸灯),带你真正玩明白定时器的魅力!
在这里插入图片描述


🎯 2. 项目目标

我们要实现:

✅ LED 亮度平滑从暗→亮→暗,形成“呼吸”效果
✅ 用 定时器PWM 控制LED亮度
✅ 可以用 STM32CubeMX、HAL 或裸机寄存器都能玩


🧱 3. 项目准备

项目内容
MCU平台STM32(任意支持定时器PWM的型号)
IDESTM32CubeIDE / Keil
LED直接接GPIO的LED(或者接开发板自带的LED)
外设Timer(带PWM功能的定时器)

🧠 4. 什么是PWM?和定时器有啥关系?

PWM(Pulse Width Modulation)脉宽调制
就是用“占空比”来控制电能的平均输出量。

比如:

  • 占空比 0% → 完全灭
  • 占空比 50% → 一半亮
  • 占空比 100% → 完全亮

而实现 PWM,最常用的方式就是通过定时器!


🏗️ 5. CubeMX配置(基于STM32CubeMX)

  1. 打开 CubeMX,新建工程,选你的芯片型号

  2. 找一个 Timer,比如 TIM3,设置为 PWM Generation CH1

  3. 设置对应引脚为输出(比如 PA6)

  4. 在 “Configuration” 里配置:

    • Prescaler:让定时器跑慢点(比如 72-1)
    • Period:设置 PWM 周期,比如 1000
  5. 启用 SysTick 或 TIM6 做软定时(可选)

  6. 生成代码,保存


🧪 6. 实现呼吸灯逻辑(C代码示例)

int pwm_val = 0;
int step = 5;void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{pwm_val += step;if (pwm_val >= 1000 || pwm_val <= 0) step = -step;__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm_val);
}

配合以下启动代码:

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_TIM_Base_Start_IT(&htim6); // 用 TIM6 做定时更新回调

🧪 7. 裸机理解核心思路(不依赖HAL)

在这里插入图片描述

其实本质就三步:

  1. 设定定时器的计数频率和周期(ARR)
  2. 设定比较寄存器值(CCR)来控制 PWM 占空比
  3. 每隔一段时间修改 CCR,使其在 0~ARR 之间上下变化

🔍 8. 输出波形长啥样?

拿示波器一看:

  • 周期恒定
  • 高电平时间越来越长再越来越短
  • 控制LED的亮灭时间变化,从而实现视觉渐变

PS:肉眼看不到PWM闪烁,因为频率通常>1KHz


💡 9. 可拓展玩法

玩法技术点
多路LED呼吸灯多个通道PWM
呼吸节奏可调加ADC读取电位器控制
呼吸+颜色变换RGB三色LED + 多PWM通道
远程控制呼吸灯串口、BLE 控制 PWM 参数

🧠 10. 总结一下!

✅ 定时器是嵌入式的万能齿轮
✅ PWM是定时器的“副产品”,用得最多
✅ LED渐变只是定时器入门的起点,背后是无限可能


📌 一句话总结

“定时器 = MCU 的节拍器,节奏搞对了,一切都好跳。”


📥 点个 收藏,嵌入式之路从此呼吸顺畅~


http://www.dtcms.com/a/268304.html

相关文章:

  • 【面板数据】全球贸易救济立案案件(1995-2024年)
  • xyctf2025第三届京麒CTF
  • STM32之继电器模块
  • 11.6 ChatGPT训练第一步:深度解析SFT监督微调核心技术与实战全指南
  • C++ 基于广度优先搜索(BFS)的拓扑排序算法
  • 20250706-9-Docker快速入门(下)-Docker在线答疑_笔记
  • Linux 内存分配理论与水位机制全解
  • Mybatis--动态SQL
  • 前端防抖Debounce如何实现
  • Kafka “假死“现象深度解析与解决方案
  • JavaScript 中导入模块时,确实不需要显式地写 node_modules 路径。
  • week2
  • 基于 Rust 的前端工具基本实现
  • 【它加上100是一个完全平方数,再加上168又是一个完全平方数】2022-7-17
  • 第十六节:第三部分:多线程:线程安全问题、取钱问题的模拟
  • 浅谈漏洞扫描与工具
  • 计算机网络实验——互联网安全实验
  • 10046 解决 Oracle error
  • NLP文本预处理
  • Chunking-free RAG
  • 拼好题(各个平台的零散题目)
  • vue什么时候可以用index作为:key的索引
  • Vue计算属性(computed)全面解析:原理、用法与最佳实践
  • Python库 python-pyper 的详细使用(优秀的并发数据处理框架)
  • 第一次ctf比赛的赛后复现记录
  • ​保持矩阵秩不变的乘法
  • SoloSpeech:从混合音频中提取目标语音
  • 下载安装 com0com
  • Android16之解决报错:ckati: no such file or directory(二百四十九)
  • ros-noetic搭建turtlebot3测试