利用海尔的HR7P159做LED调节,在LED亮度低时调节亮度出现明显的闪烁。
分析发现是由于每次调节1一个步长的占空比,到20%占空比以下时相当亮度变化5%(1/20)。为了解决闪烁必须增加调节精度即PWM的位数。
通过下面算法扩展到12位这样20%以下每次调节的亮度就只有(1/320)了,灯非常细腻。
U16 PWMD;//PWM占空比
U8 PWMD_H;//占空比整数
U8 PWMD_L;//占空比余数
U8 PWM_COUNT;//PWM脉冲数
void isr(void) interrupt//PWM中断
{
u8 i;
if(T8P1IF)
{
T8P1IF=0;
if(++PWM_COUNT>15)
{
PWM_COUNT=0;
PWMD_H= PWMD/16;//求PWM的整数
PWMD_L=PWMD%16;//求PWM的余数
}
i= PWMD_H;
if( PWMD_L>0)
{
i+=1;
PWMD_L-=1;
}
T8P1RL=i;//每次更新占空比
}
}
这个在LED应用比自带的12位的PWM效果还要好,因为相对12位PWM的系统8位扩展的PWM驱动频率要高很多。
稍微解释一下; 直接给转换结果,通俗易懂: PWMD是程序计算的12bit,PWM值,硬件是8bit,PWMD的低四bit会被处理,共16次中断完成一次PWMD;比如 PWMD: 0x0001; 比较寄存器T8P1RL的值分别是: 0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 这样得到的占空比是1/16,等效于扩展了4bit; 同样 PWMD: |