基于stm32f103rct6的呼吸灯实现

一、PWM

       我们可以通过改变灯的有效电压占空比来实现呼吸灯效果。其中我们要用到PWM(脉宽调制),通过pwm我们可以来改变高电平的占空比

        ·占空比:在一个周期中,高电平所占整个周期的百分比

具体如图:

基于stm32f103rct6的呼吸灯实现_第1张图片

当我们用pwm来生成呼吸灯时,因为在stm32f103rct6中PA8LED灯是通过给PA8输入一个低电平点亮的,所以低电平在一个周期中维持的时间越长,灯越亮。

具体实现看代码:

void Pwm_Init()
{
    GPIO_InitTypeDef  	GPIO_InitStruct;
	TIM_OCInitTypeDef 	TIM_OCInitStruct;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
    /*1、使能时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA |RCC_APB2Periph_TIM1,ENABLE);
    
    /*2、配置GPIO*/
	GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_8;  		//引脚8 LED1
	GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF_PP;		//复用
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz; //速度
	GPIO_Init(GPIOA,&GPIO_InitStruct);	
	 
	
	//4、初始化定时器,配置ARR,PSC。
	TIM_TimeBaseInitStruct.TIM_Prescaler	= psc; 	//分频系统  ,每秒数多少个数 
	TIM_TimeBaseInitStruct.TIM_Period		= per; 	//重装值
	TIM_TimeBaseInitStruct.TIM_CounterMode	= TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0x00;
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);		

	/*配置pwm*/
	TIM_OCInitStruct.TIM_OCMode		=  TIM_OCMode_PWM1; 	  //PWM1模式
	TIM_OCInitStruct.TIM_OutputState=  TIM_OutputState_Enable;//输出使能
	TIM_OCInitStruct.TIM_OCPolarity =  TIM_OCPolarity_Low; 	  //极性低
	TIM_OCInitStruct.TIM_Pulse = 0x00;
	TIM_OC1Init(TIM1,&TIM_OCInitStruct);
	//5、使能预装载寄存器: 
	TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); 
	
	//6、使能自动重装载的预装载寄存器允许位	
	TIM_ARRPreloadConfig(TIM1,ENABLE);

	/*pwm输出通道使能*/
	TIM_CtrlPWMOutputs(TIM1,ENABLE);
		
	//7、使能定时器。
	TIM_Cmd(TIM1,ENABLE);

}

 主函数:


void HardWare_Init(void)
{
	SysTick_Init(72);
	Pwm_Init(100-1,7200-1);
}

int main(void)
{
	u8 cnt = 0;
	u8 fx = 1;
	HardWare_Init();
	while(1)
	{
		if(fx)
		{
			cnt++;
			if(cnt>99)
				{
					fx = 0;
				}
		}
		else
		{
			cnt--;
			if(cnt < 1)
			{
				fx = 1;
			}
		}
		TIM_SetCompare1(TIM1,cnt);
		delay_ms(20);
	}
}

你可能感兴趣的:(stm32,嵌入式硬件,单片机)