stm32三色灯亮度变化
时间: 2025-01-05 07:34:18 浏览: 15
### STM32 控制 RGB LED 亮度渐变
为了实现STM32控制RGB LED的亮度渐变效果,主要依赖于PWM(脉宽调制)技术。通过调整不同颜色通道上的占空比,可以改变LED的颜色和亮度。
#### 初始化定时器并配置PWM模式
首先,在程序启动阶段需完成定时器初始化以及PWM模式配置工作[^2]:
```c
void TIM_PWM_Init(void)
{
__HAL_RCC_TIM1_CLK_ENABLE();
TIM_HandleTypeDef htim;
htim.Instance = TIM1;
// 定时器基本参数设定
htim.Init.Prescaler = (SystemCoreClock / 20000) - 1; // 设置预分频值
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 999; // 自动重装载值
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim);
// PWM通道配置
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
}
```
此部分代码完成了TIM1定时器的基础设置,并将其作为PWM波形发生源。接下来针对红绿蓝三个引脚分别创建对应的PWM输出实例。
#### 实现颜色渐变逻辑
定义一个函数`ColorFade()`用于执行从一种颜色平滑过渡至另一种颜色的过程。该过程涉及逐步修改各颜色组件的比例直至达到目标状态。
```c
#define MAX_BRIGHTNESS 1000
// 渐变函数
void ColorFade(uint16_t redStart, uint16_t greenStart, uint16_t blueStart,
uint16_t redEnd, uint16_t greenEnd, uint16_t blueEnd,
int steps)
{
float rStep = ((float)(redEnd - redStart)) / steps;
float gStep = ((float)(greenEnd - greenStart)) / steps;
float bStep = ((float)(blueEnd - blueStart)) / steps;
for(int i=0;i<=steps;i++)
{
SetPWMDutyCycle(redStart + (int)(rStep * i), GPIO_PIN_RED);
SetPWMDutyCycle(greenStart + (int)(gStep * i), GPIO_PIN_GREEN);
SetPWMDutyCycle(blueStart + (int)(bStep * i), GPIO_PIN_BLUE);
HAL_Delay(5); // 延迟一段时间让肉眼可见变化
}
}
// 设定指定GPIO引脚下的PWM占空比
void SetPWMDutyCycle(uint16_t value, uint16_t pin)
{
if(value > MAX_BRIGHTNESS)value = MAX_BRIGHTNESS;
__HAL_TIM_SET_COMPARE(htim_pwm_handle, GetChannelByPin(pin), value);
}
```
以上代码片段展示了如何利用循环结构配合延时操作达成视觉上连续变换的效果。每次迭代都会更新当前显示的颜色组合,直到最终匹配预期终点为止。
阅读全文