stm32使用pwm控制led灯亮度
时间: 2025-05-17 13:17:06 浏览: 66
### STM32通过PWM控制LED灯亮度
STM32微控制器可以通过其内置的定时器模块生成脉宽调制(PWM)信号来实现对LED灯亮度的调节。以下是关于如何配置和使用STM32 PWM功能的具体方法:
#### 配置GPIO引脚
首先,需要将用于输出PWM信号的GPIO引脚设置为复用模式。这通常涉及初始化相应的端口并将其分配给特定的定时器通道。
```c
// 初始化 GPIO 引脚作为 TIMx 的 CHy 输出
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0; // 假设 PA0 连接到 LED
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // 将 PA0 映射到 TIM2_CH1
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
上述代码片段展示了如何启用一个GPIO引脚以便它能被指定的TIM外设所利用[^2]。
#### 定时器初始化与PWM模式设定
接着,需初始化定时器以产生周期性的计数事件,并定义比较寄存器中的占空比值从而决定PWM波形的实际宽度。
```c
// 设置定时器参数
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = (SystemCoreClock / 1000000) - 1; // 设定预分频系数使得频率接近1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 自由运行至最大计数值(即分辨率)
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if(HAL_TIM_PWM_Init(&htim2)!= HAL_OK){
Error_Handler(); // 错误处理函数
}
// 配置具体通道
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 初始占空比50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim2,&sConfigOC,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); // 开始PWM输出
```
此部分说明了怎样建立基本的时间基础以及调整PWM输出电平的方法[^3]。
#### 动态改变LED亮度
为了动态更改LED的亮度水平,在程序执行期间可以随时更新比较寄存器内的数值,进而影响最终呈现出来的视觉效果。
```c
void SetLedBrightness(uint8_t brightnessPercent){
uint16_t pulseValue = ((uint16_t)brightnessPercent * htim2.Init.Period)/100;
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,pulseValue);
}
```
该函数接受百分比形式输入的新亮度级别,并相应地修改关联的PWM信号特性[^4]。
---
###
阅读全文
相关推荐


















