• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【技术盛宴】基于MCU内部资源同时实现——Touch +PWM调光+EEPROM记忆

     许久没来电源网,似乎有些许生分了,尽管如此,但始终默默关注着!

由于今年经历了来深7年后的第二次离职——找工作-——跳槽——适应新环境——接收一堆电源案子的开发——目前正在徘徊中。

趁着这次年尾活动也来凑个份子,热闹热闹。

          此贴属入门贴,咱只管露脸,不管深浅!

名称:触摸无极调光电路(二次电路调光)

所用器件:单片机PIC12F1822/1PCS、  12V恒压电源/一个、12VLED灯负载/一个

应用:调光台灯或壁灯

功能说明:

      1.利用单片机内部资源实现触摸开和关,亮度加减以及当前亮度记忆。

     2.通电后亮度渐变到上次断电后的亮度状态。

    3. 触摸时间小于1S,属于开关模式

    4. 触摸时间大于等于1S,属于亮度加减模式

所以本帖需要讲的就是三个方面:

     1. 利用单片机内部电容传感资源,利用定时器读取、判断触摸与非触摸,给PWM调光提供条件。例如触摸长按或短按

     2. 利用单片机内部PWM模块实现PWM无极调光

     3.利用单片机内部EEPROM实现保存当前亮度

先露露咱开发的超薄30W 12V/24V恒压适配电源,留有一个PWM调光接口,总高度小于13.5MM

电源参数:Ip/100-240V 50/60HZ  PF>0.95 THDi/6.5%@230VAC  EF>0.85  

              OP/24V 1.25A/12V2.5A 

简易应用接线示意图

   

电路原理图

全部回复(47)
正序查看
倒序查看
2015-12-25 14:35
欢迎回归  请继续~~
0
回复
daihui713
LV.6
3
2015-12-25 15:58

以上是理想的接线方式,真实环境是这样的……

拼凑接线方式

0
回复
daihui713
LV.6
4
2015-12-25 17:13

   1.采用PIC12F1822单片机, 8M/16M以及PLL*4=32M内置时钟 可供选择

   2. 四通道电容传感寄存器设置

   3. 一路10位PWM CCP寄存器

   4. 内置256字节 EEPROM寄存器

 附件是Microhip官方给出的触摸学习资料,供大家下载  

PIC12F1822 中文Datesheet.pdf

电容触摸传感简介.pdf

电容触摸传感布板和物理设计指南.pdf

电容触摸传感软件处理.pdf

0
回复
daihui713
LV.6
5
2015-12-25 17:36
@daihui713
  1.采用PIC12F1822单片机,8M/16M以及PLL*4=32M内置时钟可供选择  2.四通道电容传感寄存器设置  3.一路10位PWMCCP寄存器  4.内置256字节EEPROM寄存器 附件是Microhip官方给出的触摸学习资料,供大家下载  [图片]PIC12F1822中文Datesheet.pdf电容触摸传感简介.pdf电容触摸传感布板和物理设计指南.pdf电容触摸传感软件处理.pdf

实现Touch判断,软件流程图如下:

0
回复
2015-12-28 10:06
好帖子标记下,推荐上头条喽~
0
回复
2015-12-28 10:28
戴工的新帖终于来了,赞一个!~~
0
回复
2015-12-29 08:56
@daihui713
  1.采用PIC12F1822单片机,8M/16M以及PLL*4=32M内置时钟可供选择  2.四通道电容传感寄存器设置  3.一路10位PWMCCP寄存器  4.内置256字节EEPROM寄存器 附件是Microhip官方给出的触摸学习资料,供大家下载  [图片]PIC12F1822中文Datesheet.pdf电容触摸传感简介.pdf电容触摸传感布板和物理设计指南.pdf电容触摸传感软件处理.pdf
学习了,支持!!!!
0
回复
daihui713
LV.6
9
2015-12-29 12:46
@电源网-fqd
好帖子标记下,推荐上头条喽~
多谢!  重在参与
0
回复
daihui713
LV.6
10
2015-12-29 12:50
@电源网-娜娜姐
戴工的新帖终于来了,赞一个!~~
多谢,娜娜。  以后你应该多找些单片机的大咖来发发贴,  知识点会更全面些。 
0
回复
daihui713
LV.6
11
2015-12-29 13:22
@daihui713
实现Touch判断,软件流程图如下:[图片]

以往我们都是直接利用市面上固化好的专用触摸IC来作为按键输入对接单片机。 然而这触摸的原理——这个黑匣子我们始终不得而知

所以在这里,我就简易的说说PIC这款单片机IO口作为触摸输入引脚的黑匣子原理:

1.当IO口作为触摸引脚时,一旦当人体触摸焊盘时,由于人体自身电容引起的振荡打破了原有的充放电的常态,与内部基准做比较,引起了频率的漂移。

  准确是引起频率变低。

  

如下图:C2OUT就是比较后的输出————这个可以作为TIME1计数的时钟来源

*

2.  C2OUT比较后的输出作为TIME1计数的时钟来源,然后再用一个定时器,如TIME0设定一个固定时基来时时读取TIME1中TIME1H和TIME1L 的计数值

*

3. 每抓取一次,就和上一次没有触摸时所求的平均值来做比较,这样就可以判断当前是否有触摸

  if(当前值<上一次没有触摸时的平均值) , 已触摸。else ,无触摸  

      

  

0
回复
daihui713
LV.6
12
2015-12-30 12:52
@daihui713
以往我们都是直接利用市面上固化好的专用触摸IC来作为按键输入对接单片机。然而这触摸的原理——这个黑匣子我们始终不得而知所以在这里,我就简易的说说PIC这款单片机IO口作为触摸输入引脚的黑匣子原理:1.当IO口作为触摸引脚时,一旦当人体触摸焊盘时,由于人体自身电容引起的振荡打破了原有的充放电的常态,与内部基准做比较,引起了频率的漂移。 准确是引起频率变低。  如下图:C2OUT就是比较后的输出————这个可以作为TIME1计数的时钟来源[图片]*2. C2OUT比较后的输出作为TIME1计数的时钟来源,然后再用一个定时器,如TIME0设定一个固定时基来时时读取TIME1中TIME1H和TIME1L的计数值*3.每抓取一次,就和上一次没有触摸时所求的平均值来做比较,这样就可以判断当前是否有触摸 if(当前值

针对TOUCH判断的函数需要在中断里面完成,而中断的时间就是你设定的扫描时基:

1. 对于中断, 你可以采用定时器最常用的溢出中断,也可以采用定时器门控中断,一般PIC单片机都会有定时器1的门控中断

   本文采用的就是利用定时器0做时基,作为定时器1计数器的门控条件————简单来说就定时器0时间一到,就进入定时器1中断,然后在定时器1里面

   读取触摸变化频率计数值, 然后做触摸判断

  定时器初始化如下:

   void timer_init()                    //定时器0 定时1初始化

  {

        OPTION_REG=0X82;       //8分频比

        TMR0=0X06;                   //1ms 时基     TMR1大概计数500,电容振荡频率500KHZ   

        T1CON=0XC5;        //预分频1:1 使能TMR1  时钟源为TMR1计数

        TMR1L=0;

        TMR1H=0;

        T1GCON=0XE1;    //翻转模式 TMR0溢出门控

        TMR1GIF=0;           //门控中断标志位

        TMR1GIE=1;

        PEIE=1;             //开外设中断

       GIE=1;              //开总中断

  }

2. 触摸判断函数需要在中断内完成

  2.1 触摸判断函数尽量要简单,不能有其他任务执行函数,以免影响触摸判断无效

  2.2 对于判断方法可以参考——PIC附件文档(触摸传感软件处理)里面有介绍三种方式:

       1. 直接判断法

      2. 百分比判断法

      3. 百分比选择法

      

   而然本文采用第一种改良后的方法——————读值直接判断法+百分比判决水平

          if (当前值) < (上次松手后刷新的平均值— 触摸判决固定值)   ————————则 已触摸

      else 没有触摸

           

     触摸判决固定值——————可以设为上次松手后刷新的平均值)百分之多少,这个作为你触摸的条件

    实例如下:

    

      value=(uint)(TMR1H<<8)+TMR1L;             //读取当前值

        if(value<(uint)(avg[index]*90/100))        //如果有触摸

             button1=1;                                    //标志位置1

        else if(value>((uint)(avg[index]*90/100)+20))         //否则无触摸

        {

                 button1=0;

                 if (AvgIndex<2)AvgIndex++;           //慢慢更新平均值 

                else AvgIndex=0;

                if (AvgIndex==2)

                    avg[index]=(uint)((value+avg[index]*15)/16);              //16位 加权 求平均值

         }

    

           

0
回复
haik
LV.4
13
2015-12-30 13:15
@daihui713
多谢,娜娜。 以后你应该多找些单片机的大咖来发发贴, 知识点会更全面些。 
好活動項一下
0
回复
yang81
LV.2
14
2015-12-30 17:13
不错
0
回复
xulihua668
LV.1
15
2015-12-31 10:10
0
回复
peter_yu
LV.5
16
2016-01-10 21:52
@xulihua668
[图片]
高手啊,谢谢分享!
0
回复
杜十娘
LV.2
17
2016-01-14 13:59

不错哟

0
回复
pietyknight
LV.5
18
2016-02-12 15:25
楼主太强大了!
0
回复
newriver
LV.1
19
2016-02-14 12:17
DINGDING
0
回复
tt98650207
LV.1
20
2016-02-14 17:20
呵呵,来看看热闹!
0
回复
1150270716
LV.2
21
2016-02-15 09:43
学习学习
0
回复
2016-02-15 10:08
参观学习,向首长致敬。
0
回复
skymxh
LV.2
23
2016-02-16 14:31
看看
0
回复
miar
LV.1
24
2016-02-16 14:53
回帖拿经验,顺便问一句国产的MCU带触摸功能的高手有没有用过呢!
0
回复
2016-02-21 18:09
学习
0
回复
zs0619
LV.1
26
2016-02-22 16:05
不错 看一下回复
0
回复
kan850929
LV.2
27
2016-02-23 09:09

很好的案例

0
回复
ennuo
LV.1
28
2016-02-23 12:25
快快快快快快快快
0
回复
zhck
LV.3
29
2016-02-24 15:00
看看学习
0
回复
luck_gfb
LV.7
30
2016-02-25 08:45
0
回复
2016-02-25 09:11
回复学习 
0
回复