nRF51822电容触摸按键

nRF51822电容触摸按键

电容按键相对于普通按键寿命更长、更易操作,本实验利用nRF51822实现电容按键。

使用电容充电时间来检测有没有按下。

正常情况下,覆铜区域没有被触摸时与PCB间有一定的杂散电容,当手触摸到覆铜区域时,手与覆铜区域间将形成新的电容,导致充电时间变长。

原理图如下:

t_key_1

 

PCB:

12

按键扫描基本流程:
1、引脚设置为输出,并输出低电平,将杂散电容中的电压放干净。
2、引脚设置为浮空输入,开始计数并等待IO上升沿。
3、当引脚变为高电平时,停止计数,得到充电时间。
4、判断充电时间是否超过阈值。

首先初始化nRF引脚:

int16_t Touch_Key_A=0;
int16_t Touch_Key_B=0;
 
void touch_key_init(void)
{
  nrf_gpio_range_cfg_output(15,16);
  nrf_gpio_pin_clear(15);
  nrf_gpio_pin_clear(16);
}

将引脚初始化为输出,并输出低电平。

计算电容充电时间:

void key_count(void)
{
  uint8_t A_OK=0,B_OK=0;
  uint16_t Count=0;
  nrf_gpio_range_cfg_output(15,16);
  nrf_gpio_pin_clear(15);
  nrf_gpio_pin_clear(16);//首先设置为输出 并输出低电平 把杂散电容中的电放干净
  delay_ms(5);
  nrf_gpio_range_cfg_input(15,16,GPIO_PIN_CNF_PULL_Disabled);//设置为浮空输入
  while(1)//等待两个按键变为高电平,即产生上升沿
  {
    if(nrf_gpio_pin_read(15)==1 && A_OK ==0)
    {
      Touch_Key_A=Count;//记录下Count的值,这就是充电花费的时间
      A_OK=1;
    }
    if(nrf_gpio_pin_read(16)==1 && B_OK ==0)
    {
      Touch_Key_B=Count;
      B_OK =1;
    }
    if( A_OK && B_OK)
    {
      break;
    }
    Count++;
  }
}

获得到充电时间后,判断按键是否被按下:

uint8_t key_get(void)
{
  int16_t Count_A=0,Count_B=0;
  uint8_t i;
 
  for(i=0;i<3;i++)//取3次做平均值,提高稳定性 { key_count(); Count_A+=Touch_Key_A; Count_B+=Touch_Key_B; } Count_A=Count_A/3; Count_B=Count_B/3; if(Count_A>80)//80为按下的阈值  在本PCB上,未按下时Count大约为10左右,按下在100-140左右
    return 1;
  if(Count_B>80)
    return 2;
  return 0;
}

按键扫描函数:

uint8_t key_scan(uint8_t while_up)
{
  uint8_t key_back;
  key_back=key_get();
  if(key_back!=0)
  {
    if(key_back==key_get())
    {
      if(while_up)
        while(key_get());
      return key_back;
    }
  }
  return 0;
}
赞赏

Mfweb

文章作者

Time waits for no one.

发表回复

textsms
account_circle
email

nRF51822电容触摸按键
电容按键相对于普通按键寿命更长、更易操作,本实验利用nRF51822实现电容按键。 使用电容充电时间来检测有没有按下。 正常情况下,覆铜区域没有被触摸时与PCB间有一定的杂散电容,…
扫描二维码继续阅读
2015-06-28