8位PWM扩展到12位的方法分享

    阅读模式

利用海尔的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:
0x0008;
比较寄存器T8P1RL的值分别是:
0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,

PWMD:
0x0108;
比较寄存器T8P1RL的值分别是:
0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,
0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x10,

如何减小变压器漏感 开关式电源

如何减小变压器漏感

在电源设计中,常常听到漏感两字,那什么是漏感,它对电源又有什么影响呢? 一、什么是漏感 线圈所产生的磁力线不能都通过次级线圈,因此产生漏磁的电感称为漏感。指变压器初次级在耦合的过程中漏掉的那一部份磁通...
几种常用的PCB表面处理工艺及其优缺点 pcb设计

几种常用的PCB表面处理工艺及其优缺点

几种常用的PCB表面处理工艺及其优缺点和适用场景 我们在画好PCB后,将其发送给PCB板厂打样或者是批量生产,我们在给板厂下单时,会附上一份PCB加工工艺说明文档,其中有一项就是要注明选用哪种PCB表...
金百泽Allegro Skill工具长期使用方法 pcb设计

金百泽Allegro Skill工具长期使用方法

前几天有网友问,他一直在用的金百泽的EDA Skill工具提示过期不能再了,怎么破?这个金百泽的EDA Skill工具提供了一些了好用的Allegro扩展功能,能极大提高PCB Layout设计效率,...