利用CAP1298实现多通道精密电容触控设计



概述



        CAP1298 是集成了 RightTouch@ 技术的多通道电客式触摸传感器。包含多个独立的灵敏度可编程的电容式触摸传感器输入,适用于各种触摸传感器应用。每个传感器输入都经过校准以补偿系统寄生电容,并可自动重新校准以补偿微小的环境变化。
        CAP1298 可配置为检测一个或多个通道上的接近信号,同时可选的信号保护可降低噪声灵敏度并将接近检测天线与附近的导电表面《会使电场发生衰诚) 隔离。
        CAP1298 包括多重模式触换识别,允许用户选择一组特定的可同时触换的按钮。组合状态允许使用传感器输入控制的组合,在此状态下可将一个或多个传感器输入用作按钮,而将其他传感器输入用作接近检测器。

方案特点

  • 电容触摸开机自动校准
  • 电容触摸在高灵敏度的情况下,还能保证有汗渍、水滴不误触
  • 轻触、按住不放功能
  • 深度休眠为最低功耗状态,仅消耗5uA(典型值)的电流。低功耗模式,设备轻触启动
  • 弹簧式触摸感应,非常方便安装,外壳要求非常低,量产及其方便
  • 触摸部分和控制部分分开,使用CAN网络连接,易于扩展串口、I2C、SPI及其他接口
  • 一个触摸模块远程控制多个执行模块

原理图


原理图下载:

测试效果(视频截图及下载)




视频下载:

应用层代码:

#include "system.h"

uint8_t CAP_sensorDeltas[NUMBER_OF_SENSORS];
uint8_t TouchKeyNum = 0;
UINT8 PowerKeyCount = 0;
UINT16 PowerKeyTimerOut = 0;

void App_CAP1298Task(void)
{
// uint8_t stateMask = 0;
uint8_t i = 0;

if(gSysStateFlag.bits.b_CAP1298InitFlag == 0)
{
CAP_init();
if(CAP_error == CAP_I2C_error_None)
{
gSysStateFlag.bits.b_CAP1298InitFlag = 1;
}
}
else
{
//if(gSysStateFlag.bits.b_CAP1298Flag == 1)
//{
//-----------------------------------------
// Read the current state mask value
//-----------------------------------------
TouchKeyNum = CAP_getSensorStatus();
if (CAP_error)
{
DebugUart_Printf(DEBUG_CAP1298Info,"CAP_getSensorStatus error = 0x%2x",CAP_error);
}
if (TouchKeyNum)
{
CAP_resetSensorStatus();
//DebugUart_Printf(DEBUG_CAP1298Info,"TouchKeyNum = 0x%2x\r\n",TouchKeyNum);
}

// -----------------------------------------
// Read all sensor values
// -----------------------------------------
CAP_getSensorDeltas(CAP_sensorDeltas);
if (CAP_error)
{
DebugUart_Printf(DEBUG_CAP1298Info,"CAP_getSensorDeltas error = 0x%2x",CAP_error);
}

DebugUart_Printf(DEBUG_CAP1298Info,"CAP_getSensorDeltas:");
for (i = 0; i < NUMBER_OF_SENSORS; i++)
{
DebugUart_Printf(DEBUG_CAP1298Info,"0x%2x ",CAP_sensorDeltas[i]);
}
//DebugUart_Printf(DEBUG_CAP1298Info,"\r\n");
//}

if(gSysStateFlag.bits.b_KeyChangeFlag == 1)
{
gSysStateFlag.bits.b_KeyChangeFlag = 0;
if(SystemKeyValue == 0x01)
{
if(SystemKeyStatus == 1)//按下
{
LED1_R();
PowerKeyCount ++;
PowerKeyTimerOut = 1000;//1s
DebugUart_Printf(1,"PowerKeyCount:%d\r\n",PowerKeyCount);
if(PowerKeyCount == 2)
{//powerkey按键点击两次
PowerKeyTimerOut = 0;
PowerKeyCount = 0;
if(gSysStateFlag.bits.b_PowerStateFlag == 1)
{
LEDPowerOFF();
}
else
{
LEDPowerON();
}
}
BEEP_ON();
}
else
{
if(gSysStateFlag.bits.b_PowerStateFlag == 1)
{
LED1_W();
}
else
{
LED1_OFF();
}
}
}

if(gSysStateFlag.bits.b_PowerStateFlag == 1)
{
if(SystemKeyValue == 0x02)
{
DebugUart_Printf(1,"Key2:%d\r\n",SystemKeyStatus);
if(SystemKeyStatus == 1)//按下
{
LED2_R();
gD0_0x392.bits.b_key2 = 1;
BEEP_ON();
}
else
{
LED2_W();
gD0_0x392.bits.b_key2 = 0;
}
}
else if(SystemKeyValue == 0x04)
{
DebugUart_Printf(1,"Key3:%d\r\n",SystemKeyStatus);
if(SystemKeyStatus == 1)//按下
{
LED3_R();
gD0_0x392.bits.b_key3 = 1;
BEEP_ON();
}
else
{
LED3_W();
gD0_0x392.bits.b_key3 = 0;
}
}
else if(SystemKeyValue == 0x08)
{
DebugUart_Printf(1,"Key4:%d\r\n",SystemKeyStatus);
if(SystemKeyStatus == 1)//按下
{
LED4_R();
gD0_0x392.bits.b_key4 = 1;
BEEP_ON();
}
else
{
LED4_W();
gD0_0x392.bits.b_key4 = 0;
}
}
else if(SystemKeyValue == 0x20)
{
DebugUart_Printf(1,"Key5:%d\r\n",SystemKeyStatus);
if(SystemKeyStatus == 1)//按下
{
LED5_R();
gD0_0x392.bits.b_key5 = 1;
BEEP_ON();
}
else
{
LED5_W();
gD0_0x392.bits.b_key5 = 0;
}
}
else if(SystemKeyValue == 0x80)
{
DebugUart_Printf(1,"Key6:%d\r\n",SystemKeyStatus);
if(SystemKeyStatus == 1)//按下
{
LED6_R();
gD0_0x392.bits.b_key6 = 1;
BEEP_ON();
}
else
{
LED6_W();
gD0_0x392.bits.b_key6 = 0;
}
}
else if(SystemKeyValue == 0x40)
{
DebugUart_Printf(1,"Key7:%d\r\n",SystemKeyStatus);
if(SystemKeyStatus == 1)//按下
{
LED7_R();
gD0_0x392.bits.b_key7 = 1;
BEEP_ON();
}
else
{
LED7_W();
gD0_0x392.bits.b_key7 = 0;
}
}
}
}
}
}



修订历史

2023-12-12 ​Rev0:初始版本


©2023 Jeefun, Inc. All rights reserved. Trademarks and registered trademarks are the property of their respective owners.

Sign in to leave a comment