STM32零基础(六):无定时器呼吸灯实验详解
本项目讲解所用工程均使用stm32f103C8T6芯片HAL库版本。
原理讲解
本节内容我们讲解呼吸灯实验,对此我们会简单讲解一下PWM原理,利用改变占空比的方式实现LED灯亮灭比快速转换从而实现LED灯呼吸的效果。
什么是PWM
Pulse Width Modulation(脉冲宽度调制),简称PWM,它是一种通过快速开关信号并调节脉冲宽度与周期比例(占空比)的技术,它巧妙地实现了对信号功率的平均控制,广泛应用于电机调速、灯光亮度调节、电源管理等众多领域,以其高效、精确的控制特性。
PWM的频率
PWM(脉冲宽度调制)的频率指的是每秒钟PWM信号从0到最大值再回到0的周期数,通常以 F 表示,赫兹(Hz)为单位。PWM频率决定了开关动作的速率。
PWM的周期
PWM(脉冲宽度调制)的周期指的是PWM信号从0到最大值再回到0所耗费的时间,通常以 T 表示,秒(S)为单位。
周期与频率的换算关系为 F = 1 / T
PWM的占空比(重点)
PWM(脉冲宽度调制)的占空比是指在一个PWM周期内,信号处于高电平状态的时间与整个周期时间的比例。它是PWM信号的关键参数之一,用于控制输出功率或电压的平均值。
我们根据图讲讲,可以看到周期就是一个完整的脉冲信号,而脉冲信号就是他的高电平时间,也就是t1,而占空比的计算方法就是 占空比 = 脉宽时间 / 周期 * 100% ,至于为什么是用高电平比上周期,而不是用低电平比上周期,因为通常我们更关心的是信号为高电平时设备工作的部分,这直接关系到功率的输出,再加上惯例的原因使其成为了约定俗成的规则。
举个例子来让大家理解怎么计算占空比:假设 t1为0.2秒,t2为0.8秒,那么周期 T= t1 + t2 = 1秒,占空比 = t1 / T * 100% = 20% ,所以它的占空比为20%。
如何通过改变占空比实现呼吸灯效果
在STM32中,我们可以通过软件写代码来改变占空比,也可以通过硬件定时器输出PWM波。这里我们没有讲到定时器,所以就通过软件改变占空比。随着占空比的增加,LED的亮度逐渐增强;反之,占空比减少时,LED的亮度逐渐减弱。这样,LED的亮度就呈现出平滑的渐变效果,也就是呼吸灯效果。
注意一点,我们设置的周期必须为人眼所不能观测到的时间内(通常超过100Hz),人眼就不会察觉到LED的闪烁,LED看起来是稳定发光的。
初始化配置
接下来我们利用Cubemx进行HAL库的初始化配置,建立工程的部分我们这里就直接快速完成,不了解的同学可以看我之前的新建工程部分零基础学STM32(二)-新建工程-CSDN博客
我们首先配置时钟,将时钟设置为外部高速时钟
再配置相应时钟树,将总频设置为32MHz。
我们配置输出一个LED灯,不会的同学可以看看零基础学STM32(四)-LED灯闪烁实验_stm32 103c led 程序-CSDN博客
紧接着输出工程,将必要的内容勾选和填写一下即可。注意!!!文件路径中不要出现中文
接下来打开工程
代码书写
书写呼吸灯我们需要用到微妙级延时,简单讲讲因为我们的代码,我们输入一个延时时间,然后再乘上32MHz的时间频率,因为__NOP()需要大约4个时钟周期来完成,所以除以4得到__NOP()的执行次数。__NOP()是一个空操作,它执行一个时钟周期的指令。
void HAL_delay_us(uint32_t us)
{
uint32_t Delay = us * 32/4;
do
{
__NOP();
}
while (Delay --);
}
再在主函数中书写代码
int i = 1 ;
while( i <1300 )
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_delay_us(i);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_delay_us(1300-i);
i++;
}
while( i > 1 )
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_delay_us(i);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_delay_us(1300-i);
i--;
}
解释一下代码,通过递增和递减来循环改变占空比
这样呼吸灯实验就算完成了
作者:彧佑