电路为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)
LED台灯电路及程序.rar
(935.5 KB, 下载次数: 131)
|