最近在做一个小项目,想通过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的爱好者,可以尝试一下这样的方法!
|