实验目的
通过呼吸灯实验,看下输出比较在实际编程过程中是如何写代码的
实验效果

红蓝 LED,连接定时器通道 1(正常输出和互补输出)
通过调节 PWM 占空比,实现呼吸灯效果
目录

1.呼吸灯原理
https://www.bilibili.com/video/BV11X4y1j7si?t=75.7&p=43

Q: 如何实现呼吸灯?
A:LED 亮度连续变化,连续变化类似正弦波。
y=sin(2 πt),y 值域:(-1,1)
y=sin(2 πt)+1,y 值域:(0,2)
y=0.5 * sin(2 πt)+1,y 值域:(0,1)
可得在 0-1 上变化的正弦波。
但是 MCU 只能输出两种电压:0 和 3.3V。所以需要通过 PWM 的占空比,模拟正弦波(连续模拟信号用数字信号表示)
2.初始化IO引脚
https://www.bilibili.com/video/BV11X4y1j7si?t=254.2&p=43

上图为定时器 1 内部框图。有四个通道,我们选择通道 1,红色 LED 接 CH1,蓝色 LED 接 CH1N(互补输出)。
所以要找到 CH1 和 CH1N,初始化这两个引脚

上图为 TIM1 复用功能重映像表
ETR:外部参考信号
BKIN:刹车信号
其余为通道信号
CH1:PA8,CH1N:PB13
1k 电阻作用:限流

上图为实际电路连接图
如何初始化 CH1 和 CH1N?

从图可得,CHx 输出比较配置为推挽复用输出,AFPP
CHxN,也是 AFPP
还要配置最大输出速度:PWM 的 1ms 周期的频率为 1KHZ,引脚速度选择 2MHZ(2000K)即可。

上图为初始化 PA8 引脚具体代码,推挽复用输出

上图为初始化 PB13引脚具体代码,推挽复用输出
3.配置时基单元
https://www.bilibili.com/video/BV11X4y1j7si?t=816.1&p=43

CNT<CCR,输出比较高电平
CNT>CCR,输出比较低电平
要求 PSC 分辨率 1us,周期 1ms

TIM1:APB2,PCLK2 (72MHZ)获取时钟,1 倍频
1us=1MHZ,
所以 PSC=71(72MHZ/(71 + 1)= 1MHZ)
ARR=999(周期 1ms)
RCR=0

上图为具体操作:
1、开启时钟:TIM1
2、配置时基单元参数:CNT 上计数;RCC 配 999,PSC 配 71,RCR 配 0
3、配置 ARR 预加载:从图可得,PSC 和 RCR 的影子寄存器是深色,默认自动开启,ARR 影子寄存器是浅色,默认关闭,需要我们手动开启
4、闭合总开关

上图为配置时基单元具体代码实现
4.配置输出比较的参数
https://www.bilibili.com/video/BV11X4y1j7si?t=1370.4&p=43

上图输出比较电路从左往右:
CCRx 寄存器:默认 0,按照 0.5(sin(2πt)+1)*1000 变化
模式选择:PWM1,CNT<CCR,OCxRef 输出高电压
极性选择:为正常输出和互补输出选择极性(正极性)
闭合输出开关(使能正常输出和互补输出)
MOE:主输出使能,使能主输出,使能后定时器的所有通道的信号才能被使用

从图可得,初始化可以分为三步:配置参数,闭合 MOE 主开关,CCR 打开预加载
OC:output compare

上图为初始化输出比较通道 1 的参数。
OCMode:输出比较模式(八种选 1)
OCNPolarity:互补通道极性(正负)
OCPolarity:正常输出的极性(正负)
OUTputNState:互补输出开关(注意是 MOE 前面的开关)
OUTputState:正常输出开关
Pulse:CCR 寄存器的初值

上图为闭合 MOE 总开关代码,调用 API 打开一下就行

开启 CCR 预加载
5.改变PWM占空比
https://www.bilibili.com/video/BV11X4y1j7si?t=1818.7&p=43

动态改变 PWM 占空比,就是动态改变 CCR 的值。
CCR 有预加载,阴影也是灰色,默认是关闭,所以要使能一下打开。

CCR 要按照 0.5(sin(2πt)+1)*1000 变化,所以要获取单片机的时间。
Q:为什么要乘以 1000?
A:因为 ARR 值为 999,CNT 最高可加到 999,。CCR 要和 CNT 比较,0.5(sin(2πt)+1)的范围是(0,1),所以乘以 1000,让 CCR 的取值范围达到(0,1000),可以和 CNT 比较
GetTick,把 ms 转成 s

上图为具体代码:获取单片机时间 t 后,计算 CCR 的值

Q: 如何把算出来的 ccr 值,设置到 CCR 寄存器里边?
A:使用上图中的编程接口,TIM_SetCompare1

上图为把 ccr 设置到 CCR 寄存器的具体代码
总结
通过 PWM 呼吸灯实现,复习了下输出比较的原理。
实现 PWM 呼吸灯核心逻辑: CCR 在 0~999(对应 0~1000)变化→占空比 0%~100% 连续调节→LED 高电平时间占比变化→平均电流 / 平均电压在 0~3.3V 之间平滑变化→人眼视觉暂留感知为亮度平滑变化→实现呼吸灯效果;
Q:为什么 CCR 值可以调节 PWM 方波的占空比?
A:CCR(捕获 / 比较寄存器)通过与定时器 CNT(计数器寄存器)实时比较实现占空比调节;本应用中定时器计数分辨率为 1μs,计数周期为 1ms(0~999 共 1000 个计数单位),CCR 在 0~999 区间内设定特定数值时,会以 1μs 为精度划分高低电平区间:当 CNT<CCR 时输出高电平,当 CNT>CCR 时输出低电平。通过修改 CCR 的数值,可精准改变 1ms 周期内高 / 低电平的持续时长,从而实现 PWM 方波占空比的连续调节。