下面是我使用STM32CubeIDE对STM32WBA55开发PWM脉冲宽度调制来控制LED灯的亮度任务。
一、硬件与工具准备
1、STM32WBA55开发板
2、LED灯
3、杜绑线
4、示波器
原理图:
输出PWM的引脚是PA6,GPIO12脚。
二、PWM原理
呼吸灯,就是指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样,因而被广泛应用于手机、 电脑等电子设备的指示灯中,冰冷的电子设备应用呼吸灯后,顿时增添了几分温暖。
呼吸灯与PWM控制原理
呼吸的特性是一种类似图 指数曲线 中的指数曲线过程,吸气是指数上升过程,呼气是指数下降过程,成年人吸气呼气整个过程持续约3秒。
三、软件准备
STM32CubeIDE
KEIL
用于编写、编译和下载代码。
四、实现步骤
这里讲解一下IDE的创建新工程:
方法一、
打开STM32CubeIDE,点击“New STM32 Project”,选择合适的芯片型号(STM32WBA55),点击“Next”。
在“Project Settings”界面中,设置工程名称和存放路径,然后点击“Finish”。
方法二、
使用STM32CubeMX进行配置,生成文件。
下面开始我的步骤:
配置时钟和引脚:
在STM32CubeMX软件中,点击“Pinout & Configuration”标签,选择用于控制LED的引脚(PA6,该引脚可复用为TIM2_CH4)。
配置时钟源和时钟树,确保定时器的时钟频率正确。
配置PWM:
在“Tim2”菜单中,选择用于生成PWM信号的定时器(TIM1)。
将定时器的“Channel4”的“Output Compare”模式设置为“PWM Mode 1”。
配置定时器的预分频器和计数器周期,以设定PWM的频率。可以将预分频器设置为15,计数器周期设置为999,则PWM频率为16Mhz/(15+1) /(1999+1) =500HZ。
或者:
时钟100Mhz,100/(99+1)=1Mhz 周期:1Mhz/(4999+1)=200Hz,占空比:2500/(4999+1)=50%
生成代码并打开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) }
六、实现效果: