stm32pwm控制led灯闪烁频率
时间: 2025-04-17 12:37:36 浏览: 77
### STM32 PWM 控制 LED 灯闪烁频率
PWM(脉宽调制)技术可以通过调节占空比来控制LED的亮度,也可以通过改变PWM信号的频率来影响LED灯的闪烁频率。对于STM32来说,利用其内置的定时器模块可以方便地生成PWM波形。
#### 初始化定时器用于PWM输出
为了设置PWM输出,在STM32上通常会先配置一个定时器通道作为PWM源。下面是一个简单的例子,展示如何初始化TIM2定时器以产生PWM输出:
```c
#include "stm32f1xx_hal.h"
// 定义使用的GPIO端口和引脚
#define LED_PIN GPIO_PIN_0
#define LED_GPIO_PORT GPIOD
void MX_TIM2_Init(void)
{
TIM_HandleTypeDef htim2;
__HAL_RCC_TIM2_CLK_ENABLE();
htim2.Instance = TIM2;
htim2.Init.Prescaler = 83; // 设置预分频值, 基于72MHz APB1时钟
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 自动重装载值决定周期长度 (即频率)
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim2);
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 初始占空比设定为50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
}
```
这段代码设置了定时器的工作参数,并指定了要用来输出PWM波形的具体通道[^4]。
#### 调整PWM频率
如果想要修改LED的闪烁速度,则需更改`Period`属性以及相应的`Prescaler`值。这二者共同决定了PWM波的实际频率。例如,若希望降低闪烁速率,可增加自动重载寄存器(`ARR`)内的数值;反之则减少该值即可加快闪烁速度。
#### 修改占空比实现不同亮度变化
除了调整频率外,还可以动态改变PWM波的占空比来模拟不同的视觉效果,比如使灯光逐渐变亮再慢慢熄灭形成所谓的“呼吸灯”。这里给出一段简单函数用于更新指定通道上的PWM占空比:
```c
void SetPWMDutyCycle(TIM_HandleTypeDef *htim, uint32_t channel, float duty_cycle){
int pulse_width = (int)(duty_cycle / 100.0 * htim->Init.Period);
__HAL_TIM_SET_COMPARE(htim, channel, pulse_width);
}
// 使用示例:将TIM2 CH1 的占空比设为75%
SetPWMDutyCycle(&htim2, TIM_CHANNEL_1, 75);
```
此部分逻辑允许程序运行期间灵活调整PWM输出特性,从而达到预期的效果[^2]。
#### 实现LED闪烁功能
为了让LED按照一定规律快速开闭造成闪烁现象,可以在主循环里不断切换PWM的开启状态或直接操控GPIO引脚完成同样的目的。当采用PWM方式进行这种操作时,只需定期变更占空比至极低水平甚至零,之后恢复正常工作范围就能看到明显的明暗交替状况了。
阅读全文
相关推荐


















