一种LED灯闪烁的实现方法

发布时间 2023-07-10 11:35:31作者: steven_lg

1.闪烁流程的实现

void LightFlicker(void)   //闪灯处理:清码对码
{		
if(Flicker) //有闪灯计数
{

	if(PwmAdjustmenting==0) //调节已经稳定
	{
		PwmAdjustmenting=1;  //处于不稳定态
		if(tickstatus==0)
		{	
			Brightness=0; //熄灯
			tickstatus=1;
		}
		else if(tickstatus==1)
		{
			Brightness = bkLight;//满格亮度 //清码对码后灯都为全亮状态
			tickstatus=2;
		}
		else if(tickstatus==2)
		{
    Brightness = bkLight;
			tickstatus=0;
			Flicker--; //闪灯计数减一
		}
		UpdataPwmDuty=2; //等速模式
	}
}
else
{
	tickstatus=0;
}
}

2.PWM赋值

void UpdataPwmDutyInt(void)   //在定时器0中断中更新占空比,定时器1中断时基100us
{	
static uint16_t UpdataTick; //闪烁速度限制,值越大波形变化越慢
static uint16_t UpdataCount;
uint8_t i;

if(UpdataPwmDuty)      //PWM更新触发,选择更新速度
{
	if(LightOn) //亮灯状态
	{
		PwmChDutySet[0]= CCTPer*10; //PWM0(色温)占空比设置 
		PwmChDutySet[1]= Brightness*10; //PWM1(亮度)占空比设置
	}
	else //关灯状态
	{
		PwmChDutySet[0]= CCTPer*10; //色温占空比不用清零
		PwmChDutySet[1]=0; //PWM1(亮度)占空比设为0
	}
	
	if(UpdataPwmDuty==3) //快速模式
	{
		PwmChDuty[0]=PwmChDutySet[0]; //占空比设置值直接给到
		PwmChDuty[1]=PwmChDutySet[1];
		UpdataTick=1; //更新速度等级为1
	}
	else if(UpdataPwmDuty==2)   //等速模式
	{
		if(Flicker) //闪烁模式中
		{
			UpdataTick=FlickerSpeed;   //更新速度等级为闪烁速度
		} 
  if(CCTCtnReglt) //CCT持续调节模式
  {
    UpdataTick = CCTCtnSpeed;
  }
  if(BRTCtnReglt) //亮度持续调节模式
  {
    UpdataTick = BRTCtnSpeed;
  }      
	}
	else           //等时模式
	{
		UpdataTick=10; //更新速度等级为10
	}
	UpdataPwmDuty=0; //PWM占空比更新失能

}

UpdataCount++;
if(UpdataCount>=UpdataTick)   //计数大于更新速度:更新PWM
{		
	UpdataCount=0;
	for(i=0;i<2;i++)
	{
		if(PwmChDutySet[i]!=PwmChDuty[i])
		{
			if(PwmChDutySet[i]>PwmChDuty[i])
			{
				PwmChDuty[i]++; //占空比调高
			}
			else
			{
				PwmChDuty[i]--; //占空比调低
			}				
		}
	}	  
	Pwm0SetDuty(PwmChDuty[0]); //PWM0占空比值更新(色温)
	Pwm1SetDuty(PwmChDuty[1]); //PWM1占空比值更新(亮度)  		
	if((PwmChDutySet[0]==PwmChDuty[0]) && (PwmChDutySet[1]==PwmChDuty[1])) //直到设置值稳定
	{
		PwmAdjustmenting=0; //调节已经稳定
	} 
}
}