[活动专区] 【赛元95F】之七:TK_LED_PWM 触摸按键LED显示PWM调光

[复制链接]
 楼主| lisingch 发表于 2020-4-9 20:09 | 显示全部楼层 |阅读模式
      本次的制作与前面的《TK_LCD_TIMER触摸按键LCD显示倒计时器》基本相似(https://bbs.21ic.com/icview-2939300-1-1.html),无非就是将LCD显示改成了LED数码管;定时器产生时基计时改成了可调占空比的PWM。当时报名参加活动时申请了这两个项目,主要原因在于对赛元MCU功能强大、性能优异的触控按键模块以及LCD/LED驱动模块的钟情。
      本次制作原计划是使用赛元SC95F8617的高灵敏度触控电路设计三个隔空触控按键,利用其中两个按键分别设置12位PWM输出波的占空比“加”与“减”,用于对LED灯光亮度进行“增强”与“减弱”的控制;另一个隔空触控按键则用于LED灯的“打开”与“关闭”。与此同时利用赛元SC95F8617的LCD/LED驱动器模块驱动两位LED数码管(0.39或0.56),用于实时显示LED灯光亮度级别。之后一直考虑使用两位LED数码管显示实时占空比意义好像不大,因为占空比1%的增减引起的光亮度变化肉眼几乎感觉不到。于是就考虑改成采用一位LED数码管,用来显示“0”~“9”。“0”表示灯关闭;“1”~“9”表示灯光亮度由弱及强,这样可能会比之前的方案更加实用。在实施准备阶段一直苦于没有找到合适的台灯受体,再加上前面“倒计时器”项目触控按键的调试经验,在本次实验中就没有专门制作PCB,只是利用本次学习的DEMO板与其它模块搭了临时电路进行了可行性验证。
      实验依然使用了SC95F8617片上的31路触摸按键中的三路(TK24、TK25、TK26)做为触摸按键,其中的两路按键(TK24、TK26)用于调整PWM占空比用以改变灯光亮度,另外一路按键(TK25)用于开启/关闭灯光。当关闭灯光二次开启后灯光亮度为上一次关闭灯光时的灯光亮度等级。数码管显示灯光亮度等级,共分为十级,从“1~9”表示灯光亮度由弱至强,“0”表示灯光关闭。
      下面是本次实验的简单描述,程序代码同样参考移植了赛元官方提供的DEMO。文末附件里有完整工程,有兴趣的朋友可以查看、交流。
一、LED数码管驱动
2020-04-08_125652.png

      实验中用的数码管是之前自制的一个4位共阴数码管,LED数码管的驱动与LCD驱动相似,只有寄存器的个别位设置上存在着细微差别。硬件连接上数码管的COM0~COM3分别连至P37~P33;SEGa~SEGdp分别连至P20~P27,即MCU的LED驱动部分的资源分配为“S0~S27为segment,C4~C7为common”。相对于LED的显示RAM配置:
2020-04-08_125819.png

这里还有一点需要注意,“电路设计时应避免将芯片的CLK和DIO连到同一个数码管上”。如:
2020-04-09_181510.png

      LED数码管驱动的具体配置可参阅上一篇拙文,在此就不赘述了。这里有一点疑问,寄存器“IOHCON0”、“IOHCON1”没有找到具体的作用说明,以为可以调整LED数码管的亮度,实际测试时“IOH 等级0(最大)”与“IOH 等级3(最小)”对于LED数码管的亮度没有看到明显的变化;
2020-04-09_182510.png

下面是LED数码显示的测试照片:
IMG20200409174612.jpg

二、触摸按键调试
      触摸弹簧键是从废电磁炉里拆的,直接焊在了洞洞板上并加了一个三孔排针座用于与DEMO板连接。
IMG20200409190647.jpg
IMG20200409190637.jpg

      说到赛元的这套触控库,只能说是真的很好用。洞洞板随意的摆弄一次成功,“S_TouchKeyCFG.h”文件只经历了一次代换。具体的调试过程与上一篇相同,简单、快捷、好用!

三、LED发光二极管
      这是一个自制的RGB三色共阳LED,个头够大。实验中只使用了其中的蓝色,通过杜邦线连接至P50端口;
IMG20200409192019.jpg

四、PWM
      前面有过单独的实验,也不多介绍了。与之前实验不同的是由于LED低电平有效,为使其亮度与数码管显示的级别相对应将PWM输出进行了“反向”处理。PWM波占空比预置了10档,分别为0%、5%、12.5%、25%、37.5%、50%、62.5%、75%、87.5%、100%并与数码管显示“0”~“9”相对应,为此专门建了个数组,在触摸按键处理程序中进行调用。
  1. //预置占空比参数:0%,5%,12.5%,25%,37.5%,50%,62.5%,75%,87.5%,100%
  2. unsigned int PWM_Duyt_Data[] = {0x00,0x20,0x50,0xA0,0xF0,0x140,0x190,0x1E0,0x230,0x280};
  1. void PWM_Num(unsigned int num)//改变占空比
  2. {
  3.         PWMRD_50 = 0xc000;//ENP50=1 P50作为PWM波形输出口;INV50=1 P50 PWM波形输出反向
  4.         PWMRD_50 |= num;
  5. }
  1. //触摸按键处理
  2. void TK_Process(void)
  3. {
  4.         static signed char Set_PWM_Duty = 0;        //设置PWM占空比
  5.         static unsigned char Set_PWM_Duty_Temp = 0;        //PWM占空比数据暂存
  6.        
  7.         Led_Display(Set_PWM_Duty);
  8.        
  9.         PWM_Num(PWM_Duyt_Data[Set_PWM_Duty]);

  10.         switch(exKeyValue)
  11.         {
  12.                 case 1: if(key_dec)
  13.                                                 {
  14.                                                         Set_PWM_Duty--;
  15.                                                         if(Set_PWM_Duty <= 0)
  16.                                                         {
  17.                                                                 Set_PWM_Duty = 0;
  18.                                                         }
  19.                                                         Set_PWM_Duty_Temp = Set_PWM_Duty;       
  20.                                                         key_dec = 0;
  21.                                                 }                                       
  22.                                                 break;                        
  23.                                                
  24.                 case 2: if(key_Start_Stop)  
  25.                                                 {
  26.                                                         key_Start_Stop = 0;
  27.                                                         key_Start_Stop_Flag = ~key_Start_Stop_Flag;
  28.                                                         Set_PWM_Duty = 0;
  29.                                                 }       
  30.                                                 if(key_Start_Stop_Flag)
  31.                                                         Set_PWM_Duty = Set_PWM_Duty_Temp;
  32.                                                 break;       
  33.                                                
  34.                 case 3: if(key_inc)
  35.                                                 {
  36.                                                         Set_PWM_Duty++;
  37.                                                         if(Set_PWM_Duty >= 9)
  38.                                                         {
  39.                                                                 Set_PWM_Duty = 9;
  40.                                                         }
  41.                                                         Set_PWM_Duty_Temp = Set_PWM_Duty;
  42.                                                         key_inc = 0;
  43.                                                 }break;
  44.                                                                                                                        
  45.                 default: break;
  46.         }       
  47. }

五、成果
IMG20200404172704.jpg

六、总结
      本次制作只能是个半成品,准备找个合适的小台灯架,制作一个锂电池供电LED数码管显示的触摸调光灯,MCU考虑换一片赛元低引脚的其它芯片,SC95F8617用到这太可惜了,应该给他派个更大的活儿。
      通过本次的小制作对赛元TK及LCD/LED模块有了更深入的了解,尤其是对TK的易用性、灵活性、稳定性更是难以忘怀。

七、附件
      本制作的工程文件及演示视频,有兴趣的朋友可以查看、交流。
_TK_LED_PWM.rar (95.79 KB, 下载次数: 66)
演示.part1.rar (39.05 MB, 下载次数: 65)
演示.part2.rar (39.04 MB, 下载次数: 45)


qwe123zxc 发表于 2020-4-9 22:43 来自手机 | 显示全部楼层
太感动了,程序都有,版主的两部作品都把程序公开,
 楼主| lisingch 发表于 2020-4-9 22:54 | 显示全部楼层
qwe123zxc 发表于 2020-4-9 22:43
太感动了,程序都有,版主的两部作品都把程序公开,

感谢给我升职,从“楼主”升“版主”了
开个玩笑,谢谢支持!公开的代码其实都是赛元提供的,我只是组合了一下,方便朋友们交流。
Spring1380 发表于 2020-4-13 11:51 | 显示全部楼层
学习!!!!!!!!!!!!!!!!
 楼主| lisingch 发表于 2020-4-13 12:19 | 显示全部楼层
Spring1380 发表于 2020-4-13 11:51
学习!!!!!!!!!!!!!!!!

相互学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15005

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部