stm32f103c8t6用PWM做五个呼吸灯
时间: 2024-11-10 12:12:24 浏览: 97
在STM32F103C8T6单片机上使用PWM(Pulse Width Modulation)创建五个呼吸灯,你可以按照以下步骤进行:
硬件连接:
- 将五个LED灯分别连接到STM32的五个PWM输出引脚,通常是PA8-PA12。每个LED需要串联一个电阻来限制电流和电压。
软件配置:
- 在STM32CubeMX或Keil IDE中,配置相应的GPIO和PWM外设: a. 将GPIO设置为推挽输出模式,用于驱动LED。 b. 将PWM输出通道设置为输出模式,选择合适的PWM频率(如1kHz~10kHz),以及50%占空比作为初始值。 c. 为每个PWM通道设置中断,以便于控制周期内的亮度变化。
定时器设置:
- 对于每个PWM通道,编写一个函数,比如
set_PWM_breathing(int channel, uint8_t brightness)
,其中channel
是PWM通道号,brightness
代表0-100%的亮度值。 - 函数内部,首先停止当前的PWM输出,然后设置新的占空比,根据
brightness
计算出对应的宽度比例。 - 接下来开启定时器,在下一个PWM周期开始前改变占空比,形成逐渐增亮和减亮的效果。
- 对于每个PWM通道,编写一个函数,比如
呼吸灯逻辑:
- 编写主循环,每次循环内检测按键或者其他条件,决定何时改变哪一组LED的亮度。可以设定一个全局变量记录当前活动的LED组,每按一次按键或满足其他条件,将该变量加1,取模5以保持在五个LED之间轮转。
中断服务函数:
- 利用中断,每当定时器溢出时,检查是否应该调整当前LED组的亮度,如果到了调整的时间点,调用
set_PWM_breathing
函数。
- 利用中断,每当定时器溢出时,检查是否应该调整当前LED组的亮度,如果到了调整的时间点,调用
示例代码片段(简化版):
#include "stm32f10x.h"
void set_PWM_breathing(uint32_t channel, uint8_t brightness) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE); // 开启时钟
TIMx->CCR1 = (uint16_t)(brightness * PWM_MAX_DUTY / 100);
TIMx->CR1 &= ~TIM_CR1_CEN; // 停止当前PWM
TIMx->CR1 |= TIM_CR1_CEN; // 开始PWM,改变占空比
}
void handle_breathing(void) {
static uint8_t active_channel = 0;
if (active_channel == 4) { // 最后一个LED变为下一个LED
active_channel = 0;
} else {
active_channel++;
}
set_PWM_breathing(active_channel, current_brightness); // 更新亮度
}
int main(void) {
// ... 其他初始化和中断配置 ...
while (1) {
if (button_pressed()) {
handle_breathing();
}
}
}
相关推荐



















