打印
[STM32G4]

STM32G431:基于PWM的LED亮度控制

[复制链接]
694|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Bblythe|  楼主 | 2024-12-9 07:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在现代嵌入式开发中,PWM(脉宽调制)是控制LED亮度、驱动电机和产生音频信号的常用技术之一。本篇文章将以STM32G431微控制器为例,介绍如何通过TIM1定时器生成PWM信号来调节LED亮度。STM32G431凭借其高性能和丰富外设,非常适合此类应用。
硬件需求
  • STM32G431开发板
  • LED和电阻(220欧姆)
  • USB调试器(如ST-LINK)
  • 外部电源(如5V供电模块)
软件需求
  • STM32CubeIDE
  • STM32CubeMX
实现目标
  • 初始化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是嵌入式开发中的重要技能,希望本示例能帮助你更好地理解它的应用。

使用特权

评论回复
沙发
公羊子丹| | 2024-12-9 07:43 | 只看该作者
这个例子真的很实用,学到了控制LED的技巧!

使用特权

评论回复
板凳
周半梅| | 2024-12-9 07:44 | 只看该作者
看完感觉对PWM信号有了全新的理解,感谢分享!

使用特权

评论回复
地板
帛灿灿| | 2024-12-9 07:44 | 只看该作者
请问如果用TIM2代替TIM1,这部分代码需要怎么改?

使用特权

评论回复
5
童雨竹| | 2024-12-9 07:44 | 只看该作者
代码逻辑清晰,适合初学者实践,给个赞!

使用特权

评论回复
6
万图| | 2024-12-9 07:44 | 只看该作者
在硬件上有没有遇到电阻值选择的问题?

使用特权

评论回复
7
Wordsworth| | 2024-12-9 07:45 | 只看该作者
这个亮度调节的效果很平滑,我也打算试试!

使用特权

评论回复
8
Pulitzer| | 2024-12-9 07:45 | 只看该作者
STM32CubeIDE配置部分可以再详细点就更好了。

使用特权

评论回复
9
Uriah| | 2024-12-9 07:45 | 只看该作者
这个程序运行后电流会不会有波动影响其他器件?

使用特权

评论回复
10
Clyde011| | 2024-12-9 07:45 | 只看该作者
最近也在学STM32,终于找到这么清楚的PWM例子了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

3736

帖子

0

粉丝