【沁恒试用】九、LED触摸调光灯
<p><span style="font-size:16px;"> 家里原来有个用了很多年的台灯,灯管配不上就闲置了。这次本打算利用这个旧灯架改制一个LED触摸调光台灯,结果半个月前老婆收拾房间当废品丢弃了,起因是家里有了一个小米LED台灯。改制台灯的事已经想了很久,材料也准备了,不过这只是个半成品,算是给自己个安慰。</span></p><p><span style="font-size:16px;">一、简介</span></p>
<p><span style="font-size:16px;"> LED照明部分使用了2颗3W LED灯珠,LED恒流驱动使用了PT4115,PWM产生及触摸按键部分使用了CH549EVT开发板。利用开发板上的三只触摸按键分别控制PWM占空增加;PWM占空比减少,用于调节LED亮度,另外一个用于LED关闭。</span></p>
<p><span style="font-size:16px;">二、硬件介绍</span></p>
<p><span style="font-size:16px;">1、LED灯珠。</span></p>
<p><span style="font-size:16px;"> LED采用TOSHIBA_TL1F1-NW0-L两只串联,其主要参数见下图。原计划使用三颗计9W,后面发现小米台灯6W LED已经很亮了,于是就改为了两颗。LED散热器选用了一根250*27*5mm的铝合金条;<br />
</span></p>
<p><span style="font-size:16px;">2、LED驱动PT4115。</span></p>
<p><span style="font-size:16px;"> 手上还有一种AMC7150驱动电流更大一些,但没有PWM控制功能。这里选用的是PT4115芯片。电路使用的是手册中的典型应用电路。其DIM引脚这PWM控制端。</span></p>
<p><span style="font-size:16px;"></span></p>
<p><span style="font-size:16px;">3、电源。</span></p>
<p><span style="font-size:16px;"> 为方便调试使用了成品电源,第一次选用了一只7.2V输出的电源,结果PT4115采样电阻减少至0.1欧姆,LED工作电源还不到130mA;随后又换了一只9V输出的电源,在PT4115采样电阻0.1欧姆时LED工作电流达到了近630mA,最后又将PT4115采样电阻调整至0.22欧姆时,LED工作电流达到了近320mA。电源输出只有600mA,有点小了;</span></p>
<p><span style="font-size:16px;"></span></p>
<p><span style="font-size:16px;">三、硬件电路制作、调试。</span></p>
<p><span style="font-size:16px;"> PT4115安家的小板是之前制作PCB时补白的产物,电感是个拆机件。调试过程中发现LED的工作电流会随着时间慢慢下降一些,至310mA时基本稳定。</span></p>
<p><span style="font-size:16px;"></span></p>
<p><span style="font-size:16px;">四、控制程序实现。</span></p>
<p><span style="font-size:16px;"> 因为有了前期的一些测试实验,在加之本次制作比较简单,再就是沁恒电子还提供了大量的例程,所以程序在整体实现的过程就比较简单了,不过按键处理函数写的太糟糕。下面是主要代码:</span></p>
<pre>
<code>#define time 500 //延时常数
static UINT16 TEMP; //用于按键计数
UINT16 PowerValue; //保存触摸按键上电未触摸值
volatile UINT16 Press_Flag = 0; //按下标志位
UINT8C CPW_Table = { 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 = TouchKeySelect(ch,CPW_Table);
printf("%d ",PowerValue);
}
printf("\n");
while(1)
{
/* 按键检测 */
for(ch=8; ch!=11; ch++)//此处去除了ch12,即P25用于PWM输出。
{
value = TouchKeySelect(ch,CPW_Table);
err = ABS(PowerValue,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;
//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;
//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;//LED熄灭
printf("TEMP %d\n",TEMP);
mDelaymS(time);
}
}
}break;
default: break;
}
}
}
}
</code></pre>
<p><span style="font-size:16px;">四、成果展示</span></p>
<p></p>
<p><span style="font-size:16px;"><iframe allowfullscreen="true" frameborder="0" height="510" src="https://training.eeworld.com.cn/shareOpenCourseAPI?isauto=true&lessonid=21101" style="background:#eee;margin-bottom:10px;" width="100%"></iframe></span><br />
<span style="font-size:16px;">五、总结及改进</span></p>
<p><span style="font-size:16px;"> 这次制作算是对CH549的一次简单的综合应用,不过确实太简单了点。原计划是使用CH554T并且也画了PCB,因为旧灯架没了也就暂时放下而利用了CH549EVT进行。</span></p>
<p><span style="font-size:16px;"> 这次用了两颗LED还是不错的,但没有均光罩投射出的光会产生重影,没有实际应用价值,用于台灯照明这是必须改进的。制作中利用了三个触摸按键,一个用于增加PWM;一个用于减少PWM;另外一只用于开、关LED电源,考虑到是临时实验验证就把开关的功能省略了,关闭LED采用了将PWM占空比调整为“0”进行替代;而打开LED直接触摸“增加”、“减少”PWM占空比进行替代。因此准备做如下改进:</span></p>
<p><span style="font-size:16px;">1、使用TSSOP20封装的CH554T作为主控;</span></p>
<p><span style="font-size:16px;">2、增加电源控制电路,即采用一只PMOS及一只NPN型三极管组成电子开关,用以控制LED电源,实现触摸控制其“开”、“关”状态;</span></p>
<p><span style="font-size:16px;">3、将LED灯关闭前的“亮度”,即PWM占空比值保存至片内的FLASH_ROM,在下一次LED打开时再将其读出并写入PWM占空比设置寄存器,实现亮度记忆功能;</span></p>
<p><span style="font-size:16px;">4、考虑将LED亮度设置为亮-中亮-暗三档;</span></p>
<p><span style="font-size:16px;">5、将LED供电电源更换为9V/1A;</span></p>
<p><span style="font-size:16px;"> 通过这一段时间的学习,虽然对沁恒电子的CH549微控制器有了一定的认知,但还停留在比较肤浅的层面,对于陌生的USB更是没有入门,学习的路还很长。</span></p>
<p><br />
<br />
<br />
<b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">lising</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b><br />
</p>
本帖最后由 lising 于 2019-7-28 23:27 编辑
<p>插入的一小段视频没有显示。在这再补充一下,只有13秒。</p>
<p></p>
<p> </p>
<p>支持一下,不错</p>
<p>PT4115这颗老牌驱动LED的IC不错</p>
qwqwqw2088 发表于 2019-7-31 21:26
支持一下,不错
PT4115这颗老牌驱动LED的IC不错
<p>谢谢版主支持!</p>
<p>又发现了一款SOP8的BP1808也不错,准备弄几片试试。</p>
lising 发表于 2019-7-31 21:47
谢谢版主支持!
又发现了一款SOP8的BP1808也不错,准备弄几片试试。
<p>支持国产IC</p>
<p>这家上海的IC公司可以受理样品申请的</p>
qwqwqw2088 发表于 2019-7-31 22:48
支持国产IC
这家上海的IC公司可以受理样品申请的
<p>是国产的IC,上海一家公司的。从这款芯片手册上看性能不错、价格也很便宜,准备顺道买几片试试。</p>
<p>谢谢楼主分享</p>
页:
[1]