一般PWM调光都是分两级的,一级PFC部分(BOOST PFC或者Flybakc PFC),一级DC/DC调光部分。但明显成本偏高,如果能用一级同时实现PFC和PWM调光就可以节省成本,基于这个想法,设计了一款次级用MCU控制的单级调光方案,经实验效果良好,现与大家分享。此方案可接受0-10V电压控制信号,然后转化为PWM脉冲同时控制初次级通断来实现PWM调光。
效率和PF。
EMI
调光特性,可根据需要软件调整。
变压器结构: |
10%负载时的输出电流和MOS开关波形
50%负载时的输出电流和MOS开关波形
90%负载时的输出电流和MOS开关波形
程序:
//PWM Dimming main program.
#include "pic.h"
__CONFIG(0x7fc4);
unsigned int g_ADTable[4]={0,0,0,0}; //定义一个四位的数组
char g_Count=0; //定义变量
bit Overflag=0; //溢出标志位清零
interrupt ISR (void) //中断服务子函数
{
if (ADIE && ADIF)
{ ADIF=0;
g_ADTable[g_Count]=(((unsigned int)ADRESH)<<8) + ADRESL;
g_Count++;
if (g_Count==4)
{
g_Count=0;
Overflag=1;
}
else
{
GODONE=1;
}
}
}
void initial (void) // 单片机的初始化
{
int i=0;
TRISIO=0b00010000; //初始化AD转换
ANSEL=0B00001000; //GP4为模拟输入
GPIO=0b00000110;
ADCON0=0B10001101;
ADIE=1; //a/d中断打开
ADIF=0;
PEIE=1; //中断使能
GIE=1;
PR2=0xff; //初始化PWM,全高电平输出,使其先工作1s
CCP1CON=0b00001100;
CCPR1L=0xff;
T2CON=0b00000001; //最后两位由10改为01,开关周期由500HZ变为2K
TMR2ON=1;
TMR2IF=0; //PWM初始化设置完毕
for (i=0; i<15000;i++) //让电源先工作起来
{
}
GODONE=1;
}
void PWM_Output(unsigned char PWM_Width) //pwm输出宽度
{
unsigned char i=0,j=0;
if (CCPR1L == PWM_Width)
{
}
else
{
if (CCPR1L > PWM_Width)
{
i= CCPR1L - PWM_Width;
for (j=1; j<i; j++)
{
CCPR1L=CCPR1L-1;
TMR2IF=0;
while (!TMR2IF)
{
}
}
}
else
{
i=PWM_Width-CCPR1L;
for (j=1; j<i; j++)
{
CCPR1L=CCPR1L+1;
TMR2IF=0;
while (!TMR2IF)
{
}
}
}
}
}
void main(void)
{
int Tmp=0;
unsigned char i=0, Adv=0xff; //定义参变量及初始化
initial (); //系统初始化
while (1)
{
if (Overflag==1)
{
Tmp=0;
for (i=0; i<4; i++)
{
Tmp=Tmp + g_ADTable[ i];
}
Tmp=Tmp>>4; //得到平均值,移2位得到平均值,再移2位得到8位的平均值,即最大255
if (Tmp<=3)
{
Tmp=3;
}
Adv=Tmp;
Overflag=0;
GODONE=1;
}
else
{
GP1=1;
}
PWM_Output(Adv); //调整PWM输出
}
}