lising 发表于 2019-7-28 23:20

【沁恒试用】九、LED触摸调光灯

<p><span style="font-size:16px;">&nbsp; &nbsp; &nbsp; &nbsp;家里原来有个用了很多年的台灯,灯管配不上就闲置了。这次本打算利用这个旧灯架改制一个LED触摸调光台灯,结果半个月前老婆收拾房间当废品丢弃了,起因是家里有了一个小米LED台灯。改制台灯的事已经想了很久,材料也准备了,不过这只是个半成品,算是给自己个安慰。</span></p>

<p><span style="font-size:16px;">一、简介</span></p>

<p><span style="font-size:16px;">&nbsp; &nbsp; &nbsp; &nbsp;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;">&nbsp; &nbsp; &nbsp; &nbsp;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;">&nbsp; &nbsp; &nbsp; &nbsp;手上还有一种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;">&nbsp; &nbsp; &nbsp; &nbsp;为方便调试使用了成品电源,第一次选用了一只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;">&nbsp; &nbsp; &nbsp; &nbsp;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;">&nbsp; &nbsp; &nbsp; &nbsp;因为有了前期的一些测试实验,在加之本次制作比较简单,再就是沁恒电子还提供了大量的例程,所以程序在整体实现的过程就比较简单了,不过按键处理函数写的太糟糕。下面是主要代码:</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 &gt; DOWM_THRESHOLD_VALUE)   //差值大于阈值,认为按下
                                        {
                                                if((Press_Flag &amp; (1&lt;&lt;ch)) == 0)//说明是第一次按下
                                                {
                                                        //printf("ch %d pressed,value:%d\n",(UINT16)ch, value);
                                                        /* 点灯处理 */
                                                        LED_Control(ch-8,1);
                                                }
                                                Press_Flag |= (1&lt;&lt;ch);
                                        }
                                        else if(err &lt; UP_THRESHOLD_VALUE)//说明抬起或者未按下
                                        {
                                                if(Press_Flag &amp; (1&lt;&lt;ch))         //刚抬起
                                                {
                                                        Press_Flag &amp;= ~(1&lt;&lt;ch);
                                                        //printf("ch %d up,value:%d\n",(UINT16)ch, value);
                                                        /* 灭灯处理 */
                                                        LED_Control(ch-8,0);
                                               
                                                        TEMP ++;
                                                        if(TEMP &gt;= 5)
                                                                TEMP = 5;
                                                        PWM_DATA0 = PWM_CODE;
                                                        //PWM_TEMP = PWM_DATA0;
                                                        printf("TEMP %d\n",TEMP);
                                                        mDelaymS(time);
                                                }
                                        }
                                }break;
                                                                       
                                case 9:
                                {
                                        if(err &gt; DOWM_THRESHOLD_VALUE)   //差值大于阈值,认为按下
                                        {
                                                if((Press_Flag &amp; (1&lt;&lt;ch)) == 0)//说明是第一次按下
                                                {
                                                        //printf("ch %d pressed,value:%d\n",(UINT16)ch, value);
                                                        /* 点灯处理 */
                                                        LED_Control(ch-8,1);
                                                }
                                                Press_Flag |= (1&lt;&lt;ch);
                                        }
                                        else if(err &lt; UP_THRESHOLD_VALUE)//说明抬起或者未按下
                                        {
                                                if(Press_Flag &amp; (1&lt;&lt;ch))         //刚抬起
                                                {
                                                        Press_Flag &amp;= ~(1&lt;&lt;ch);
                                                        //printf("ch %d up,value:%d\n",(UINT16)ch, value);
                                                        /* 灭灯处理 */
                                                        LED_Control(ch-8,0);
                                               
                                                        TEMP--;
                                                        if(TEMP &lt;= 0)
                                                                TEMP = 1;
                                                        PWM_DATA0 = PWM_CODE;
                                                        //PWM_TEMP = PWM_DATA0;
                                                        printf("TEMP %d\n",TEMP);
                                                        mDelaymS(time);
                                                }
                                        }
                                }break;
               
                                case 10:
                                {
                                        if(err &gt; DOWM_THRESHOLD_VALUE)   //差值大于阈值,认为按下
                                        {
                                                if((Press_Flag &amp; (1&lt;&lt;ch)) == 0)//说明是第一次按下
                                                {
                                                        //printf("ch %d pressed,value:%d\n",(UINT16)ch, value);
                                                        /* 点灯处理 */
                                                        LED_Control(ch-8,1);
                                                }
                                                Press_Flag |= (1&lt;&lt;ch);
                                        }
                                        else if(err &lt; UP_THRESHOLD_VALUE)//说明抬起或者未按下
                                        {
                                                if(Press_Flag &amp; (1&lt;&lt;ch))         //刚抬起
                                                {
                                                        Press_Flag &amp;= ~(1&lt;&lt;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&amp;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;">&nbsp; &nbsp; &nbsp; &nbsp;这次制作算是对CH549的一次简单的综合应用,不过确实太简单了点。原计划是使用CH554T并且也画了PCB,因为旧灯架没了也就暂时放下而利用了CH549EVT进行。</span></p>

<p><span style="font-size:16px;">&nbsp; &nbsp; &nbsp; &nbsp;这次用了两颗LED还是不错的,但没有均光罩投射出的光会产生重影,没有实际应用价值,用于台灯照明这是必须改进的。制作中利用了三个触摸按键,一个用于增加PWM;一个用于减少PWM;另外一只用于开、关LED电源,考虑到是临时实验验证就把开关的功能省略了,关闭LED采用了将PWM占空比调整为&ldquo;0&rdquo;进行替代;而打开LED直接触摸&ldquo;增加&rdquo;、&ldquo;减少&rdquo;PWM占空比进行替代。因此准备做如下改进:</span></p>

<p><span style="font-size:16px;">1、使用TSSOP20封装的CH554T作为主控;</span></p>

<p><span style="font-size:16px;">2、增加电源控制电路,即采用一只PMOS及一只NPN型三极管组成电子开关,用以控制LED电源,实现触摸控制其&ldquo;开&rdquo;、&ldquo;关&rdquo;状态;</span></p>

<p><span style="font-size:16px;">3、将LED灯关闭前的&ldquo;亮度&rdquo;,即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;">&nbsp; &nbsp; &nbsp; &nbsp;通过这一段时间的学习,虽然对沁恒电子的CH549微控制器有了一定的认知,但还停留在比较肤浅的层面,对于陌生的USB更是没有入门,学习的路还很长。</span></p>

<p><br />
<br />
<br />
<b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">lising</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b><br />
&nbsp;</p>

lising 发表于 2019-7-28 23:24

本帖最后由 lising 于 2019-7-28 23:27 编辑

<p>插入的一小段视频没有显示。在这再补充一下,只有13秒。</p>

<p></p>

<p>&nbsp;</p>

qwqwqw2088 发表于 2019-7-31 21:26

<p>支持一下,不错</p>

<p>PT4115这颗老牌驱动LED的IC不错</p>

lising 发表于 2019-7-31 21:47

qwqwqw2088 发表于 2019-7-31 21:26
支持一下,不错

PT4115这颗老牌驱动LED的IC不错

<p>谢谢版主支持!</p>

<p>又发现了一款SOP8的BP1808也不错,准备弄几片试试。</p>

qwqwqw2088 发表于 2019-7-31 22:48

lising 发表于 2019-7-31 21:47
谢谢版主支持!

又发现了一款SOP8的BP1808也不错,准备弄几片试试。

<p>支持国产IC</p>

<p>这家上海的IC公司可以受理样品申请的</p>

lising 发表于 2019-7-31 23:25

qwqwqw2088 发表于 2019-7-31 22:48
支持国产IC

这家上海的IC公司可以受理样品申请的

<p>是国产的IC,上海一家公司的。从这款芯片手册上看性能不错、价格也很便宜,准备顺道买几片试试。</p>

zxopenljx 发表于 2021-4-25 14:59

<p>谢谢楼主分享</p>
页: [1]
查看完整版本: 【沁恒试用】九、LED触摸调光灯