蓝桥杯PWM信号控制呼吸流水灯
时间: 2025-02-07 07:54:57 浏览: 58
### 蓝桥杯 PWM 控制呼吸效果流水灯
为了实现带有呼吸效果的流水灯,通常会利用PWM(脉宽调制)来调整LED的亮度。通过改变占空比,可以使灯光逐渐变亮再慢慢熄灭,形成类似于呼吸的效果。
#### 实现原理
在单片机编程中,可以通过设置定时器中断,在特定的时间间隔内修改PWM波形的占空比从而达到渐明渐暗的目的。具体来说就是在一个周期性的循环里逐步增加或减少输出电压的有效值[^3]。
#### 示例代码
下面给出一段基于STM32平台下的简单示例代码用于展示如何创建具有呼吸效应的流水灯:
```c
#include "stm32f1xx_hal.h"
#define LED_PIN GPIO_PIN_0
#define LED_PORT GPIOD
// 定义全局变量保存当前亮度级别
uint8_t brightness_level = 0;
int direction = 1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/**
* @brief 主函数入口
*/
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1) {
// 更新亮度水平并反转方向当到达最大/最小值时
if ((brightness_level >= 100 && direction == 1) ||
(brightness_level <= 0 && direction == -1)) {
direction *= -1;
}
brightness_level += direction;
// 设置新的占空比
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, brightness_level);
// 延迟一段时间以便观察变化过程
HAL_Delay(10);
}
}
/* 配置TIM4作为PWM发生器 */
void MX_TIM_PWM_Init(TIM_HandleTypeDef* htim_pwm)
{
/* 初始化配置结构体 */
TIM_OC_InitTypeDef sConfigOC;
htim_pwm->Instance = TIM4;
htim_pwm->Init.Prescaler = 7999;
htim_pwm->Init.CounterMode = TIM_COUNTERMODE_UP;
htim_pwm->Init.Period = 999;
htim_pwm->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim_pwm->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(htim_pwm);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(htim_pwm, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(htim_pwm, TIM_CHANNEL_1);
}
```
这段代码展示了如何使用STM32微控制器上的定时器模块生成PWM信号,并通过不断更新比较寄存器中的数值来模拟LED的“呼吸”现象。注意这里的`__HAL_TIM_SET_COMPARE()` 函数用来动态更改PWM通道的占空比,而 `HAL_Delay()` 则提供了必要的延时让人类眼睛能够感知到光强的变化。
阅读全文
相关推荐













