20.电容触摸按键实验
扫描二维码
随时随地手机看文章
一。 电容触摸按键原理
1. RC 充放电电路原理
Cx电压从0开始充电,一直到V1。
如果达到同样的电压值,如果电容越大,那么达到的时间越长。
手指按下后,电容值为Cs+Cx,电容变大,充电时间变长,通过判断充电时间长短来判断TPAD是否被按下。
2. 电容触摸按键在PCB板上怎么画
首先,人体是具有一定电容的。当我们把PCB上的铜画成如下形式的时候,就完成了一个最基本的触摸感应按键。
上图左边,是一个基本的触摸按键,中间圆形绿色的为铜(我们可以称之为“按键”),在这些按键中会引出一根导线与MCU相连,MCU通过这些导线来检测是否有按键“按下”(检测的方法多种多样,这将在后面章节中谈到);外围的绿色也是铜,不过外围的这些铜是与GND大地相连的。在“按键”和外围的铜之间是空隙(我们可以称为空隙d)。上图右边是左图的截面图,当没有手指接触时,只有一个电容Cp ,当有手指接触时,“按键”通过手指就形成了电容Cf 。由于两个电容是并联的。
下图更简单的说明了上述原理
材料:PCB铜箔
形状:原则上可以做成任意形状,中间可留孔或镂空。我们推荐做成边缘圆滑的形状,如圆形或六角形,可以避免尖端放电效应 。
大小:最小4mmX4mm, 最大30mmX30mm,有的建议不要大于15mmX15mm,太大的话,外界的干扰相
应的也会增加。
底板覆铜:在电路板底层覆铜是很有必要的,这些接地的覆铜能够最大限度的降低触摸按键的噪声以及外部环境对触摸按键的影响。
推荐采用50%--70%的网格覆铜。
灵敏度:一般的感应按键面积大小和灵敏度成正比。一般来说,按键感应盘的直径要大于面板厚度的4倍,
并且增大电极的尺寸,可以提高信噪比。各个感应盘的形状、面积应该相同,以保证灵敏度一致。 灵敏度与外接CIN电容的大小成反比;与面板的厚度成反比;与按键感应盘的大小成正比。
外接 CIN电容的选择:
CIN电容可在0PF~50PF选择。电容越小,灵敏度越高,但是抗干扰能力越差。电容越大,灵敏度越低,但是抗干扰能力越强。通常,我们推荐5PF~20PF。
按键的间距:各个感应盘间的距离要尽可能的大一些(大于5mm),以减少它们形成的电场之间的相互干扰。当用PCB铜箔做感应盘时,若感应盘间距离较近(5MM~10MM),感应盘周围必须用铺地隔离。 如图:各个按键距离比较远,周围空白的都用地线隔开了。但注意地线要与按键保持一定的距离。
触摸按键表面的覆盖物:在许多的应用中,我们需要在触摸按键上添加一些覆盖物,如:塑料等。在这种情况下,人的手指就不能和触摸按键直接接触了。可以画个logo。
布局:
A. CIN电容尽量靠近IC放置,各个通道的CIN电容必须用铺地隔离。感应盘也要尽量靠近IC,这样
感应盘到IC的连线就会最短。
B. 布局时应尽量保证触摸IC到感应盘的距离基本平衡。
走线:
A. 感应盘到触摸芯片的连线尽量短和细,如果PCB工艺允许尽量采用5MIL的线宽
B. 感应盘到触摸IC的连线不要跨越其他信号线。尤其不能跨越强干扰、高频的信号线
C. 感应盘到触摸IC的连线周围0.5MM不要走其他信号线
D. 如果使用哪个PCB板上的铜箔图案做触摸感应盘,尽量使用双面PCB,触摸芯片和感应盘到IC
引脚的连线应放在感应盘铜箔的背面(BOTTOM)。感应盘应紧贴触摸面板。
E. 触摸IC及其相关的外围电路要用45°网格铺地,网格中铜的面积不要超过总面积的40%。连线周
围0.5MM不能铺地。感应盘和铺地至少要有10MM的距离。感应盘正对的背面不允许铺地,也不允许有任何大面积的铜箔和其他信号线。
二。 硬件连接
我们需要通过 TIM5_CH2(PA1)采集 TPAD 的信号,所以本实验需要用跳线帽短接多功能端口(P14)的 TPAD 和 ADC,以实现 TPAD 连接到 PA1。
三。 实验程序
程序设计思路
//定时器 5 通道 2 输入捕获配置
void TIM5_CH2_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM5_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 PA 时钟
//设置 GPIOA.1 为浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 端口配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.1
//初始化 TIM5
TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据参数初始化 TIMx
//初始化 TIM5 通道 2
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择输入端 IC2 映射到 TI5 上
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM5_ICInitStructure.TIM_ICFilter = 0x03;//配置输入滤波器 8 个定时器时钟周期滤波
TIM_ICInit(TIM5, &TIM5_ICInitStructure);//初始化 I5 IC2
TIM_Cmd(TIM5,ENABLE ); //使能定时器 5
}
//得到定时器捕获值
//如果超时,则直接返回定时器的计数值.
u16 TPAD_Get_Val(void)
{
TPAD_Reset();
while(TIM_GetITStatus(TIM5, TIM_IT_CC2)== RESET) //等待溢出,如果一直捕获不到上升沿,直接返回计数 值
{
if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)
return TIM_GetCounter(TIM5); //超时了,直接返回 CNT 的值
};
return TIM_GetCapture2(TIM5); //捕获到上升沿后返回捕获值
}