Zigbee、STM32系列开发板-非定时器方式实现PWM呼吸灯-实时状态更改方法-呼吸灯简易实现方法

一、概述

        本文讲述关于PWM呼吸灯不使用定时器的呼吸方式,并且可以实现随时暂停至某一单个亮度的PWM调光程序,具有非常高的实时性,对外界改变操作实时做出反馈。

二、实现思路

        本文的实现思路是以非定时器PWM实现的,需要先学习文章:STM32实现模拟呼吸灯效果-非PWM-STM32CubeMx项目生成-手动控制呼吸灯调光

        下面,我们需要使用此思路重新完成呼吸灯的配置,其只要思路即在主函数中一直进行PWM的呼吸效果,将完整的PWM过程拆分为若干个过程,使得程序具有实时性,且可以随时停留在某个占空比上,当且仅当主程序调用调光函数时,占空比才会相应增加或减少。

三、代码实现

        首先定义两个变量,分别代表占空比与占空比上升标志位。

int zkb=0;
int up=1;

        主要代码实现如下:

void breath()
{
	GpioWrite(&Led1,0);
	if(up==1)
	{
		zkb++;
		if(zkb==1500)
			up=0;
	}
	else
	{
		zkb--;
		if(zkb==0)
			up=1;
	}
	for(int i=0;i<1500;i++)
	{
		if(i>zkb)
		{
			GpioWrite(&Led1,1);
		}
		
	}
	
	
}

        通过阅读本段代码可以得知,我们只需要在主函数中不断调用,即可实现呼吸灯效果,且当我们不在调用时,LED灯将熄灭。

        下面我们继续增加一个标志位,仅当标志位为真时,才会提高会降低占空比,代码实现如下:

int zkb=0;
int up=1;
int breathflag=0;
void breath()
{
	GpioWrite(&Led1,0);
	if(breathflag==1)
	{
		if(up==1)
		{
			zkb++;
			if(zkb==1500)
				up=0;
		}
		else
		{
			zkb--;
			if(zkb==0)
				up=1;
		}
	}	
	for(int i=0;i<1500;i++)
	{
		if(i>zkb)
		{
			GpioWrite(&Led1,1);
		}
	}
}

        通过这个函数我们可以看出,我们在主函数中循环调用该函数,当呼吸标志位为真时,则占空比会改变,否则将持续当前亮度。

        主函数调用方法:

int main( void )
{
    Init();
    while( 1 )
    {
			breath();
			
			if(isKey2Pressed())
			{
				breathflag=1;
				resetKey2();
			}
			if(isKey3Pressed())
			{
				breathflag=0;
				resetKey3();
			}
    }
}

        函数解析如下:当按下key2键时,程序开始进入呼吸灯;当按下key3键时,呼吸灯停止并一直展示当前亮度。

四、总结

        本文阐述了一种除定时器PWM调光外的一种虚拟的PWM过程,且在实时性、效率方便提高,以最简单的方式完成呼吸灯的暂停与开始。

猜你喜欢

转载自blog.csdn.net/qq_39724355/article/details/127634810