家里原来有个用了很多年的台灯,灯管配不上就闲置了。这次本打算利用这个旧灯架改制一个LED触摸调光台灯,结果半个月前老婆收拾房间当废品丢弃了,起因是家里有了一个小米LED台灯。改制台灯的事已经想了很久,材料也准备了,不过这只是个半成品,算是给自己个安慰。
一、简介
LED照明部分使用了2颗3W LED灯珠,LED恒流驱动使用了PT4115,PWM产生及触摸按键部分使用了CH549EVT开发板。利用开发板上的三只触摸按键分别控制PWM占空增加;PWM占空比减少,用于调节LED亮度,另外一个用于LED关闭。
二、硬件介绍
1、LED灯珠。
LED采用TOSHIBA_TL1F1-NW0-L两只串联,其主要参数见下图。原计划使用三颗计9W,后面发现小米台灯6W LED已经很亮了,于是就改为了两颗。LED散热器选用了一根250*27*5mm的铝合金条;
2、LED驱动PT4115。
手上还有一种AMC7150驱动电流更大一些,但没有PWM控制功能。这里选用的是PT4115芯片。电路使用的是手册中的典型应用电路。其DIM引脚这PWM控制端。
3、电源。
为方便调试使用了成品电源,第一次选用了一只7.2V输出的电源,结果PT4115采样电阻减少至0.1欧姆,LED工作电源还不到130mA;随后又换了一只9V输出的电源,在PT4115采样电阻0.1欧姆时LED工作电流达到了近630mA,最后又将PT4115采样电阻调整至0.22欧姆时,LED工作电流达到了近320mA。电源输出只有600mA,有点小了;
三、硬件电路制作、调试。
PT4115安家的小板是之前制作PCB时补白的产物,电感是个拆机件。调试过程中发现LED的工作电流会随着时间慢慢下降一些,至310mA时基本稳定。
四、控制程序实现。
因为有了前期的一些测试实验,在加之本次制作比较简单,再就是沁恒电子还提供了大量的例程,所以程序在整体实现的过程就比较简单了,不过按键处理函数写的太糟糕。下面是主要代码:
#define time 500 //延时常数
static UINT16 TEMP; //用于按键计数
UINT16 PowerValue[16]; //保存触摸按键上电未触摸值
volatile UINT16 Press_Flag = 0; //按下标志位
UINT8C CPW_Table[16] = { 30,30,30,30, 30,30,30,30, //与板间电容有关的参数,分别对应每个按键
30,30,30,30, 30,30,30,30,
};
UINT8C PWM_CODE[]={0,32,64,128,192,255}; //预设PWM占空比值
void main()
{
UINT8 ch;
UINT16 value;
UINT16 err; //触摸模拟变化差值
CfgFsys(); //CH549时钟选择配置
mDelaymS(20);
mInitSTDIO(); //串口0初始化,此例用于调试
printf("TouchKey demo start ...\n");
LED_Port_Init();
TouchKey_Init();
PWM_Config();
//UART0_Config;
Press_Flag = 0; //无按键按下
/* 获取按键初值 */
for(ch=8; ch!=12; ch++)
{
PowerValue[ch] = TouchKeySelect(ch,CPW_Table[ch]);
printf("%d ",PowerValue[ch]);
}
printf("\n");
while(1)
{
/* 按键检测 */
for(ch=8; ch!=11; ch++)//此处去除了ch12,即P25用于PWM输出。
{
value = TouchKeySelect(ch,CPW_Table[ch]);
err = ABS(PowerValue[ch],value);
switch(ch)
{
case 8:
{
if(err > DOWM_THRESHOLD_VALUE) //差值大于阈值,认为按下
{
if((Press_Flag & (1<<ch)) == 0) //说明是第一次按下
{
//printf("ch %d pressed,value:%d\n",(UINT16)ch, value);
/* 点灯处理 */
LED_Control(ch-8,1);
}
Press_Flag |= (1<<ch);
}
else if(err < UP_THRESHOLD_VALUE) //说明抬起或者未按下
{
if(Press_Flag & (1<<ch)) //刚抬起
{
Press_Flag &= ~(1<<ch);
//printf("ch %d up,value:%d\n",(UINT16)ch, value);
/* 灭灯处理 */
LED_Control(ch-8,0);
TEMP ++;
if(TEMP >= 5)
TEMP = 5;
PWM_DATA0 = PWM_CODE[TEMP];
//PWM_TEMP = PWM_DATA0;
printf("TEMP %d\n",TEMP);
mDelaymS(time);
}
}
}break;
case 9:
{
if(err > DOWM_THRESHOLD_VALUE) //差值大于阈值,认为按下
{
if((Press_Flag & (1<<ch)) == 0) //说明是第一次按下
{
//printf("ch %d pressed,value:%d\n",(UINT16)ch, value);
/* 点灯处理 */
LED_Control(ch-8,1);
}
Press_Flag |= (1<<ch);
}
else if(err < UP_THRESHOLD_VALUE) //说明抬起或者未按下
{
if(Press_Flag & (1<<ch)) //刚抬起
{
Press_Flag &= ~(1<<ch);
//printf("ch %d up,value:%d\n",(UINT16)ch, value);
/* 灭灯处理 */
LED_Control(ch-8,0);
TEMP--;
if(TEMP <= 0)
TEMP = 1;
PWM_DATA0 = PWM_CODE[TEMP];
//PWM_TEMP = PWM_DATA0;
printf("TEMP %d\n",TEMP);
mDelaymS(time);
}
}
}break;
case 10:
{
if(err > DOWM_THRESHOLD_VALUE) //差值大于阈值,认为按下
{
if((Press_Flag & (1<<ch)) == 0) //说明是第一次按下
{
//printf("ch %d pressed,value:%d\n",(UINT16)ch, value);
/* 点灯处理 */
LED_Control(ch-8,1);
}
Press_Flag |= (1<<ch);
}
else if(err < UP_THRESHOLD_VALUE) //说明抬起或者未按下
{
if(Press_Flag & (1<<ch)) //刚抬起
{
Press_Flag &= ~(1<<ch);
//printf("ch %d up,value:%d\n",(UINT16)ch, value);
/* 灭灯处理 */
LED_Control(ch-8,0);
TEMP = 0;
PWM_DATA0 = PWM_CODE[TEMP];//LED熄灭
printf("TEMP %d\n",TEMP);
mDelaymS(time);
}
}
}break;
default: break;
}
}
}
}
四、成果展示
五、总结及改进
这次制作算是对CH549的一次简单的综合应用,不过确实太简单了点。原计划是使用CH554T并且也画了PCB,因为旧灯架没了也就暂时放下而利用了CH549EVT进行。
这次用了两颗LED还是不错的,但没有均光罩投射出的光会产生重影,没有实际应用价值,用于台灯照明这是必须改进的。制作中利用了三个触摸按键,一个用于增加PWM;一个用于减少PWM;另外一只用于开、关LED电源,考虑到是临时实验验证就把开关的功能省略了,关闭LED采用了将PWM占空比调整为“0”进行替代;而打开LED直接触摸“增加”、“减少”PWM占空比进行替代。因此准备做如下改进:
1、使用TSSOP20封装的CH554T作为主控;
2、增加电源控制电路,即采用一只PMOS及一只NPN型三极管组成电子开关,用以控制LED电源,实现触摸控制其“开”、“关”状态;
3、将LED灯关闭前的“亮度”,即PWM占空比值保存至片内的FLASH_ROM,在下一次LED打开时再将其读出并写入PWM占空比设置寄存器,实现亮度记忆功能;
4、考虑将LED亮度设置为亮-中亮-暗三档;
5、将LED供电电源更换为9V/1A;
通过这一段时间的学习,虽然对沁恒电子的CH549微控制器有了一定的认知,但还停留在比较肤浅的层面,对于陌生的USB更是没有入门,学习的路还很长。
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处
|