3 解决方法
基于以上问题,对调光开关软件进行了优化,从图5中可以明显看出对比。优化后的软件流程图简洁清晰,大大降低了存在潜在问题点的可能性。
同时对于上述最后一条的问题,调整软件如下。
#define T 0×99//PWM的周期,是一个固定不
变的值
Wain()
{. .
TH0=t0; TL0=t0;//定时器赋初值,即PWM的周期中前半段低电平的时间
TR0=1;//开启定时器
flag-out- PWM=1; //开始输出PWM波形
…
t -update=0×26 ;//更新PWM波形占空比的请求
…
flag-out- PWM=0 ;//停止输出PWM波形的请求
…
}
void T0- PWM()interrupt 1
{
TR0=0;//计时器停止计时
TF0=0; //清零溢出标志位
if (out== 1)//如果高电平时间到
{
if (flag-out -PWM==0) //只有在高电平时才能够停止PWM输出以保证波形的完整性
{
TR0=0; //计时器停止计时
}
else
{
out=0;
t0=t- update ; //只有在高电平时才能够更新占空比,以免PWM周期T变化
TH0=T-t0 ; TL0= T-t0 ; //定时器重新赋值为PWM周期中后半段高电平的时间
TRO=1; //重新开始计时
}
上述程序说明如下。
1)由定时器来控制PWM波形高电平和低电平的时间,可以保证高低电平时间的精确性。
2)在主函数中可以实时开启PWM波形的输出,但却不能实时关闭。主函数中的“flag-out-PWM=0;”只是一个关闭请求,这个关闭请求只有在PWM一个完整的波形输出完毕时才能够得到响应,从而保证每一个波形输出的完整性。
3) PWM占空比参数的更新只能在PWM一个完整的波形输出完毕时,这样才能保!iEPWM周期的一致性。
4 总结
通过上述更改,调光开关输出的PWM波形周期非常稳定,波形也很完整,即使快速调节拨轮,也不会出现PWM周期异常变化的情况,从而彻底解决了调光开关异常闪烁的故障。