当前位置:   article > 正文

STM32呼吸灯原理

stm32呼吸灯原理

前段时间学习stm32的时候就做过呼吸灯实验,浏览了一些博客后,做下总结
呼吸灯原理其实是利用pwm(脉冲宽度调节)技术,通过改变占空比来实现呼吸灯,占空比是指高电平除以总的周期,
下面直接上代码
int xxx=20000;
while(1)
{
for(i=0;i<xxx;i++)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay(xxx-i);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(i);
}
for(i=0;i<xxx;i++)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay(i);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(xxx-i);
}
delay(100);
}

还有一种方法是使用灯引脚用作为定时器复用功能,然后初始化定时器输出功能为pwm,再通过修改CCR1改变占空比。
下面上程序,
定时器程序
GPIO_InitTypeDef aaa;//GPIO初始化结构体
TIM_TimeBaseInitTypeDef bbb;
TIM_OCInitTypeDef ccc;

//0、时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//PF9对应的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);

//1、初始化需要用到的模块
aaa.GPIO_Pin = GPIO_Pin_9;//PF9
aaa.GPIO_Mode = GPIO_Mode_AF;//复用功能  因为pF9等会要被用作定时器输出功能
aaa.GPIO_Speed = GPIO_Fast_Speed;//引脚速度选择
aaa.GPIO_OType =  GPIO_OType_PP;//推挽输出 GPIO_OType_OD 开漏
aaa.GPIO_PuPd  = GPIO_PuPd_NOPULL;//选择浮空 无上下拉
GPIO_Init(GPIOF,&aaa);//LED1初始化

	
//2、初始化定时器模块---设置PWM周期 计数器+预分频器+设定值
bbb.TIM_Prescaler = 84-1;//1us/脉冲
bbb.TIM_Period = 1000-1;
bbb.TIM_CounterMode = TIM_CounterMode_Up;
bbb.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&bbb);

//3、将指定的引脚用作为某个复用功能
GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);//

//4、初始化定时器14的输出功能模块--根据通道 OC1--CH1  OC2--CH2
ccc.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1  PWM模式2
ccc.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low	
ccc.TIM_Pulse = 500;//一开始是1000的一半----调节占空比的CCR1
ccc.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OC1Init(TIM14,&ccc);

//开启自动重载载寄存器的使能--TIM  开启定时器ARR寄存器缓冲
TIM_ARRPreloadConfig(TIM14,ENABLE);


//6、开启CCRx的缓冲 
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);


//7、开启定时器13
TIM_Cmd(TIM14,ENABLE);
GPIO_ResetBits(GPIOF,GPIO_Pin_9);//复位PF9  点灯
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

主程序

while(1)
{
//呼吸灯
for(i=0;i<1000;i++)
{
TIM14->CCR1=i;

		delay(1);
	}
	for(;i>=0;i--)
	{
		TIM14->CCR1=i;
		
		delay(1);	
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

}

以上就是我个人对呼吸灯实验的总结。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/791238
推荐阅读
相关标签
  

闽ICP备14008679号