定时器怎么玩?做个LED渐变灯练手
🕰️ 定时器怎么玩?做个LED渐变灯练手
“定时器玩得溜,嵌入式不发愁。今天不聊玄学,只带你做个会呼吸的灯。”
💡 1. 为什么学定时器要从“呼吸灯”开始?
想当年刚学嵌入式的时候,笔者天真地以为 MCU 就是控制 LED 闪一闪。
直到后来遇见了定时器、PWM、ADC、DMA……
才知道,闪灯也有风度,LED 也能“深呼吸”。
这篇文章,我们就通过一个实战项目:
👉 做一个LED渐变(呼吸灯),带你真正玩明白定时器的魅力!
🎯 2. 项目目标
我们要实现:
✅ LED 亮度平滑从暗→亮→暗,形成“呼吸”效果
✅ 用 定时器PWM 控制LED亮度
✅ 可以用 STM32CubeMX、HAL 或裸机寄存器都能玩
🧱 3. 项目准备
项目 | 内容 |
---|---|
MCU平台 | STM32(任意支持定时器PWM的型号) |
IDE | STM32CubeIDE / Keil |
LED | 直接接GPIO的LED(或者接开发板自带的LED) |
外设 | Timer(带PWM功能的定时器) |
🧠 4. 什么是PWM?和定时器有啥关系?
PWM(Pulse Width Modulation)脉宽调制
就是用“占空比”来控制电能的平均输出量。
比如:
- 占空比 0% → 完全灭
- 占空比 50% → 一半亮
- 占空比 100% → 完全亮
而实现 PWM,最常用的方式就是通过定时器!
🏗️ 5. CubeMX配置(基于STM32CubeMX)
-
打开 CubeMX,新建工程,选你的芯片型号
-
找一个 Timer,比如 TIM3,设置为 PWM Generation CH1
-
设置对应引脚为输出(比如 PA6)
-
在 “Configuration” 里配置:
- Prescaler:让定时器跑慢点(比如 72-1)
- Period:设置 PWM 周期,比如 1000
-
启用 SysTick 或 TIM6 做软定时(可选)
-
生成代码,保存
🧪 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)
其实本质就三步:
- 设定定时器的计数频率和周期(ARR)
- 设定比较寄存器值(CCR)来控制 PWM 占空比
- 每隔一段时间修改 CCR,使其在 0~ARR 之间上下变化
🔍 8. 输出波形长啥样?
拿示波器一看:
- 周期恒定
- 高电平时间越来越长再越来越短
- 控制LED的亮灭时间变化,从而实现视觉渐变
PS:肉眼看不到PWM闪烁,因为频率通常>1KHz
💡 9. 可拓展玩法
玩法 | 技术点 |
---|---|
多路LED呼吸灯 | 多个通道PWM |
呼吸节奏可调 | 加ADC读取电位器控制 |
呼吸+颜色变换 | RGB三色LED + 多PWM通道 |
远程控制呼吸灯 | 串口、BLE 控制 PWM 参数 |
🧠 10. 总结一下!
✅ 定时器是嵌入式的万能齿轮
✅ PWM是定时器的“副产品”,用得最多
✅ LED渐变只是定时器入门的起点,背后是无限可能
📌 一句话总结
“定时器 = MCU 的节拍器,节奏搞对了,一切都好跳。”
📥 点个 收藏,嵌入式之路从此呼吸顺畅~