请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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