stm32f103rct6呼吸灯
时间: 2024-12-29 14:24:51 浏览: 10
### 使用 STM32F103RCT6 实现呼吸灯效果
为了在 STM32F103RCT6 单片机上实现呼吸灯效果,可以利用 Timer1 的 CH1 输出 PWM 来控制 LED 的亮度变化[^1]。具体来说,通过调整 PWM 波形的占空比,可以使 LED 的亮度逐渐增加至最亮再逐渐变暗,形成类似于呼吸的效果。
#### 初始化配置
首先,在初始化阶段设置好 TIM1 定时器以及相应的通道用于生成 PWM 信号:
```c
void TIM_PWM_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM1, ENABLE);
// 配置 PA8 作为 TIM1_CH1 复用推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置定时器参数
TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0;// CKD=0
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
// 配置 PWM 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
// 启用自动加载预分频寄存器和捕获比较寄存器
TIM_Cmd(TIM1,ENABLE);
}
```
这段代码完成了对 GPIO 及 TIM1 的基础设定,并开启了向上计数方式下的 PWM 功能[^4]。
#### 控制逻辑编写
接下来定义一个函数用来动态调节占空比从而达到渐明渐灭的目的:
```c
uint16_t duty_cycle = 0; // 初始占空比设为零
// 呼吸灯核心算法
void Breath_Light(){
static uint8_t direction = 0; // 方向标志位
if(direction == 0){ // 正方向增光过程
duty_cycle += 10;
if(duty_cycle >= 1000) {
duty_cycle = 1000;
direction = !direction;
}
}else{ // 反方向减光过程
duty_cycle -= 10;
if(duty_cycle <= 0) {
duty_cycle = 0;
direction = !direction;
}
}
TIM_SetCompare1(TIM1,duty_cycle); // 更新比较值以改变占空比
}
int main(void){
HAL_Init();
SystemClock_Config(); // 系统时钟配置
TIM_PWM_Init(); // 初始化PWM功能
while (1){
Breath_Light(); // 调整LED亮度
Delay_ms(20); // 添加适当延时防止过快切换影响视觉体验
}
}
```
上述程序实现了正弦波式的亮度变换规律,即先由暗转亮再到完全熄灭的过程循环往复,以此模拟出自然界的“呼吸”现象[^2].
阅读全文