英飞凌无线充电组电量显示之花式点灯
<p>英飞凌无线充电组电量显示灯板之花式点灯</p><p> </p>
<p></p>
<p>模拟充电效果</p>
<p> </p>
<p>无线充电组的朋友们你们好,众所周知,无线充电组要求制作LED灯板来实时显示超级电容组的电量,LED灯的驱动芯片必须采用英飞凌的LED驱动芯片,这个规则相信参赛同学们都非常清楚了。所以今年英飞凌在为大赛提供芯片支持时,不仅仅提供了单片机的免费申请和特价购买,还提供了LED驱动芯片的免费样片,免费LED驱动芯片申请包含了四种型号:TLD2132-1EP、TLD2331-3EP、TLD2131-3EP、TLD1114-1EP,并委托逐飞科技作为英飞凌LED驱动芯片的发放方。</p>
<p> </p>
<p></p>
<p>逐飞长征号灯板</p>
<p> </p>
<p>同时作为英飞凌智能车竞赛的官方合作伙伴,英飞凌委托逐飞科技为大家提供一个LED驱动芯片的开源应用方案,所以在今年1月14日的英飞凌-逐飞联合直播后就开源了一版“<a data-itemshowtype="0" data-linktype="2" hasload="1" href="http://mp.weixin.qq.com/s?__biz=MzAxMjQxNjEyMw==&mid=2247487838&idx=1&sn=68bdc787a525d42ca66465e913161832&chksm=9bb3744aacc4fd5cf9663f3042c4100c23f2b2e00ea18451f2cbbc5657152d709ffa7b6e17d7&scene=21#wechat_redirect" imgdata="null" imgurl="" linktype="text" tab="innerlink" target="_blank" textvalue="逐飞无线充电组演示车模浅析及LED电量显示方案开源" wah-hotarea="click"><strong>逐飞无线充电组演示车模浅析及LED电量显示方案开源</strong></a>”,但那次的灯板比较呆板,只能说有个简单功能吧,作为点灯工程师的我们,肯定不服啊,总想着能玩出点花样来才肯罢手,当然更重要的是想传递一下组委会的用意,其实今年增加的这个灯板要求本来也是希望能在大赛中提倡美学设计,起因是受到去年无线充电信标组的一支队伍,卓老师发现其不仅成绩好,小车也做的非常美观精致,不论是结构还是电路板设计都非常富有美感,于是就有了今年无线充电组的灯板设计要求,希望能看到更多漂亮的设计,于是今天抛砖引玉,再来分享一个进阶版的点灯:“英飞凌无线充电组电量显示灯板之花式点灯”。</p>
<p> </p>
<p></p>
<p>逐飞长征号灯板背面</p>
<p> </p>
<p>一、TLD2331-3EP芯片介绍</p>
<p>1.1、芯片简述</p>
<p>首先还是先简要介绍今天灯板方案中用到的英飞凌LED驱动芯片,TLD2331-3EP是一颗集成了三通道LED控制芯片,每个通道的最大电流可达80mA,输出电流可设定,简单来说就是可以作为一个恒流源来驱动LED灯。其引脚分布图如下:</p>
<p> </p>
<p> </p>
<p> </p>
<p>通过查阅芯片手册可以查找到芯片各引脚对应的功能:</p>
<p>1.引脚2、3、4分别为三路输入的控制端口,连接单片机端口。</p>
<p>2.引脚13、12、11为三路输出端口,连接到LED灯。</p>
<p>3.引脚8、10为电源接口,其中10脚接电源、8脚接地。</p>
<p>4.引脚9为使能引脚,需要接高电平有效。</p>
<p>5.引脚1、5、6、7为特殊功能引脚,本次点灯方案并为用到,接地即可;引脚14为报错信号,本次方案也未使用。</p>
<p> </p>
<p>1.2、芯片特性</p>
<p>TLD2331-3EP芯片的一些主要特性如下:</p>
<p>1.恒流输出,可作为一个低成本的电流源使用,保证LED灯的亮度</p>
<p>2.支持3通道同时控制,每个通道最大电流达80mA</p>
<p>3.支持睡眠模式,睡眠模式下的功耗极低</p>
<p>4.拥有故障保护和过载保护</p>
<p>5.工作温度范围极宽,可在-40℃到150℃下稳定工作</p>
<p> </p>
<p>二、硬件电路分析</p>
<p>灯板的硬件电路部分已经在之前的无线充电组方案浅析的文章中有提到,不知道各位同学有没有注意到呢?下面我们还是简单的分析一下电路的主要结构。</p>
<p> </p>
<p>主要的驱动芯片为TLD2331-3EP,我们分别接上了输入、输出和电源信号,而其他暂时没有用到的功能则按照手册就行了接地或者悬空,输出部分共有15颗LED灯,意在通过一个LED灯就表示有1V电压来应用到我们的无线充电组的电源显示方案中,而TLD2331-3EP芯片是三通道输出的,那么想一颗芯片控制15颗灯就需要额外增加开关控制,将控制范围从一维切换到二维。</p>
<p>此时我们就得到了一个类似于矩阵的电路,而这样的电路相信大家并不陌生。假设我们现在想点亮L1A这个灯,我们需要将A这个引脚设置为高电平,把Q1这个MOS管打开使得L1A这个灯的负极与地连接,B、C、D、E应该设置为低电平,然后我们将L1设置为低电平,L2、L3设置为高电平,这样就只有L1A被点亮了。点亮其他的灯就不一一列举了,相信大家已经理解了如何点亮LED灯,下面我们从程序入手,开始掌握点灯技巧。</p>
<p> </p>
<p></p>
<p> </p>
<p>三、花式点灯</p>
<p>3.1、点亮一个LED</p>
<p>点亮任意一颗LED灯我们仅需要改变两个端口的状态即可,那么程序部分也极为简单,可以在初始化的时候直接让对应端口输出高低电平就可以让那颗灯点亮,也可以在程序中更改。</p>
<p>下面是基于TC264控制灯板的单个点灯示例程序,大家可以参考学习。</p>
<p> </p>
<p>//初始化LED端口</p>
<p>void led_init(void)</p>
<p>{</p>
<p> gpio_init(L1, GPO,0, PUSHPULL); //初始化L1端口</p>
<p> gpio_init(L2, GPO,1, PUSHPULL); //初始化L2端口</p>
<p> gpio_init(L3, GPO,1, PUSHPULL); //初始化L3端口</p>
<p> </p>
<p> gpio_init(LA, GPO,1, PUSHPULL); //初始化LA端口</p>
<p> gpio_init(LB, GPO,0, PUSHPULL); //初始化LB端口</p>
<p> gpio_init(LC, GPO,0, PUSHPULL); //初始化LC端口</p>
<p> gpio_init(LD, GPO,0, PUSHPULL); //初始化LD端口</p>
<p> gpio_init(LE, GPO,0, PUSHPULL); //初始化LE端口</p>
<p>}</p>
<p>//设置LED端口状态</p>
<p>void led1_lighten(void)</p>
<p>{</p>
<p> gpio_set(L1,0);</p>
<p> gpio_set(L2,1);</p>
<p> gpio_set(L3,1);</p>
<p> </p>
<p> gpio_set(LA,1);</p>
<p> gpio_set(LB,0);</p>
<p> gpio_set(LC,0);</p>
<p> gpio_set(LD,0);</p>
<p> gpio_set(LE,0);</p>
<p>}</p>
<p> </p>
<p></p>
<p>往返拖尾流水灯效果<br />
</p>
<p>3.2、扫描点灯</p>
<p>前面的点亮单颗LED确实非常简单,而我们如果想点亮任意的多个LED灯那就需要进行扫描点灯了,而扫描点灯的例程以及思路早在之前的<strong>“逐飞无线充电组演示车模浅析及LED电量显示方案开源”</strong>的文章中也有提到,下面再带同学们复习一遍。</p>
<p>扫描的方式就是让每个灯点亮一会儿,由于视觉暂留所以就看起来有多个灯同时点亮的效果。这里需要特别注意的两个地方,第一在点亮其他灯之前务必要先将所有灯关闭,否则会出现一些不应该点亮的灯被点亮的情况。第二在扫描的时候要保证每个灯点亮的时间长度是一样的,否则会出现亮度不一致的问题。</p>
<p>下面是基于TC264控制灯板的扫描点灯示例程序,大家可以参考学习。</p>
<p> </p>
<p>#define L1 P21_5</p>
<p>#define L2 P21_4</p>
<p>#define L3 P21_3</p>
<p> </p>
<p>#define LA P21_2</p>
<p>#define LB P33_6</p>
<p>#define LC P33_7</p>
<p>#define LD P00_9</p>
<p>#define LE P02_8</p>
<p> </p>
<p>// **************************** 宏定义 ****************************</p>
<p> </p>
<p>// **************************** 变量定义 ****************************</p>
<p>uint8 temp=0,temp1=0; //计算变量</p>
<p>uint8 num=0; //刷新计次</p>
<p>float supply_voltage=0; //模拟电源电压</p>
<p>// **************************** 变量定义 ****************************</p>
<p> </p>
<p>int core0_main(void)</p>
<p>{</p>
<p> get_clk();//获取时钟频率 务必保留</p>
<p> //用户在此处调用各种初始化函数等</p>
<p> </p>
<p> //初始化LED控制引脚</p>
<p> gpio_init(L1, GPO,1, PUSHPULL);</p>
<p> gpio_init(L2, GPO,1, PUSHPULL);</p>
<p> gpio_init(L3, GPO,1, PUSHPULL);</p>
<p> gpio_init(LA, GPO,0, PUSHPULL);</p>
<p> gpio_init(LB, GPO,0, PUSHPULL);</p>
<p> gpio_init(LC, GPO,0, PUSHPULL);</p>
<p> gpio_init(LD, GPO,0, PUSHPULL);</p>
<p> gpio_init(LE, GPO,0, PUSHPULL);</p>
<p> </p>
<p> //等待所有核心初始化完毕</p>
<p> IfxCpu_emitEvent(&g_cpuSyncEvent);</p>
<p> IfxCpu_waitEvent(&g_cpuSyncEvent,0xFFFF);</p>
<p> enableInterrupts();</p>
<p> while(TRUE)</p>
<p> {</p>
<p> temp=(uint8)supply_voltage; //获取电源电压</p>
<p> num++; //刷新计次</p>
<p> if(num>14) num=0;</p>
<p> //关闭所有LED显示</p>
<p> gpio_set(L1,1);</p>
<p> gpio_set(L2,1);</p>
<p> gpio_set(L3,1);</p>
<p> systick_delay_us(STM0,1);</p>
<p> gpio_set(LA,0);</p>
<p> gpio_set(LB,0);</p>
<p> gpio_set(LC,0);</p>
<p> gpio_set(LD,0);</p>
<p> gpio_set(LE,0);</p>
<p> </p>
<p> if(num < temp) //点亮需要点亮的LED灯</p>
<p> {</p>
<p> temp1 = num/3;</p>
<p> switch(temp1){ //打开行</p>
<p> case0: gpio_set(LA,1);break;</p>
<p> case1: gpio_set(LB,1);break;</p>
<p> case2: gpio_set(LC,1);break;</p>
<p> case3: gpio_set(LD,1);break;</p>
<p> case4: gpio_set(LE,1);break;</p>
<p> default:break;</p>
<p> }</p>
<p> temp1 = num%3;</p>
<p> switch(temp1){ //打开列</p>
<p> case0: gpio_set(L1,0);break;</p>
<p> case1: gpio_set(L2,0);break;</p>
<p> case2: gpio_set(L3,0);break;</p>
<p> default:break;</p>
<p> }</p>
<p> }</p>
<p> </p>
<p> systick_delay_ms(STM0,1); //延时1ms 也可以把上面的语句放进1ms的周期中断中</p>
<p> supply_voltage+=0.002; //模拟充电</p>
<p> if(supply_voltage>15) supply_voltage=1;</p>
<p> </p>
<p> }</p>
<p>}</p>
<p> </p>
<p></p>
<p>拖尾流水灯效果</p>
<p> </p>
<p>3.3、花式点灯</p>
<p>细心的同学可能已经发现了,前面的点灯都是通过修改端口状态来让灯亮起或者熄灭,那么我们是否可以通过PWM信号来让灯产生不同亮度的光呢?答案是肯定能的。因此我们可以通过使用PWM来进行花式点灯,所以在进行初始化时也需要将一侧的控制端口初始化为PWM输出模式,具体代码如下:</p>
<p> </p>
<p>void led_init(void)</p>
<p>{</p>
<p> gtm_pwm_init(L1,150000,0); //初始化L1端口</p>
<p> gtm_pwm_init(L2,150000,0); //初始化L2端口</p>
<p> gtm_pwm_init(L3,150000,0); //初始化L3端口</p>
<p> </p>
<p> gpio_init(LA, GPO,0, PUSHPULL); //初始化LA端口</p>
<p> gpio_init(LB, GPO,0, PUSHPULL); //初始化LB端口</p>
<p> gpio_init(LC, GPO,0, PUSHPULL); //初始化LC端口</p>
<p> gpio_init(LD, GPO,0, PUSHPULL); //初始化LD端口</p>
<p> gpio_init(LE, GPO,0, PUSHPULL); //初始化LE端口</p>
<p>}</p>
<p> </p>
<p></p>
<p>潮汐流水灯效果</p>
<p> </p>
<p>而且我们在花式点灯的时候,也需要控制15颗灯,所以显示逻辑部分依旧使用的是扫描点灯的方式,同时为了能让显示更加稳定,还需要通过使用定时器中断的方式来执行显示部分,同时我们仅需要将列显示部分更换为占空比设置即可,以下为显示部分代码:</p>
<p> </p>
<p>uint8 num=0; //刷新计次</p>
<p>IFX_INTERRUPT(cc60_pit_ch1_isr,0, CCU6_0_CH1_ISR_PRIORITY)</p>
<p>{</p>
<p> enableInterrupts();//开启中断嵌套</p>
<p> PIT_CLEAR_FLAG(CCU6_0, PIT_CH1);</p>
<p> uint8 temp;</p>
<p> num++; //刷新计次</p>
<p> if(num>15)</p>
<p> {</p>
<p> num=0;</p>
<p> }</p>
<p> //关闭所有LED显示</p>
<p> pwm_duty(L1,10000);</p>
<p> pwm_duty(L2,10000);</p>
<p> pwm_duty(L3,10000);</p>
<p> systick_delay_us(STM0,1);</p>
<p> gpio_set(LA,0);</p>
<p> gpio_set(LB,0);</p>
<p> gpio_set(LC,0);</p>
<p> gpio_set(LD,0);</p>
<p> gpio_set(LE,0);</p>
<p> if(num <16) //点亮需要点亮的LED灯</p>
<p> {</p>
<p> </p>
<p> temp = num/3;</p>
<p> switch(temp){ //打开行</p>
<p> case0: gpio_set(LA,1);break;</p>
<p> case1: gpio_set(LB,1);break;</p>
<p> case2: gpio_set(LC,1);break;</p>
<p> case3: gpio_set(LD,1);break;</p>
<p> case4: gpio_set(LE,1);break;</p>
<p> default:break;</p>
<p> }</p>
<p> temp = num%3;</p>
<p> switch(temp){ //打开列</p>
<p> case0: pwm_duty(L1, animation);break;</p>
<p> case1: pwm_duty(L2, animation);break;</p>
<p> case2: pwm_duty(L3, animation);break;</p>
<p> default:break;</p>
<p> }</p>
<p> }</p>
<p>}</p>
<p> </p>
<p></p>
<p>呼吸灯效果</p>
<p> </p>
<p>此时,占空比设置的具体值就关乎着灯的亮度了,而因为我们使用数组控制占空比的值,所以当我们对数组的内容进行移位的时候,此时就相当于让灯也动起来了,下面举个简单的例子,数组内容我们先设置以下初值:</p>
<p> </p>
<p>{0000,3000,5000,7000,10000,7000,5000,3000,0000,3000,5000,7000,10000,7000,5000,3000}</p>
<p> </p>
<p>按照TLD2331-3EP的控制原理,当输入控制端拉低则点亮,因此我们设置的占空比越低,灯也就越亮,所以如果按照以上占空比初值显示出来的话,就应该是一个波浪的效果,如下图所示:</p>
<p></p>
<p>静态效果</p>
<p> </p>
<p>在这个基础上,我们加入一个让数组移位的循环算法,则可以让这个“波浪”动起来!</p>
<p> </p>
<p>temp = animation;</p>
<p> for(int i=1;i<16;i++)</p>
<p> {</p>
<p> animation=animation;</p>
<p> }</p>
<p> animation= temp; </p>
<p> </p>
<p></p>
<p><strong>动态波浪效果</strong></p>
<p> </p>
<p>在完成了动效显示之后,大家应该就可以举一反三的写出自己喜欢的点灯效果了,下面也通过视频的方式给大家看看逐飞点灯工程师写的几个效果:</p>
<p> </p>
<section><input aria-hidden="true" title="显示工具栏" type="checkbox" wah-hotarea="click" /></section>
<p> </p>
<section><strong>具体的花式点灯代码将放在我们的Gitee开源仓库。</strong></section>
<section><strong>链接:</strong><strong>https://gitee.com/seekfree/Infineon_TLD2331_3EP</strong></section>
<section><strong>有兴趣的同学可以下载查阅,也期待大家更多亮眼的设计!</strong></section>
<p> </p>
<p></p>
<p>无线充电组双电源供电接线示意图</p>
<p> </p>
<p> </p>
页:
[1]