一种LED灯闪烁的实现方法
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; //调节已经稳定
}
}
}