在现代嵌入式开发中,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是嵌入式开发中的重要技能,希望本示例能帮助你更好地理解它的应用。
|