【STM32】呼吸灯详解

目录

  • 原理
    • 1、亮度如何调节
    • 2、变亮/变暗的时间如何调节
    • 3、变亮了以后怎么变暗
  • 程序

原理

呼吸灯即灯的亮度从弱到强,反复循环,要实现这个效果需要分析几点

1、亮度如何调节

假设存在周期T,将其等分100份,每一份的时间为t,若这100个t的时间都把灯点亮,那灯呈现的亮度就是灯的峰值亮度,若50个t灯点亮,50个t灯熄灭,由于人的视觉暂留,那灯呈现的亮度就是灯峰值亮度的一半,所以控制一个周期T内灯点亮和熄灭所占时间的比例就能使得灯呈现出不同的亮度,但需需要注意两点:
1、周期T足够短
一般周期T小于20ms,即闪烁频率f=1/T大于50Hz时,人眼就无法分辨了,否则看到的便是闪烁效果
2、周期T需要重复
针对1个特定的亮度,只执行20ms人眼是来不及反应的,所以应该重复数次这个周期T
落实到程序上就是调整IO口电平高低的占比情况并重复执行数次这个占比情况

2、变亮/变暗的时间如何调节

变亮,就是这个亮度维持一段时间,然后提高亮度再维持一段时间,重复即可变亮,变暗同理
落实到程序上就是利用循环结构,逐次改变IO口电平高低的占比情况,从而改变亮度情况

3、变亮了以后怎么变暗

随着高电平占比的提升,灯会变亮,当整个周期T都点亮灯时,说明达到峰值亮度(当然也不一定要达到峰值亮度),就开始提升低电平的占比,灯会变暗
落实到程序上,首先设置一个标志位,灯到达峰值亮度时,改变标志位的值进入另一个循环,逐渐提高低电平的占比,灯变暗

程序

//寄存器版
#define DEALY_VALUE 2000	//宏定义延时常量
void Delay(unsigned int nCount);//延时函数
int main(void) //main  程序入口
{	
	unsigned int t,i;
	unsigned short int MENU;	//循环变亮/变暗标志位
	 
	MENU = 0;
	t = 10;	//亮度步长
	  
	  /*呼吸灯*/
		while (1)
		{		
			if (MENU == 0)	//变亮循环
			{
				for (i = 0; i<5; i++)	//特定占空比维持一段时间,即以一定亮度保持一段时间
				{
					GPIOB->BSRR = GPIO_Pin_0; //端口置1,若电路为正向驱动,LED点亮,反向驱动,LED熄灭
					Delay(t);
					GPIOB->BRR = GPIO_Pin_0;	//端口置0
					Delay(DEALY_VALUE+1-t);
				}
				t = t + 10;	//亮度的步长,步长越大,到达峰值亮度的时间越短
				if (t == DEALY_VALUE)	//DEALY_VALUE亮度峰值,峰值应设置为步长10的整数倍
					MENU = 1;
			}

			if (MENU == 1)	//变暗循环
			{
				for (i = 0; i<5; i++)
				{
					GPIOB->BSRR = GPIO_Pin_0; 
					Delay(t);
					GPIOB->BRR = GPIO_Pin_0;	
					Delay(DEALY_VALUE-t);
				}
				t = t - 10;
				if (t == 10)
					MENU = 0;
			 }
		}
}

void Delay(unsigned int nCount) 
{
		for(; nCount != 0; nCount--);
}

你可能感兴趣的:(【STM32】呼吸灯详解)