文章代码使用 HAL 库。
文章目录
- 一、1.PWM原理
- 二、LED 原理图
- 三、使用cubemx 配置 led
- 四、PWM 相关函数
- 五、PWM占空比占空比计算
- 六、PWM 呼吸灯重要代码
- 总结
呼吸灯
一、1.PWM原理
PWM全称为脉冲宽度调制(Pulse Width Modulation),是一种常用的调制技术。它通过改变信号脉冲的宽度来控制电路或装置的输出功率或电压。
在PWM中,周期性的方波信号被产生,其中脉冲的宽度是可变的,而脉冲的频率是固定的。通常,PWM信号的周期称为周期时间,而脉冲的占空比则是脉冲宽度与周期时间之间的比值。
PWM信号可用于控制电机速度、调节LED的亮度、产生模拟信号等各种应用。通过改变PWM信号的占空比,可以在时间上控制输出信号的强度或控制设备的工作时间比。
周期:PWM周期(Pulse Width Modulation period)指的是PWM信号一个完整的周期的时间长度。在PWM信号中,周期是指一个完整的脉冲周期,包括脉冲的高电平和低电平部分。
计算公式:(定时器预分频系数 + 1) * (重装载值 + 1) / 时钟主频
占空比:
占空比通常用百分比或比例表示,可以取值在 0% 到 100% 之间,或是 0 到 1 之间。占空比为 0% 表示PWM 信号全为低电平,占空比为 100% 表示 PWM 信号全为高电平。一般而言,占空比决定了 PWM信号中高电平的时间长度,从而控制到达被驱动装置的电源的平均电压水平。
对于直流电机或LED等装置,常用 PWM 控制来调节速度或亮度。例如,在 50% 的占空比下,PWM 信号在一个周期内将有一半的时间为高电平,一半的时间为低电平,这将导致电机转速或灯光亮度的降低。ARR(自动重载寄存器)增加占空比将增加高电平时间,减小占空比则减小高电平时间。
例子:在输出电压为10V的电路中,设置PWM占空比为40%,那么起始这个电路输出的实际电压是4V。
通常控制LED时只需要给一个高电平就可以控制那么下面是LED电平状态图使用PWM控制LED调节亮度的电平状态图.
二、LED 原理图
可以看到有4个led。 其中 LED2 接到了PB2引脚, LED3 接到了PB1引脚, LED4 接到了PB0引脚,所以我们需要配置对应 led 的 gpio 引脚为输出引脚。
三、使用cubemx 配置 led
四、PWM 相关函数
启动定时器PWM模式
HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
参数:
-
TIM_HandleTypeDef *htim`:指向 TIM_HandleTypeDef 结构体的指针,该结构体包含了定时器的配置和状态信息。
-
uint32_t Channel`:指定要启动 PWM 的通道。对于 STM32 定时器而言,可以有多个通道,每个通道可以独立地生成 PWM 信号。
设置 占空比
__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__);
参数:
-
HANDLE:是一个宏或变量,用于表示特定定时器的句柄。
-
CHANNEL:这是指定要操作的定时器通道。
-
COMPARE:这是要设置的比较值,用于比较寄存器的内容。
// 也可以使用 CCRx 比较寄存器设置 占空比。
TIM3->CCR3 = 200;
// 也可以通过htim3.Instance->CCRx直接修改CCR的值
htim3.Instance->CCR3 = 200;
五、PWM占空比占空比计算
CCR(捕获/比较寄存器)/ ARR(自动重载寄存器) 100%*
如果 ARR(自动重载值) = 500时,当 CCR(比较寄存器值) = 100 则 占空比是 20%
六、PWM 呼吸灯重要代码
int pwm_value = 0; // 占空比
// 开启 pwm 输出
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
for(uint16_t i=1;i<500;i++) // 通过循环逐渐改变CCR,进而改变占空比。
{
htim3.Instance->CCR3 = i;
HAL_Delay(1);
}
for(uint16_t i=499;i>=1;i--)
{
htim3.Instance->CCR3 = i; // 通过htim3.Instance->CCRx直接修改CCR的值
HAL_Delay(1);
}
总结
下篇文章为大家介绍 无源蜂鸣器唱歌。