打印
[STM32F1]

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

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

    TIM_HandleTypeDef htim2;

    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_TIM2_Init(void);

    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      MX_GPIO_Init();
      MX_TIM2_Init();

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

      while (1)
      {
        for (int i = 0; i <= 100; i++)
        {
          __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, i);
          HAL_Delay(100); // 每100ms调整一次亮度
        }
      }
    }

    static void MX_TIM2_Init(void)
    {
      TIM_OC_InitTypeDef sConfigOC = {0};

      htim2.Instance = TIM2;
      htim2.Init.Prescaler = 71;
      htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim2.Init.Period = 100;
      htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      HAL_TIM_PWM_Init(&htim2);

      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 0;
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
      sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
      HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
    }

    void SystemClock_Config(void) { /* 时钟配置略 */ }
    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,这个教程很响!一会儿就照着做了。

使用特权

评论回复
5
帛灿灿| | 2024-9-27 07:58 | 只看该作者
问一下,占空比是直接决定亮度的吗?那LED不会闪吗?

使用特权

评论回复
6
Wordsworth| | 2024-9-27 07:59 | 只看该作者
哇,代码看起来真得很!这种突变的效果好有趣啊。

使用特权

评论回复
7
Pulitzer| | 2024-9-27 07:59 | 只看该作者
能再详细说说那个TIM2的配置吗?对计时器还不太了解。

使用特权

评论回复
8
Bblythe| | 2024-9-27 07:59 | 只看该作者
我刚试了下,发现LED有点闪,是我频率设置问题吗?

使用特权

评论回复
9
Uriah| | 2024-9-27 08:00 | 只看该作者
这种“呼吸灯”效果的实现方式太精准了,正好我也想学PWM。

使用特权

评论回复
10
Clyde011| | 2024-9-27 08:00 | 只看该作者
每100ms调整一次重复的循环思路好谋,简单易懂!

使用特权

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

本版积分规则

40

主题

3727

帖子

0

粉丝