PWM控制实现呼吸灯

一.呼吸灯原理

呼吸灯指灯光的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减 ,很有节奏感地一起一伏,就像是在呼吸一样,被广泛应用于手机、电脑、电视等电子设备的指示灯中。

通过调节PWM占空比实现呼吸灯效果。通过调节定时器的比较寄存器的值,来调节PWM占空比。PWM占空比 = CCR/(ARR+1);ARR:自动装载寄存器的值 ;CCR: 比较寄存器。

二.实验过程

上图是 RGB 彩灯,里面由红蓝绿三个小灯构成,通过调节PB0引脚PWM占空比实现绿灯的呼吸灯效果。

三.源代码

1.bsp_generalpwm.c

c 复制代码
#include "bsp_generalpwm.h"
//使用TIM3的 输出比较通道3 对应的GPIO-PB0初始化
void INIT_GENERAL_GPIO_CONFIG()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PB0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//推免输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

/* ----------------   PWM信号 周期和占空比的计算--------------- */
// ARR :自动重装载寄存器的值
// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)
void INIT_GENERAL_PWM_CONFIG()
{
	//初始化 TIM_TimeBaseInitTypeDef
	//开启定时器时钟,即内部时钟CK_INT=72M
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1;//分频因子
	TIM_TimeBaseInitStructure.TIM_Period = 100-1;//重载寄存器的值
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	
	//初始化 TIM_OCInitTypeDef
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//使用PWM1模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出通道电平极性 低电平有效 (即CNT<CCR(比较寄存器)输出电平)
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;//占空比:TIM_Pulse/(Period +1)
	TIM_OC3Init(TIM3,&TIM_OCInitStructure);
	
	//使能计数器
	TIM_Cmd(TIM3,ENABLE);
}

void DELAY_MS(uint32_t value)
{
	uint32_t i;
	for(i=value;i>0;i--)
	{
	}
}

2.main.c

c 复制代码
#include "bsp_generalpwm.h"
int main(void)
{	
	uint8_t i = 0;
	INIT_GENERAL_GPIO_CONFIG();
	INIT_GENERAL_PWM_CONFIG();
	while(1)
	{
		for(i=0;i<100;i++)
		{
			TIM_SetCompare3(TIM3,i);//设置输出比较寄存器(CCR)的值
			DELAY_MS(0x5FFFF);
		}
		for(i=100;i>0;i--)
		{
			TIM_SetCompare3(TIM3,i);
			DELAY_MS(0x5FFFF);
		}
	}
}

四.实现效果

呼吸灯效果演示

stm32呼吸灯