[STM32F1] 使用STM32控制LED亮度——PWM应用分享

[复制链接]
 楼主| 万图 发表于 2024-9-27 07:56 | 显示全部楼层 |阅读模式
最近在做一个小项目,想通过STM32的PWM功能来控制LED的亮度变化。这个过程其实挺有趣的,我决定写一篇帖子来分享一下我实现的方式和代码。
首先,PWM(脉宽调制)是控制LED亮度的常用方法。我使用了STM32的定时器来生成PWM信号,通过调整占空比来改变LED的亮度。占空比调节,LED看起来越亮,反之越暗。
具体步骤如下:
  • 硬件准备:
    我使用了STM32F103C8T6开发板和一个普通的LED。
  • CubeMX配置:
    在CubeMX中,我选择了定时器(TIM2)PWM输出源,设置为PWM输出模式1。频率可以设置为1kHz左右作为,然后调整占空比。
  • 代码实现:
    1. #include "stm32f1xx_hal.h"

    2. TIM_HandleTypeDef htim2;

    3. void SystemClock_Config(void);
    4. static void MX_GPIO_Init(void);
    5. static void MX_TIM2_Init(void);

    6. int main(void)
    7. {
    8.   HAL_Init();
    9.   SystemClock_Config();
    10.   MX_GPIO_Init();
    11.   MX_TIM2_Init();

    12.   // 启动PWM
    13.   HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

    14.   while (1)
    15.   {
    16.     for (int i = 0; i <= 100; i++)
    17.     {
    18.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, i);
    19.       HAL_Delay(100); // 每100ms调整一次亮度
    20.     }
    21.   }
    22. }

    23. static void MX_TIM2_Init(void)
    24. {
    25.   TIM_OC_InitTypeDef sConfigOC = {0};

    26.   htim2.Instance = TIM2;
    27.   htim2.Init.Prescaler = 71;
    28.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    29.   htim2.Init.Period = 100;
    30.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    31.   HAL_TIM_PWM_Init(&htim2);

    32.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
    33.   sConfigOC.Pulse = 0;
    34.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    35.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    36.   HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
    37. }

    38. void SystemClock_Config(void) { /* 时钟配置略 */ }
    39. void MX_GPIO_Init(void) { /* GPIO配置略 */ }
    解释:

    • 我配置了TIM2的PWM模式,选择了通道1输出PWM信号。
    • 通过循环来逐渐改变占空比,LED亮度会逐渐变化,实现“呼吸灯”效果。
    总结:通过STM32的定时器和PWM功能,我成功​​控制了LED的亮度。这个代码非常简洁,可以用在很多项目中,比如调节亮度、控制电机等。如果你也是STM32的爱好者,可以尝试一下这样的方法!

公羊子丹 发表于 2024-9-27 07:57 | 显示全部楼层
哇,这个PWM控制LED发光的思路很赞!我正好正在研究STM32,准备试试看。
童雨竹 发表于 2024-9-27 07:57 | 显示全部楼层
谢谢分享,正愁找不到简单的PWM例子呢,这个太及时了!
周半梅 发表于 2024-9-27 07:58 | 显示全部楼层
我刚学STM32,这个教程很响!一会儿就照着做了。
帛灿灿 发表于 2024-9-27 07:58 | 显示全部楼层
问一下,占空比是直接决定亮度的吗?那LED不会闪吗?
Wordsworth 发表于 2024-9-27 07:59 | 显示全部楼层
哇,代码看起来真得很!这种突变的效果好有趣啊。
Pulitzer 发表于 2024-9-27 07:59 | 显示全部楼层
能再详细说说那个TIM2的配置吗?对计时器还不太了解。
Bblythe 发表于 2024-9-27 07:59 | 显示全部楼层
我刚试了下,发现LED有点闪,是我频率设置问题吗?
Uriah 发表于 2024-9-27 08:00 | 显示全部楼层
这种“呼吸灯”效果的实现方式太精准了,正好我也想学PWM。
Clyde011 发表于 2024-9-27 08:00 | 显示全部楼层
每100ms调整一次重复的循环思路好谋,简单易懂!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

152

主题

5795

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部