标题:
基于STC15W408AS的LED小台灯
[打印本页]
作者:
森森小公主
时间:
2018-9-7 21:16
标题:
基于STC15W408AS的LED小台灯
电路为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 上传
点击文件名下载附件
下载积分: 黑币 -5
LED台灯电路及程序.rar
(935.5 KB, 下载次数: 131)
2018-9-7 22:37 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
caijinfa
时间:
2018-9-12 10:58
很好的程序,马上下载来实验下。
作者:
新佳影
时间:
2018-12-6 02:11
谢谢先,正找这个用电位器来调光的,但是电路中如果有增加一个电位器来调色温就好
作者:
腾飞的龙
时间:
2019-3-30 16:46
g感谢分享学习啦!!!!
作者:
rong2017
时间:
2019-5-17 20:54
感谢分享
作者:
DanMg
时间:
2019-10-26 09:58
感谢分享
作者:
秋风凉
时间:
2019-11-3 12:30
这个程序的掉电时间 是怎么算的?
作者:
道洲
时间:
2019-11-13 16:46
感谢分享学习啦
作者:
道洲
时间:
2019-11-13 16:50
谢谢你,学习了
作者:
xiexugang
时间:
2020-1-3 10:34
这个程序挺实用,下来试试.谢谢楼主分享
作者:
zxule
时间:
2020-1-4 08:06
哇塞,楼主电路板怎么做的,怎么这么好,像工厂打样的一样
作者:
YKD1121
时间:
2020-7-29 23:25
请问这个电位器 用多大阻值的 谢谢
作者:
ty417502873
时间:
2020-8-3 03:05
这个PCB是用雕刻机雕的吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1