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: False detection of proximity sensor

Part Number: MSP430FR2633

Hi TI experts,

I have posted before.
My customers are having trouble with the following issue.

They created a custom board using the MSP430FR2633 CapTIvate.
And they are testing it by incorporating it into the product case.

Their hand reacted the proximity sensor.
However, even if they release thier hand, it continue to detect.

Apparently there are parts (or case) and stray capacitance, they continue to be detected.
They are using the timeout feature now, but this problem is fatal.

We used "SensorTimeoutThreshold".
However, according to their specifications, it is difficult to set this value to a short time.

Question:
Are there other effective parameters for this phenomenon?

Proximity sensor settings:
Conversion gain = 100
Conversion count = 1000

Regards,
Rei

  • Hi Rei,

    sorry to hear that.

    Let's try to identify where the problems comes from.

    For me to understand the application and the way it is implemented, I need to ask some questions

    What are the dimensions of the sensor

    What is the material of the case

    Is the PCB (prox electrode) stacked on the enclosure or is there an air gap

    If the enclosure is not used, just the pcb, does the sensor work as intended?

    Do you think the layout of the sensor has been done according to what we recommend?

    The best for me to understand the application is to get a picture of the board with and without the case.

    The Conversion count seems high, but it depends very much on the mechanical setup and the size.

    What is the Prox Threshold?

    Can you send me the UserConfig file

    Please help me understanding the implementation before I can give you recommendation.

     

    Thanks

    Regards

    Kostas

  • Hi Kostas,

    I saw the product before but it was not the recommended layout.
    (Compare to Technology Guide)
    ・Sensor is small
    ・Case is aluminum and acrylic (maybe)
    ・There are air gaps in the electrodes and the enclosure
    ・userconfigfile 

    /* --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_70_00_03 on Fri Jun 21 10:52:16 GMT+09:00 2019
    
    
    //*****************************************************************************
    // CAPT_UserConfig.c
    //
    // \version 1.70.00.03
    // Released on July 30, 2018
    //
    //*****************************************************************************
    
    //*****************************************************************************
    //
    // 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 = 1,
        .ui8TxBlock = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 0,
        .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 = 1,
        .ui8TxBlock = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 1,
        .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 = 1,
        .ui8TxBlock = 0,
        .ui8RxPin = 0,
        .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 = 1,
        .ui8TxBlock = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 3,
        .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 = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 0,
        .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 = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 1,
        .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 = 0,
        .ui8RxPin = 0,
        .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 = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 3,
        .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 = 3,
        .ui8TxBlock = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 0,
        .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 = 3,
        .ui8TxBlock = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 1,
        .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 = 3,
        .ui8TxBlock = 0,
        .ui8RxPin = 0,
        .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 = 3,
        .ui8TxBlock = 0,
        .ui8RxPin = 0,
        .ui8RxBlock = 3,
        .ui8TouchThreshold = 10,
        .pRawCount = BTN00_E11_RawCnts,
        .pTuning = BTN00_E11_Tuning,
    };
    
    // Sensor: PRX00, Element: E00
    uint16_t PRX00_E00_RawCnts[CAPT_SELF_FREQ_CNT];
    tCaptivateElementTuning PRX00_E00_Tuning[CAPT_SELF_FREQ_CNT];
    tElement PRX00_E00 =
    {
        .ui8RxPin = 3,
        .ui8RxBlock = 3,
        .ui8TouchThreshold = 127,
        .pRawCount = PRX00_E00_RawCnts,
        .pTuning = PRX00_E00_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[4] =
    {
        &BTN00_E00,
        &BTN00_E01,
        &BTN00_E02,
        &BTN00_E03,
    };
    tCycle BTN00_C00 =
    {
        .ui8NrOfElements = 4,
        .pElements = BTN00_C00_Elements,
    };
    
    // Time Cycle: BTN00_C01
    tElement* BTN00_C01_Elements[4] =
    {
        &BTN00_E04,
        &BTN00_E05,
        &BTN00_E06,
        &BTN00_E07,
    };
    tCycle BTN00_C01 =
    {
        .ui8NrOfElements = 4,
        .pElements = BTN00_C01_Elements,
    };
    
    // Time Cycle: BTN00_C02
    tElement* BTN00_C02_Elements[4] =
    {
        &BTN00_E08,
        &BTN00_E09,
        &BTN00_E10,
        &BTN00_E11,
    };
    tCycle BTN00_C02 =
    {
        .ui8NrOfElements = 4,
        .pElements = BTN00_C02_Elements,
    };
    
    // Time Cycle: PRX00_C00
    tElement* PRX00_C00_Elements[1] =
    {
        &PRX00_E00,
    };
    tCycle PRX00_C00 =
    {
        .ui8NrOfElements = 1,
        .pElements = PRX00_C00_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[3] =
    {
        &BTN00_C00,
        &BTN00_C01,
        &BTN00_C02,
    };
    
    tButtonSensorParams BTN00_Params;
    tSensor BTN00 =
    {
        // Basic Properties
        .TypeOfSensor = eButtonGroup,
        .SensingMethod = eProjected,
        .DirectionOfInterest = eDOIUp,
        .pvCallback = NULL,
        .ui8NrOfCycles = 3,
        .pCycle = BTN00_Cycles,
        .pSensorParams = (tGenericSensorParams*)&BTN00_Params,
        // Conversion Control Parameters
        .ui16ConversionCount = 400,
        .ui16ConversionGain = 100,
        .ui8FreqDiv = 2,
        .ui8ChargeLength = 1,
        .ui8TransferLength = 1,
        .bModEnable = false,
        .ui8BiasControl = 3,
        .bCsDischarge = true,
        .bLpmControl = false,
        .ui8InputSyncControl = 0,
        .bTimerSyncControl = false,
        .bIdleState = true,
        // Tuning  Parameters
        .ui16ProxThreshold = 60,
        .ui16NegativeTouchThreshold = 40,
        .ui16ErrorThreshold = 3000,
        .ui16TimeoutThreshold = 1980,
        .ProxDbThreshold.DbIn = 1,
        .ProxDbThreshold.DbOut = 1,
        .TouchDbThreshold.DbIn = 1,
        .TouchDbThreshold.DbOut = 0,
        .bCountFilterEnable = true,
        .ui8CntBeta = 1,
        .bSensorHalt = false,
        .bPTSensorHalt = true,
        .bPTElementHalt = true,
        .ui8LTABeta = 7,
        .bReCalibrateEnable = false,
    };
    
    //Sensor: PRX00
    const tCycle* PRX00_Cycles[1] =
    {
        &PRX00_C00,
    };
    
    tProxSensorParams PRX00_Params =
    {
        .pSensor = NULL,
        .ui8NumberOfSensors = 0,
    };
    
    tSensor PRX00 =
    {
        // Basic Properties
        .TypeOfSensor = eProx,
        .SensingMethod = eSelf,
        .DirectionOfInterest = eDOIDown,
        .pvCallback = NULL,
        .ui8NrOfCycles = 1,
        .pCycle = PRX00_Cycles,
        .pSensorParams = (tGenericSensorParams*)&PRX00_Params,
        // Conversion Control Parameters
        .ui16ConversionCount = 1000,
        .ui16ConversionGain = 100,
        .ui8FreqDiv = 2,
        .ui8ChargeLength = 0,
        .ui8TransferLength = 0,
        .bModEnable = true,
        .ui8BiasControl = 3,
        .bCsDischarge = true,
        .bLpmControl = false,
        .ui8InputSyncControl = 0,
        .bTimerSyncControl = false,
        .bIdleState = true,
        // Tuning  Parameters
        .ui16ProxThreshold = 10,
        .ui16NegativeTouchThreshold = 100,
        .ui16ErrorThreshold = 8191,
        .ui16TimeoutThreshold = 9000,
        .ProxDbThreshold.DbIn = 1,
        .ProxDbThreshold.DbOut = 1,
        .TouchDbThreshold.DbIn = 1,
        .TouchDbThreshold.DbOut = 10,
        .bCountFilterEnable = true,
        .ui8CntBeta = 2,
        .bSensorHalt = false,
        .bPTSensorHalt = true,
        .bPTElementHalt = true,
        .ui8LTABeta = 6,
        .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 = eMultiFrequency,
    	.projModeConversionStyle = eMultiFrequencyWithOutlierRemoval,
    	
    	// Oversampling Style
    	.selfModeOversamplingStyle = eNoOversampling,
    	.projModeOversamplingStyle = eNoOversampling,
    	
    	// Jitter Filter Enable
    	.bJitterFilterEnable = true,
    	
    	// Noise Thresholds and Calibration Noise Limits
    	.ui8NoiseThreshold = 20,
    	.ui16CalibrationNoiseLimit = 10,
    	.ui8CalibrationTestSampleSize = 8,
    		
    	// Dynamic Threshold Adjustment Parameters
    	.bEnableDynamicThresholdAdjustment = true,
    	.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,
        &PRX00,
    };
    
    
    //*****************************************************************************
    //
    //! \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 = 32,
        .ui16WakeOnProxModeScanPeriod = 100,
        .ui16InactivityTimeout = -1,
        .ui8WakeupInterval = 7,
    };
    

    I know that the hardware is bad.
    However, design change is difficult.
    Therefore, it is the situation which is trying to supplement with software.

    Regards,
    Rei

  • Hi Rei,

    thanks for the response.

    I understand that the customer will try to avoid any redesign but we need his cooperation. We may not be able to solve everything by SW.

    The reason for my questions is basically to find something to add/modify on the mechanical part and case to get the system stable. For example, by adding a kind of addition filler to avoid air gaps etc..

    Based on your  answer regarding the aluminum case, I still need to know what is the electrode size and how much the electrode couples to the case. This may cause a lot of unpredictable behaviors. Is the case grounded? Is it a battery operated system?

    I will check the settings more in detail. First parameter I have seen is the ProxThreshold=10. Can you please ask the customer to increase that value up to the level where the expected distance can be achieved.

    Can I have a screenshot of the CDC Channel bar Chart and Oscilloscope Plot taps when that occurs.

    Thanks

    Regards

    Kostas

**Attention** This is a public forum