打印
[PIC®/AVR®/dsPIC®产品]

PIC24FJ128GB106——触摸按键实现

[复制链接]
18292|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 JackTang1994 于 2021-10-11 09:22 编辑

#申请原创# #技术资源#

参考手册:
CTMU使用说明:https://ww1.microchip.com/downloads/en/DeviceDoc/Charge%20Time%20Measurement%20Unit%20CTMU%20DS-39724b.pdf
PIC24F128G106手册:https://www.microchip.com/content/dam/mchp/documents/OTH/ProductDocuments/DataSheets/39897c.pdf

测试工程: Touch_Demo.X.zip (66.84 KB)

下载手册打开Microchip官网www.microchip.com,在搜索栏中输入芯片型号点击Download Data Sheet即可下载相应的芯片手册。


触摸原理:通过CTMU测量接在AD引脚上的电容值来判断是否按了触摸按键,当人接触到触摸按键时电容值会变化而这个变化值是一定范围内的。所以我们只需要检测这个引脚上电容值的变化量就能判断是否触摸了。
手册阅读
在使用芯片之前,我们需要了解芯片是否满足我们的要求。这时我们需要查看芯片手册开始部分的芯片功能介绍章节,来了解芯片有哪些功能。
比如:我们需要使用的触摸,我们从芯片手册功能介绍部分获知,触摸功能的实现就是CTMU Interface所以后面我们就直接可以找到CTMU章节进行详细了解此功能如何使用。


PIC24F128GB106手册中第25章,我们可以看出此手册中没有关于CTMU更加详细的介绍及使用了。根据此章节的开头部分说明,我们需要参考PIC24F Family Reference Manual”手册的CTMU章节来获取更加详细的使用说明。


打开Microchip官网,在上面搜索关键字PIC24F并找到CTMU

其他用户手册获取网址:
https://www.microchip.com/doclisting/TechDoc.aspx?productfamily=16-BIT&type=referencemanuals

阅读下载的Section 11. CTMU手册
CTMU框图
测量电容的话,主要是用到了框图中的电流源、以及ADC接口及功能。


测量电容
查看手册的第11.6章节,从手册中我们可以知道:第二种是相对方法,其中不需要实际电容,而是需要电容变化的指示,这个就能满足我们的要求。而如果采用第一种绝对方法,是需要计算出电容的实际值的(需要特定的电流、电路中的寄生电容也需要考虑。这些单片机是通过校准来完成的)。


计算公式:
当充电电流确定,充电时间确定。我们只需要测量到充电电压,通过公式即可以算出电容值。而充电电压在大小可以通过ADC来采样得到。补充说明:充电电流MCU采用了恒流源来实现,而充电时间采用了精确延时(即控制电流源开关时间)。这样我们就只需要ADC测量到电压值就可以计算出电容大小了。因为充电电流和充电时间都是已知的(我们自己设置的)。


使用官方的代码
继续查看手册,发现手册中已经给出的触摸开关的示例代码。这样就大大减少了我们学习难度与成本,我们可以先使用示例代码实现功能,这样我们能触摸开关就有一个整体的认识。后面再进行深入点的学习就不会迷茫了。

先简单查看下引脚相关设置是否满足这个开发板的接线。此代码中使用了RB2引脚作为ADC通道2的输入引脚,而我们开发板上也RB2正好作为了触摸接口之一。


下载程序,用手触摸金属板上的1、2、3、4区域,发现没有反应。后面再查看代码检查寄存器是否配置好了,因为官方的代码只是给特定的型号所写的代码不一定正好适用我目前使用的这款芯片——PIC24F128GB106


问题查找及确认
查看手册
从官方代码中我们依次查看所用到寄存器并在PIC24FJ256GB110 FAMILY手册(就是PIC24F128GB106手册)中搜索。找到AD1PCFG不同,在PIC24F128GB106芯片中没有此寄存器。取而代之的是AD1PCFGL、AD1PCFGH寄存器。

跳转到寄存器描述页发现如果需要将RB2引脚设置为ADC功能,那么相应的寄存器位是需要置0的。而这个与官方示例代码中的不一样,所以我们修改官方例程。

将AD1PCFGL =0x0004; 修改为AD1PCFGL &= (~(1 << 2));

编译代码,再下载测试
后面发现触摸1、2、3、4还是不亮。猜想是不是触摸板有问题,后面把触摸板拔下来尝试用手指去碰触引脚,发现当手指碰到2、3排针处时LED0会亮。这就说明此时MCU检测到的电容变化表示有人触摸了。为了确定到底是哪个引脚产生的电容变化,我改为了金属针来代替手指逐个触碰排针引脚最终确定是2号排针产生的触摸信号。通过检测代码以及触摸接口图发现,此代码中我只使用的RB2连接2号排针,同时RB2引脚为AN2即ADC的第2个通道引脚。所以最终确定是确实时代码实现了电容变化检测从而实现了触摸功能,而不是外部信号干扰引起的。
触摸接口图:

代码设置:
 TRISB = 0x0004; // Set channel 2 as an input
    AD1PCFGL &= (~(1 << 2));// Set RB2 to AD pin
    AD1CHS=0x002; // Select the analog channel(2)
测试效果
触摸RB2引脚,此时LED0会亮


不触摸RB2,此时LED0熄灭



触摸板结构猜想
通过万用表来测量已经可以大概知道触摸区域之间连线了。再结合电容是由两个绝缘的极板组成大概就可以猜测出此触摸板的PCB结构图了。如下图所示:灰色的矩形表示金属板,实际金属板与PCB板之间加入了绝缘材料并压实。这样金属板与4个触摸铜皮之间形成了电容,当人体触摸金属板所对应的触摸按钮铜皮区域时就会使形成的电容发生变化,这个变化通过ADC采样再计算得到电容值或者电容变化量。

PCB布局图如下,4个触摸按钮(铜皮)通过打孔从底层


结论
通过万用表测量确认,触摸板电路没有问题。之所以触摸金属板上按键区域无法产生触摸信号,是因为程序中给出的电容触摸与不触摸的参数值与实际的不一样,即实际触摸产生的参数值不在代码中计算的区间内。接下来就是调整参数以实现通过触摸按钮产生相应的电容变化进而被代码测量出来,最后实现真正的触摸体验!






使用特权

评论回复
沙发
guijial511| | 2021-10-11 07:38 | 只看该作者
这个最大支持几通道输入

使用特权

评论回复
板凳
JackTang1994|  楼主 | 2021-10-11 09:18 | 只看该作者
guijial511 发表于 2021-10-11 07:38
这个最大支持几通道输入

就是AD的输入通道数量:16个

使用特权

评论回复
地板
邹姆斯特朗| | 2021-11-5 15:44 | 只看该作者
好详细的帖子,模范了属于是

使用特权

评论回复
5
豌豆爹| | 2021-11-23 09:11 | 只看该作者
支持几个通道了

使用特权

评论回复
6
pzsh| | 2022-1-1 20:29 | 只看该作者
电容式触摸

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

62

帖子

0

粉丝