这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32WBA55PWM控制LED灯亮度任务1

共2条 1/1 1 跳转至

STM32WBA55PWM控制LED灯亮度任务1

工程师
2025-01-09 20:03:35     打赏

下面是我使用STM32CubeIDE对STM32WBA55开发PWM脉冲宽度调制来控制LED灯的亮度任务。


一、硬件与工具准备

1、STM32WBA55开发板

2、LED灯

3、杜绑线

4、示波器

原理图:

image.png

输出PWM的引脚是PA6,GPIO12脚。

image.png

二、PWM原理


呼吸灯,就是指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样,因而被广泛应用于手机、 电脑等电子设备的指示灯中,冰冷的电子设备应用呼吸灯后,顿时增添了几分温暖。

呼吸灯与PWM控制原理

呼吸的特性是一种类似图 指数曲线 中的指数曲线过程,吸气是指数上升过程,呼气是指数下降过程,成年人吸气呼气整个过程持续约3秒。

指数曲线

image.png


三、软件准备

STM32CubeIDE

KEIL

用于编写、编译和下载代码。


四、实现步骤

这里讲解一下IDE的创建新工程:

方法一、

打开STM32CubeIDE,点击“New STM32 Project”,选择合适的芯片型号(STM32WBA55),点击“Next”。

在“Project Settings”界面中,设置工程名称和存放路径,然后点击“Finish”。

方法二、

使用STM32CubeMX进行配置,生成文件。

1736422863596.jpg

下面开始我的步骤:

配置时钟和引脚:

在STM32CubeMX软件中,点击“Pinout & Configuration”标签,选择用于控制LED的引脚(PA6,该引脚可复用为TIM2_CH4)。

配置时钟源和时钟树,确保定时器的时钟频率正确。

image.png


配置PWM:

在“Tim2”菜单中,选择用于生成PWM信号的定时器(TIM1)。

将定时器的“Channel4”的“Output Compare”模式设置为“PWM Mode 1”。

1736422882109.jpg

配置定时器的预分频器和计数器周期,以设定PWM的频率。可以将预分频器设置为15,计数器周期设置为999,则PWM频率为16Mhz/(15+1) /(1999+1) =500HZ

或者:

时钟100Mhz,100/(99+1)=1Mhz 周期:1Mhz/(4999+1)=200Hz,占空比:2500/(4999+1)=50%

1736422929123.jpg

生成代码并打开IDE:

在STM32CubeMX中完成配置后,点击“Project”->“Generate Code”,生成代码并打开STM32CubeIDE。


五、实现代码

// 启动TIM2定时器的PWM输出在TIM_CHANNEL_4通道上
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);

// 主循环
while (1)
{
    /* USER CODE END WHILE */
    MX_APPE_Process(); // 这个函数可能是用户定义的,用于处理应用程序事件

    // 变量dt用于在循环中改变PWM的占空比
    for(dt=1;dt < 499; dt++) // 从1到499逐渐增加占空比
    {
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, dt); // 设置TIM2的TIM_CHANNEL_4通道的PWM占空比
       // HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); // 不需要在循环中重复启动PWM输出,只需启动一次
        delay_ms(1); // 延时1毫秒,改变占空比的速度
    }
    for(dt=499;dt > 0; dt--) // 从499到1逐渐减少占空比
    {
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, dt); // 设置TIM2的TIM_CHANNEL_4通道的PWM占空比
       // HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); // 同样,不需要在循环中重复启动PWM输出
        delay_ms(1); // 延时1毫秒
    }
}

// TIM2初始化函数
static void MX_TIM2_Init(void)
{
    /* USER CODE BEGIN TIM2_Init 0 */
    /* USER CODE END TIM2_Init 0 */

    TIM_MasterConfigTypeDef sMasterConfig = {0}; // 定时器主模式配置结构体
    TIM_OC_InitTypeDef sConfigOC = {0}; // 输出比较配置结构体

    /* USER CODE BEGIN TIM2_Init 1 */
    /* USER CODE END TIM2_Init 1 */
    htim2.Instance = TIM2; // 指定定时器实例为TIM2
    htim2.Init.Prescaler = 16-1; // 预分频器设置为16,定时器时钟频率除以16
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数器模式设置为向上计数
    htim2.Init.Period = 999; // 自动重装载值,决定了PWM的频率
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频设置为不分频
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 禁止自动重装载寄存器的预装载
    if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) // 初始化TIM2的PWM功能
    {
        Error_Handler(); // 如果初始化失败,调用错误处理函数
    }
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; // 设置主输出触发为复位状态
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; // 禁用主从模式
    if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) // 配置定时器的同步
    {
        Error_Handler(); // 如果配置失败,调用错误处理函数
    }
    sConfigOC.OCMode = TIM_OCMODE_PWM1; // 设置输出比较模式为PWM模式1
    sConfigOC.Pulse = 500; // 设置初始占空比为50%(假设Period为999,则500表示50%的占空比)
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 设置输出比较极性为高
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 禁用快速模式
    if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) // 配置TIM2的PWM通道
    {
        Error_Handler(); // 如果配置失败,调用错误处理函数
    }
    /* USER CODE BEGIN TIM2_Init 2 */
    /* USER CODE END TIM2_Init 2 */
    HAL_TIM_MspPostInit(&htim2); // 调用MspPostInit函数,通常用于硬件抽象层的初始化(如GPIO)
}


六、实现效果:



专家
2025-01-09 20:19:12     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]