stm32f103c8t6最小系统板pwm实现呼吸灯
时间: 2025-01-24 17:01:18 浏览: 29
STM32F103C8T6 最小系统板 PWM 实现呼吸灯
使用 TIM3 和 TIM4 输出 PWM 波形实现两个 LED 的呼吸灯效果
为了在 STM32F103C8T6 上实现呼吸灯效果,主要依赖于定时器产生的 PWM 信号来调节 LED 的亮度。PWM 控制的关键在于调整占空比,从而改变输出电压的有效值,进而控制 LED 的亮度变化。
初始化配置
首先,在初始化阶段需设置好 GPIO 口和定时器模式:
#include "stm32f1xx_hal.h"
// 定义使用的GPIO端口及引脚编号
#define LED_PIN_1 GPIO_PIN_6
#define LED_PIN_2 GPIO_PIN_7
#define LED_PORT GPIOA
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);
int main(void){
HAL_Init();
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // 初始化GPIO
MX_TIM3_Init(); // 初始化TIM3用于生成PWM
while (1){
}
}
/**
* @brief 配置并使能TIM3通道1,2作为PWM输出.
*/
static void MX_TIM3_Init(){
__HAL_RCC_TIM3_CLK_ENABLE();
TIM_HandleTypeDef htim3;
TIM_OC_InitTypeDef sConfigOC;
htim3.Instance = TIM3;
htim3.Init.Prescaler = 839; /* 设置预分频系数为840-1=839 */
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999; /* 自动重装载周期值设为1000-1=999 */
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if(HAL_TIM_PWM_Init(&htim3) != HAL_OK){
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; /* 初始占空比为0% */
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if(HAL_TIM_PWM_ConfigChannel(&htim3,&sConfigOC,TIM_CHANNEL_1)!= HAL_OK){
Error_Handler();
}
if(HAL_TIM_PWM_ConfigChannel(&htim3,&sConfigOC,TIM_CHANNEL_2)!= HAL_OK){
Error_Handler();
}
HAL_TIM_MspPostInit(&htim3); /* 调用此函数完成DMA等资源分配 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); /* 开始PWM输出 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
}
上述代码实现了对 TIM3 的初始化,并将其 Channel1 和 Channel2 分配给 PA6 和 PA7 进行 PWM 输出[^3]。
动态调整占空比模拟呼吸效果
为了让 LED 达到呼吸的效果,可以在主循环里动态修改 Pulse
参数,即改变占空比大小,形成渐亮再渐暗的过程:
uint16_t duty_cycle = 0;
float direction = 1.0f;
while(1){
duty_cycle += direction*5;
if(duty_cycle >= 100 || duty_cycle <= 0){
direction *= -1.0f;
}
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, ((duty_cycle/100)*1000));
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, ((duty_cycle/100)*1000));
HAL_Delay(20); /* 添加适当延时让肉眼可见的变化 */
}
这段程序通过不断更新比较寄存器中的数值来达到平滑过渡的目的,使得连接至这些管脚上的LED呈现出缓慢变亮又慢慢熄灭的现象,就像人的呼吸一样自然流畅。
相关推荐



















