電路為BUCK型,所有LED串電阻后并聯。
LED為5730的暖白與白色兩種,暖白6只,白色的4只。
電位器調節LED亮度,電位器的ADC值直接賦予PWM的比較值。
逆時針旋到底為關機狀態,此時單片機工作于掉電模式,用
掉電喚醒專用定時器喚醒,電流約5uA。
電位器順時針旋轉一定角度后,單片機工作于空閑模式,由T0定時
喚醒,單片機電流約3.7mA。
由于國LED比較刺眼,最后在LED上蒙了兩層衛生紙,用封口膠給粘上的。
燈與底座之間采用USB接口連接,這樣的好處是燈可以插到USB充電
器上單獨使用。
核心代碼:
while(1)
{
POT_L;//使能電位器
delayus(1);
v=adc_read8(2);
//CCAP1H=v;
POT_H;//關閉電位器
if((v<10)&&(CCAP1H<11))//關機
{
CCAP1H=0;
CCAPM1=0;//關PWM
n++;
if(n>=5)//每5秒閃一次,便于夜間尋找
{
n=0;
IOCLR(P1,BIT(0));
IOSET(P1,BIT(0));
}
PCON=0X02;//掉電
_nop_();
_nop_();
}
else//不關機
{
CCAP1H=((U16)CCAP1H*9+v)/10;//亮度漸變
CCAPM1=BIT(6)|BIT(1);
PCON=0x01;//空閑
_nop_();
_nop_();
}
}
















--------------------------
11.1317:更新PCB,因為原PCB中LED模塊敷銅距離太近。
12.0922:
程序中原PWM時鐘為FOSC/2,PWM頻率約22KHz,現已將PWM時鐘改為FOSC,PWM頻率約43KHz。
電路中增加AP5056充電芯片,USB輸出增加1uf電容,如無此電容,電流會有較大鋸齒。



C7=1uf時,輸出串1歐取樣電阻測得的波形:

C7=10uf時,輸出串1歐取樣電阻測得的波形:

問: 這是BUCK電路電壓調光啊。不算PWM調光
答:
我的PWM占空比是跟隨電位器的,電位器不動,占空比就不變,怎么不算PWM調光?
LED通電后,它的電壓是基本不變的,特性類似于穩壓二極管。
所以當Q4導通時,電感上的電壓也基本不變,電流呈線性上升,所以占空比越大時,平均電流也越大。
所以LED的平均電流與PWM占空基本是呈線性的,應當稱之為“電流調光”
單片機源程序如下:
- /*--------------------------------------------------
- 電位器調節LED亮度
- 逆時針旋到底為關機狀態,此時單片機工作于掉電模式,用
- 掉電喚醒專用定時器喚醒,電流約5uA。
- 電位器旋轉一定角度后,單片機工作于空閑模式,由T0定時
- 喚醒,單片機電流約3.7mA
- //--------------------------------------------------*/
- #include <INTRINS.H>
- #include "STC15F2K60S2.H"
- #include "MAIN.H"
- #include "uart-15.C"
- #include "stcadc.c"
- //--------------------------------------------------
- //定義
- //--------------------------------------------------
- //最大PWM
- #define MAXPWM 230
- //電位器使能
- #define POT_L IOCLR(P1,BIT(1))
- #define POT_H IOSET(P1,BIT(1))
- //--------------------------------------------------
- //毫秒級延時
- //--------------------------------------------------
- void delayms(U16 t)
- {
- U16 i;
- for(;t>0;t--)
- for(i=FOSC/13186;i>0;i--);
- }
- //--------------------------------------------------
- //微秒級延時
- //--------------------------------------------------
- void delayus(U16 t)//72=200us
- {
- while(t--);
- }
- //--------------------------------------------------
- //T0中斷:
- //每次+-1更新PWM值,處理啟動與停機
- //--------------------------------------------------
- void timer0_isr(void) interrupt 1
- {
- }
- //--------------------------------------------------
- //掉電喚醒定時器
- //t*488us
- //--------------------------------------------------
- void wkt_init(U16 t)
- {
- WKTCL=t;
- WKTCH=BIT(7)|(t>>8);
- }
- //--------------------------------------------------
- //PCA初始化
- //--------------------------------------------------
- void pca_init(void)
- {
- CMOD=4<<1;//FOSC
- //CMOD=1<<1;//FOSC/2
- CCAPM1=BIT(6)|BIT(1);//8位PWM
- CCAP1H=0X80;
- //P_SW1=0<<4;//切換CCP到P1
- //P_SW1=1<<4;//切換CCP到P3
- CR=1;
- }
- //--------------------------------------------------
- //T0初始化
- //--------------------------------------------------
- void timer0_init(U16 f)
- {
- U16 v;
- TMOD&=0xf0;
- TMOD|=0X00; //T0方式0,16位自動重裝
- v=65536-(FOSC/12/f);
- TH0=v>>8;
- TL0=v;
- ET0=1;
- TR0=1;
- }
- //--------------------------------------------------
- //端口初始化
- //--------------------------------------------------
- void io_init(void)
- {
- P0=0XFF;
- P1=0XFF;
- P2=0XFF;
- P3=0XFF;
- P1M1=BIT(2)|BIT(3)|BIT(4);//AD測電位器、充電電壓
- //IOCLR(P1,BIT(1));//P1.1光纖接收使能
- //P3M1=0xff;
- //P2M1=BIT(5);
- //M0,M1:00:準雙向口,01:推挽,10:僅輸入,11:開漏
- //注意:5A60S2的M0,M1是相反的
- }
- //--------------------------------------------------
- //所有設置初始化
- //--------------------------------------------------
- void init_devices(void)
- {
- io_init();
- uart1_init(9600,1);//關中斷
- timer0_init(20);
- pca_init();
- wkt_init(2000);
- //cmp_init();
- //uart2_init(1600,0);//19200/12=1600,關中斷
- //IOSET(AUXR,BIT(2));//BRTx12,讓獨立波特率變為原來的12倍(uart2)
- //uart3_init(2400,1);//2400
- //IOSET(AUXR,BIT(7));//T0x12,讓T0的時鐘變為原來的12倍,波特率也提高了(模擬串口)
- // IP=0X02;//優先級控制(T0為最高優先級):D4:PS,D3:PT1,D2:PX1,D1:PT0,D0:PX0,
- EA=1;
- }
- //--------------------------------------------------
- //主函數
- //--------------------------------------------------
- void main(void)
- {
- U8 v,n;
- //S16 e;
- init_devices();
- while(1)
- {
- POT_L;
- delayus(1);
- v=adc_read8(2);
- //CCAP1H=v;
- POT_H;
- if((v<10)&&(CCAP1H<11))//關機
- {
- CCAP1H=0;
- CCAPM1=0;
- n++;
- if(n>=5)//每5秒閃一次,便于夜間尋找
- {
- n=0;
- IOCLR(P1,BIT(0));
- delayus(2);
- IOSET(P1,BIT(0));
- }
- PCON=0X02;//
- _nop_();
- _nop_();
- }
- else//不關機
- {
- //if(v>MAXPWM)v=MAXPWM;
- //CCAP1H=v;
- /*e=(U16)v-CCAP1H;
- if(e<-10)e=-10;
- if(e>10)e=10;
- CCAP1H+=e;*/
- CCAP1H=((U16)CCAP1H*9+v)/10;
- CCAPM1=BIT(6)|BIT(1);
- PCON=0x01;
- _nop_();
- _nop_();
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
1.1電路及程序.rar
(958.86 KB, 下載次數: 123)
2018-9-7 22:37 上傳
點擊文件名下載附件
LED臺燈電路及程序.rar
(935.5 KB, 下載次數: 131)
2018-9-7 22:37 上傳
點擊文件名下載附件
|