一、为什么做呼吸灯
上一个项目里,定时器只是用来“计时”,到点了进中断干活。学到后面发现,定时器还有一个很常用的功能:直接从引脚输出 PWM 波形,不需要 CPU 一直去翻转 IO。电机调速、舵机控制、LED 调光、蜂鸣器发声都离不开 PWM,所以我决定用最直观的呼吸灯来入门。这也是最基础(别人推荐我的入门方式)
二、项目目标
• 主控芯片:STM32F103R6 (依旧一样 以后没有改变不会特别标出来
• 开发环境:Keil uVision5
• 仿真软件:Proteus(加了一个数字示波器观察波形)
• 功能:LED 亮度从 0% 逐渐变到 100%,再逐渐变回 0%,一直循环
三、硬件连接(Proteus 仿真电路)

四、个人对PWM 是什么的理解 (不知道对不对往大佬指出纠正 谢谢🙏)
PWM(脉冲宽度调制)就是一个频率固定、高低电平时间比例可调的方波。高电平(或者说有效电平)在一个周期里占的比例叫占空比。
LED 本身只有亮和灭两种状态,但如果开关得足够快(比如每秒 1000 次),人眼看不出闪烁,只会感觉到“平均亮度”。占空比越大,LED 平均点亮的时间越长,看起来就越亮。呼吸灯就是让占空比慢慢变大、再慢慢变小。
STM32 定时器产生 PWM 靠三个东西:
• CNT:计数器,从 0 一直往上数
• ARR:自动重装载值,CNT 数到 ARR 就回到 0,决定 PWM 的周期
• CCR:比较值,CNT 和 CCR 比大小,决定输出高还是低,也就是占空比
(有些地方使用了ai来补充的 个人理解没有特别到位 功底不够扎实)
五、软件实现
自己编写的代码 (当然肯定是有人辅助带的 不是全部自己编写的)


用了大哥的模版 一些套写上去的 因为这次是有点难到我了 绿色字体有标注出来

这个公式非常重要
‼️
72MHz 经过 720 分频变成 100kHz,计数 100 次是一个周期,所以 PWM 频率是 1kHz。ARR 取 100 还有个好处:CCR 的值直接就是占空比的百分数,CCR = 30 就是 30%,很直观。
六、运行效果

注意 电阻220v 前面一直没成功就是这没有改变
七、发现的问题和改进计划
(依旧是ai的总结和发现 自己做的时候完全没有意识到)
. GPIO 引脚配置过宽:我写的是 GPIO_Pin_All ,把 PA0~PA15 全部配置成了复用推挽输出。仿真里没出问题,但在真实板子上,PA13、PA14 是 SWD 下载调试引脚,这样配置有可能导致下载器连不上。应该只配置用到的引脚: GPIO_Pin_1 。
2. 多开了 TIM3 的时钟:这个项目只用到了 TIM2, RCC_APB1Periph_TIM3 是多余的,可以去掉,养成“用什么开什么”的习惯。
3. 峰值处重复一次:第一个循环最后 i = 100 ,第二个循环开头又是 100 – 0 = 100 ,最亮的状态会停留两次;最暗处也一样。可以把第二个循环改成从 i = 1 开始,让过渡更顺滑。
(以上是ai的发现 非本人所写 请注意‼️)






