本帖最后由 liuz 于 2014-8-13 19:16 編輯
這是這邊做的一個設計,供大家參考。
一般PWM調光都是分兩級的,一級PFC部分(BOOST PFC或者Flybakc PFC),一級DC/DC調光部分。但明顯成本偏高,如果能用一級同時實現PFC和PWM調光就可以節省成本,基于這個想法,設計了一款次級用MCU控制的單級調光方案,經實驗效果良好,現與大家分享。此方案可接受0-10V電壓控制信號,然后轉化為PWM脈沖同時控制初次級通斷來實現PWM調光。
1348018356505920b451c62_small.jpg (38.01 KB, 下載次數: 250)
下載附件
2014-8-13 19:14 上傳
1348018382505920ce7e73b_small.jpg (37.13 KB, 下載次數: 230)
下載附件
2014-8-13 19:14 上傳
134802666150594125c9e3e_small.jpg (32.97 KB, 下載次數: 235)
下載附件
2014-8-13 19:14 上傳
效率和PF。
134803818850596e2c0943d_small.jpg (28.86 KB, 下載次數: 228)
下載附件
2014-8-13 19:14 上傳
134803821550596e474ed80_small.jpg (22.36 KB, 下載次數: 224)
下載附件
2014-8-13 19:14 上傳
EMI
134803825550596e6f4babc_small.jpg (37.99 KB, 下載次數: 239)
下載附件
2014-8-13 19:14 上傳
134803826350596e7757e07_small.jpg (37.92 KB, 下載次數: 224)
下載附件
2014-8-13 19:14 上傳
調光特性,可根據需要軟件調整。
134803839350596ef90710f_small.jpg (30.94 KB, 下載次數: 217)
下載附件
2014-8-13 19:14 上傳
10%負載時的輸出電流和MOS開關波形
50%負載時的輸出電流和MOS開關波形
90%負載時的輸出電流和MOS開關波形
1348471008506008e066cf2_small.jpg (44.49 KB, 下載次數: 211)
下載附件
2014-8-13 19:14 上傳
1348471018506008ea60f2d_small.jpg (46.09 KB, 下載次數: 217)
下載附件
2014-8-13 19:14 上傳
1348471032506008f859a03_small.jpg (38.06 KB, 下載次數: 209)
下載附件
2014-8-13 19:14 上傳
程序:
//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輸出
}
}
|