在现代嵌入式开发中,PWM(脉宽调制)是控制LED亮度、驱动电机和产生音频信号的常用技术之一。本篇文章将以STM32G431微控制器为例,介绍如何通过TIM1定时器生成PWM信号来调节LED亮度。STM32G431凭借其高性能和丰富外设,非常适合此类应用。
硬件需求- STM32G431开发板
- LED和电阻(220欧姆)
- USB调试器(如ST-LINK)
- 外部电源(如5V供电模块)
软件需求实现目标- 初始化TIM1定时器生成PWM信号
- 通过改变占空比控制LED亮度
代码实现以下代码展示了如何配置TIM1定时器生成PWM信号并通过简单的循环改变占空比:
#include "main.h"
// PWM占空比变量
uint32_t duty_cycle = 0;
uint8_t increment = 1;
// TIM1初始化函数
void TIM1_PWM_Init(void) {
TIM_HandleTypeDef htim1;
TIM_OC_InitTypeDef sConfigOC = {0};
__HAL_RCC_TIM1_CLK_ENABLE(); // 开启TIM1时钟
htim1.Instance = TIM1;
htim1.Init.Prescaler = 79; // 1MHz计数频率
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 1000; // PWM周期1ms(1kHz频率)
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
HAL_TIM_PWM_Init(&htim1);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; // 初始占空比0%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
// LED亮度调节函数
void Adjust_LED_Brightness(void) {
if (increment) {
duty_cycle++;
if (duty_cycle >= 1000) increment = 0; // 亮度到达最大,开始下降
} else {
duty_cycle--;
if (duty_cycle == 0) increment = 1; // 亮度到达最小,开始上升
}
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty_cycle);
}
int main(void) {
HAL_Init();
SystemClock_Config();
TIM1_PWM_Init();
while (1) {
Adjust_LED_Brightness();
HAL_Delay(1); // 每1ms调整一次亮度
}
}
代码解析- 时钟配置
TIM1计数频率通过预分频器设定为1MHz,PWM频率通过周期寄存器设定为1kHz。
- PWM信号生成
使用TIM_OCMODE_PWM1模式,初始占空比为0%。
- 动态调整占空比
通过__HAL_TIM_SET_COMPARE修改TIM1的比较值实现占空比动态调节,进而控制LED亮度。
编译与运行- 打开STM32CubeMX,配置时钟、GPIO、TIM1外设,生成项目。
- 在STM32CubeIDE中粘贴以上代码并编译。
- 使用ST-LINK调试器下载代码到STM32G431。
- 观察LED亮度随着时间缓慢变化。
小结通过本篇文章,我们详细介绍了如何使用STM32G431的TIM1生成PWM信号并控制LED亮度的实现方法。PWM是嵌入式开发中的重要技能,希望本示例能帮助你更好地理解它的应用。
|