STM32呼吸灯原理

本文详细介绍了STM32单片机上实现呼吸灯效果的两种方法:一是通过软件控制PWM占空比变化;二是利用定时器复用功能进行硬件PWM输出。深入解析了呼吸灯的工作原理及具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间学习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  点灯

主程序

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

		delay(1);
	}
	for(;i>=0;i--)
	{
		TIM14->CCR1=i;
		
		delay(1);	
	}

}

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值