9.4 呼吸灯实验-嵌入式铁头山羊STM32笔记

实验目的

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

实验效果

红蓝 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 方波占空比的连续调节。

相关推荐
week_泽2 小时前
网安基础_1_补充_网络安全渗透测试学习笔记
笔记·学习·web安全
航Hang*2 小时前
Photoshop 图形与图像处理技术——第7章:滤镜的应用
图像处理·笔记·ui·photoshop
嵌入式@秋刀鱼2 小时前
ROS开发学习记录【一】
linux·c++·笔记·学习
菩提祖师_2 小时前
基于单片机指纹密码门禁的设计与实现
数据库·单片机·嵌入式硬件
冻伤小鱼干2 小时前
《自动驾驶与机器人中的slam技术:从理论到实践》笔记——ch7(3)
笔记·机器人·自动驾驶
白书宇2 小时前
【STM32实战】从零开始写Linux 0.12内核 第2个实验 准备开发板
linux·stm32·嵌入式硬件
三佛科技-134163842123 小时前
SM7055-18 输出18V 250mA低成本非隔离BUCK、 BUCK-BOOST方案典型应用电路(电磁炉方案)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
d111111111d3 小时前
STM32 I2C通信详解:从机地址 vs 寄存器地址
笔记·stm32·单片机·嵌入式硬件·学习·模块测试
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [fs]namei
linux·笔记·学习