This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2633:Captouch 在数字键盘上进行前几次触摸检测后停止检测

Guru**** 2386340 points
Other Parts Discussed in Thread: CAPTIVATE-PHONE, MSP430FR2633
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1022629/msp430fr2633-captouch-stops-detecting-after-first-few-touch-detection-on-numeric-keypad

器件型号:MSP430FR2633
主题中讨论的其他器件:CAPTIVATE-PHONE

您好!

      我将 MSP430FR2633 TSSOP 封装控制器用于触摸板的16元件键盘传感器。 我将互电容技术用于此目的。 我遵循 了 CAPTIVATE-PHONE 的硬件布局设计。  虽然我能够检测到键盘上的手指触摸、但我观察到、在频繁触摸键盘元件时、突然停止了触摸检测。 但是、在等待几秒钟后、它会开始检测。 我还观察到、当我将手指放在键盘元件附近时、它会每次检测到触摸。 仅当与键盘元件直接接触时、触摸检测才会停止。 键盘元件上没有覆盖材料。 请帮助。 以下是我通过设计中心工具生成的 captouch 配置。

/* --COPYRIGHT--,BSD
 * Copyright (c) 2017, Texas Instruments Incorporated
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * --/COPYRIGHT--*/


// Generated by Captivate Design Center v1_83_00_08 on Wed Jul 28 17:23:59 IST 2021


//*****************************************************************************
// CAPT_UserConfig.c
//
// \version 1.83.00.05
// Released on May 15, 2020
//
//*****************************************************************************

//*****************************************************************************
//
// NOTE: This is an automatically generated source code file!  The Captivate
// Design Center generates the User Configuration file automatically based
// upon the sensor layout that was created.
//
// Changes to this file will be OVERWRITTEN if a you select
// "Update Existing Project" under "Generate Source Code" in the Design Center.
//
// To avoid interference with the code generation process, keep ALL application
// code external to this file.
//
//*****************************************************************************

#include "CAPT_UserConfig.h"

//*****************************************************************************
//
//! Captivate Element Definitions
//! All elements in this application are defined below.
//! Each element has 3 components:
//!  1) a raw count array (One index per freq. scanned) (uint16_t)
//!  2) a tuning array (One index per freq. scanned) (tCaptivateElementTuning)
//!  3) a element structure (tElement)
//
//*****************************************************************************
// Sensor: BTN00, Element: E00
uint16_t BTN00_E00_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E00_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E00 =
{
    .ui8TxPin = 3,
    .ui8TxBlock = 1,
    .ui8RxPin = 0,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E00_RawCnts,
    .pTuning = BTN00_E00_Tuning,
};

// Sensor: BTN00, Element: E01
uint16_t BTN00_E01_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E01_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E01 =
{
    .ui8TxPin = 3,
    .ui8TxBlock = 1,
    .ui8RxPin = 1,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E01_RawCnts,
    .pTuning = BTN00_E01_Tuning,
};

// Sensor: BTN00, Element: E02
uint16_t BTN00_E02_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E02_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E02 =
{
    .ui8TxPin = 3,
    .ui8TxBlock = 1,
    .ui8RxPin = 2,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E02_RawCnts,
    .pTuning = BTN00_E02_Tuning,
};

// Sensor: BTN00, Element: E03
uint16_t BTN00_E03_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E03_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E03 =
{
    .ui8TxPin = 3,
    .ui8TxBlock = 1,
    .ui8RxPin = 3,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E03_RawCnts,
    .pTuning = BTN00_E03_Tuning,
};

// Sensor: BTN00, Element: E04
uint16_t BTN00_E04_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E04_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E04 =
{
    .ui8TxPin = 2,
    .ui8TxBlock = 1,
    .ui8RxPin = 0,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E04_RawCnts,
    .pTuning = BTN00_E04_Tuning,
};

// Sensor: BTN00, Element: E05
uint16_t BTN00_E05_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E05_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E05 =
{
    .ui8TxPin = 2,
    .ui8TxBlock = 1,
    .ui8RxPin = 1,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E05_RawCnts,
    .pTuning = BTN00_E05_Tuning,
};

// Sensor: BTN00, Element: E06
uint16_t BTN00_E06_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E06_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E06 =
{
    .ui8TxPin = 2,
    .ui8TxBlock = 1,
    .ui8RxPin = 2,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E06_RawCnts,
    .pTuning = BTN00_E06_Tuning,
};

// Sensor: BTN00, Element: E07
uint16_t BTN00_E07_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E07_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E07 =
{
    .ui8TxPin = 2,
    .ui8TxBlock = 1,
    .ui8RxPin = 3,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E07_RawCnts,
    .pTuning = BTN00_E07_Tuning,
};

// Sensor: BTN00, Element: E08
uint16_t BTN00_E08_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E08_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E08 =
{
    .ui8TxPin = 1,
    .ui8TxBlock = 1,
    .ui8RxPin = 0,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E08_RawCnts,
    .pTuning = BTN00_E08_Tuning,
};

// Sensor: BTN00, Element: E09
uint16_t BTN00_E09_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E09_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E09 =
{
    .ui8TxPin = 1,
    .ui8TxBlock = 1,
    .ui8RxPin = 1,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E09_RawCnts,
    .pTuning = BTN00_E09_Tuning,
};

// Sensor: BTN00, Element: E10
uint16_t BTN00_E10_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E10_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E10 =
{
    .ui8TxPin = 1,
    .ui8TxBlock = 1,
    .ui8RxPin = 2,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E10_RawCnts,
    .pTuning = BTN00_E10_Tuning,
};

// Sensor: BTN00, Element: E11
uint16_t BTN00_E11_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E11_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E11 =
{
    .ui8TxPin = 1,
    .ui8TxBlock = 1,
    .ui8RxPin = 3,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E11_RawCnts,
    .pTuning = BTN00_E11_Tuning,
};

// Sensor: BTN00, Element: E12
uint16_t BTN00_E12_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E12_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E12 =
{
    .ui8TxPin = 0,
    .ui8TxBlock = 1,
    .ui8RxPin = 0,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E12_RawCnts,
    .pTuning = BTN00_E12_Tuning,
};

// Sensor: BTN00, Element: E13
uint16_t BTN00_E13_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E13_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E13 =
{
    .ui8TxPin = 0,
    .ui8TxBlock = 1,
    .ui8RxPin = 1,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E13_RawCnts,
    .pTuning = BTN00_E13_Tuning,
};

// Sensor: BTN00, Element: E14
uint16_t BTN00_E14_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E14_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E14 =
{
    .ui8TxPin = 0,
    .ui8TxBlock = 1,
    .ui8RxPin = 2,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E14_RawCnts,
    .pTuning = BTN00_E14_Tuning,
};

// Sensor: BTN00, Element: E15
uint16_t BTN00_E15_RawCnts[CAPT_MUTUAL_FREQ_CNT];
tCaptivateElementTuning BTN00_E15_Tuning[CAPT_MUTUAL_FREQ_CNT];
tElement BTN00_E15 =
{
    .ui8TxPin = 0,
    .ui8TxBlock = 1,
    .ui8RxPin = 3,
    .ui8RxBlock = 2,
    .ui8TouchThreshold = 10,
    .pRawCount = BTN00_E15_RawCnts,
    .pTuning = BTN00_E15_Tuning,
};


//*****************************************************************************
//
//! Captivate Time Cycle Definitions
//! All time cycles in this application are defined below.  Time cycles are
//! groups of elements that are measured together in parallel in one time slot.
//! Each cycle has 2 components:
//!  1) an element pointer array to the member elements (tElement*)
//!  2) a cycle structure (tCycle)
//
//*****************************************************************************
// Time Cycle: BTN00_C00
tElement* BTN00_C00_Elements[1] =
{
    &BTN00_E00,
};
tCycle BTN00_C00 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C00_Elements,
};

// Time Cycle: BTN00_C01
tElement* BTN00_C01_Elements[1] =
{
    &BTN00_E01,
};
tCycle BTN00_C01 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C01_Elements,
};

// Time Cycle: BTN00_C02
tElement* BTN00_C02_Elements[1] =
{
    &BTN00_E02,
};
tCycle BTN00_C02 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C02_Elements,
};

// Time Cycle: BTN00_C03
tElement* BTN00_C03_Elements[1] =
{
    &BTN00_E03,
};
tCycle BTN00_C03 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C03_Elements,
};

// Time Cycle: BTN00_C04
tElement* BTN00_C04_Elements[1] =
{
    &BTN00_E04,
};
tCycle BTN00_C04 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C04_Elements,
};

// Time Cycle: BTN00_C05
tElement* BTN00_C05_Elements[1] =
{
    &BTN00_E05,
};
tCycle BTN00_C05 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C05_Elements,
};

// Time Cycle: BTN00_C06
tElement* BTN00_C06_Elements[1] =
{
    &BTN00_E06,
};
tCycle BTN00_C06 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C06_Elements,
};

// Time Cycle: BTN00_C07
tElement* BTN00_C07_Elements[1] =
{
    &BTN00_E07,
};
tCycle BTN00_C07 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C07_Elements,
};

// Time Cycle: BTN00_C08
tElement* BTN00_C08_Elements[1] =
{
    &BTN00_E08,
};
tCycle BTN00_C08 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C08_Elements,
};

// Time Cycle: BTN00_C09
tElement* BTN00_C09_Elements[1] =
{
    &BTN00_E09,
};
tCycle BTN00_C09 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C09_Elements,
};

// Time Cycle: BTN00_C10
tElement* BTN00_C10_Elements[1] =
{
    &BTN00_E10,
};
tCycle BTN00_C10 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C10_Elements,
};

// Time Cycle: BTN00_C11
tElement* BTN00_C11_Elements[1] =
{
    &BTN00_E11,
};
tCycle BTN00_C11 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C11_Elements,
};

// Time Cycle: BTN00_C12
tElement* BTN00_C12_Elements[1] =
{
    &BTN00_E12,
};
tCycle BTN00_C12 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C12_Elements,
};

// Time Cycle: BTN00_C13
tElement* BTN00_C13_Elements[1] =
{
    &BTN00_E13,
};
tCycle BTN00_C13 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C13_Elements,
};

// Time Cycle: BTN00_C14
tElement* BTN00_C14_Elements[1] =
{
    &BTN00_E14,
};
tCycle BTN00_C14 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C14_Elements,
};

// Time Cycle: BTN00_C15
tElement* BTN00_C15_Elements[1] =
{
    &BTN00_E15,
};
tCycle BTN00_C15 =
{
    .ui8NrOfElements = 1,
    .pElements = BTN00_C15_Elements,
};


//*****************************************************************************
//
//! Captivate Sensor Definitions
//! All sensors in this application are defined below.  Sensors are
//! groups of time cycles that utilize raw measurement data to create an
//! abstract sensor type, such as a button, slider, wheel, or prox sensor.
//! Each sensor has 3 components:
//!  1) a cycle pointer array to the member time cycles (tCycle*)
//!  2) a sensor-specific parameter structure (tGenericSensorParams)
//!  3) a sensor structure (tSensor)
//
//*****************************************************************************
//Sensor: BTN00
const tCycle* BTN00_Cycles[16] =
{
    &BTN00_C00,
    &BTN00_C01,
    &BTN00_C02,
    &BTN00_C03,
    &BTN00_C04,
    &BTN00_C05,
    &BTN00_C06,
    &BTN00_C07,
    &BTN00_C08,
    &BTN00_C09,
    &BTN00_C10,
    &BTN00_C11,
    &BTN00_C12,
    &BTN00_C13,
    &BTN00_C14,
    &BTN00_C15,
};

tButtonSensorParams BTN00_Params;
tSensor BTN00 =
{
    // Basic Properties
    .TypeOfSensor = eButtonGroup,
    .SensingMethod = eProjected,
    .DirectionOfInterest = eDOIUp,
    .pvCallback = NULL,
    .ui8NrOfCycles = 16,
    .pCycle = BTN00_Cycles,
    .pSensorParams = (tGenericSensorParams*)&BTN00_Params,
    // Conversion Control Parameters
    .ui16ConversionCount = 500,
    .ui16ConversionGain = 100,
    .ui8FreqDiv = 1,
    .ui8ChargeLength = 0,
    .ui8TransferLength = 0,
    .bModEnable = false,
    .ui8BiasControl = 3,
    .bCsDischarge = true,
    .bLpmControl = false,
    .ui8InputSyncControl = 0,
    .bTimerSyncControl = false,
    .bIdleState = true,
    // Tuning  Parameters
    .ui16ProxThreshold = 10,
    .ui16NegativeTouchThreshold = 30,
    .ui16ErrorThreshold = 8191,
    .ui16TimeoutThreshold = 65535,
    .ProxDbThreshold.DbIn = 1,
    .ProxDbThreshold.DbOut = 0,
    .TouchDbThreshold.DbIn = 1,
    .TouchDbThreshold.DbOut = 0,
    .bCountFilterEnable = true,
    .ui8CntBeta = 1,
    .bSensorHalt = false,
    .bPTSensorHalt = true,
    .bPTElementHalt = true,
    .ui8LTABeta = 7,
    .bReCalibrateEnable = true,
};


#if (CAPT_CONDUCTED_NOISE_IMMUNITY_ENABLE==true)
//*****************************************************************************
//
//! \var g_EMCConfig
//! This structure stores the EMC configuration for this application.
//
//*****************************************************************************
const tEMCConfig g_EMCConfig =
{
	// Conversion Style
	.selfModeConversionStyle = CAPT_SELF_MODE_CONVERSION_STYLE,
	.projModeConversionStyle = CAPT_PROJ_MODE_CONVERSION_STYLE,
	
	// Oversampling Style
	.selfModeOversamplingStyle = CAPT_SELF_MODE_OVERSAMPLING_STYLE,
	.projModeOversamplingStyle = CAPT_PROJ_MODE_OVERSAMPLING_STYLE,
	
	// Jitter Filter Enable
	.bJitterFilterEnable = true,
	
	// Noise Thresholds and Calibration Noise Limits
	.ui8NoiseThreshold = CAPT_NOISE_THRESHOLD,
	.ui16CalibrationNoiseLimit = CAPT_CALIBRATION_NOISE_LIMIT,
	.ui8CalibrationTestSampleSize = 8,
		
	// Dynamic Threshold Adjustment Parameters
	.bEnableDynamicThresholdAdjustment = CAPT_DYNAMIC_THRESHOLD_ADJUSTMENT,
	.ui8MaxRelThreshAdj = 76,
	.ui8NoiseLevelFilterEntryThresh = 40,
	.ui8NoiseLevelFilterExitThresh = 0,
	.ui8NoiseLevelFilterDown = 6,
	.ui8NoiseLevelFilterUp = 1,
	.coeffA = _IQ31(0.0065),
	.coeffB = _IQ31(0.050)
};
#endif

//*****************************************************************************
//
//! \var g_pCaptivateSensorArray
//! This array allows for indexed access to any
//! sensor in the configuration.
//
//*****************************************************************************
tSensor* g_pCaptivateSensorArray[CAPT_SENSOR_COUNT] =
{
    &BTN00,
};


//*****************************************************************************
//
//! \var g_uiApp
//! This structure stores the global settings for this application.
//
//*****************************************************************************
tCaptivateApplication g_uiApp =
{
    .state = eUIActive,
	.pSensorList = &g_pCaptivateSensorArray[0],
    .ui8NrOfSensors = CAPT_SENSOR_COUNT,
    .ui8AppLPM = CAPT_LOW_POWER_MODE,
    .bElementDataTxEnable = true,
    .bSensorDataTxEnable = true,
    .ui16ActiveModeScanPeriod = 33,
    .ui16WakeOnProxModeScanPeriod = 100,
    .ui16InactivityTimeout = 32,
    .ui8WakeupInterval = 5,
};

谢谢、此致、

Omkar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Omkar、

    由于该器件在靠近时工作正常、问题仅在于直接连接、因此直接触控可能会使电极短路。 添加叠加元件将阻止电路直接接触短路。

    此致、

    Luke