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.

[参考译文] MSP430FR2512:CapTIvate 启动时间

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1060582/msp430fr2512-captivate-startup-time

器件型号:MSP430FR2512

您好!

与 REGISTER_I2C 成功通信后、我遇到了一个新的大问题:启动时间。

    WDTCTL = WDTPW + WDTCNTCL + WDTIS_4;
	BSP_configureMCU();
	__bis_SR_register(GIE);

当函数 bsp_cofiguremcu()需要超过1秒(!)时,此代码不起作用 完成。

    WDTCTL = WDTPW + WDTCNTCL + WDTIS_3;
	BSP_configureMCU();
	__bis_SR_register(GIE);

由于 WDT 复位时间设置为16秒、因此工作正常。

我需要低于200ms 的启动时间、那么理论上这是可行的吗?

此致

Igor

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

    现在我找到了新信息。 启动时的主要问题是 CS_initFLL(),它需要很多时间。 我不知道为什么这个函数需要这么多时间。 您是否有任何缩短此初始化时间的解决方案? 然后、I2C 不需要精确的时钟。

    另一件事是校准、但可以通过更少的转换数来避免这种情况。

    此致

    Igor

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

    您好 Igor、

    您是否使用连接到 LFXT1引脚的32KHz 晶振?  这通常是罪魁祸首。  您可以在 bsp.c 文件中选择内部 REFO 时钟、但请记住、这会在使用 REFO 时增加15uA 的电流。

    在校准方面、您无法避免这种情况、并且您对较低的转换计数是正确的=较短的校准时间。

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

    不、我不使用任何晶体。 代码由设计中心生成、一切正常、只有这种长时间启动才是问题所在。

    如何选择 REFO? 额外电流根本不是问题。

    我完全不熟悉 MSP、这是我的第一个项目。

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

    好的、我找到了它。 我将尝试并报告我的进度。

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

    您好!

    在转换数量较少的情况下、我将启动时间短接到0.8秒、这是可以的。

    在初始启动后、我使用参数包(0x81)将转换计数设置为500。

    之后、我发送参数0x8E 以强制校准。 此校准需要2.6秒

    我还测量启动校准时间 CAPT_AppStart(),转换计数为500需要1.3s。

    为什么强制校准所需的时间是 CAPT_AppStart()的两倍?

    您是否有任何解决方案?

    此致

    Igor

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

    您好 Igor、

    好的、听起来您已经弄清楚了 REFO 时钟。  对于将来可能遇到此帖子的用户、可以在 CAPT_bsp.h 文件中选择 REFO 时钟、如下所示:

    现在、关于校准时间、1.3实际上是很长的。  2.6秒告诉我校准发生了两次。  但您说您正在使用500次转换计数。  这里似乎没有添加任何内容。

    除了转换计数、转换频率也会影响总时间。  使用4MHz 转换时钟与1MHz 转换时钟相比、校准速度快4倍。  但必须注意的是、在更高的时钟频率下、较大的电极电容在每个时钟周期内没有足够的时间进行充电、并会导致测量误差。  您使用的转换频率是多少?

    这里的示例是 BSWP 面板上接近传感器的测量时间。  我将目标转换计数设置为500。  校准过程有2个步骤;校准增益、然后校准偏移。  您可以从测量中看到它所花费的时间小于100ms。

    现在、这只是一个电极、在具有4个测量块的器件上、您最多可以并联校准4个电极。

    您使用的是 FR2512、它只有1个测量块。  因此、如果您有多个电极、每个电极将按顺序进行校准。  因此、如果一个电极的校准需要100ms、那么总时间将大约为400ms。  

    出于好奇、您如何测量校准时间以及您有多少个电极?

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

    尊敬的 Dennis:

    是的、关于 REFO、就像您说的那样。

    我的 STARUP 如下所示:

     端口初始化后的起始点

    2. bsp_configureMCU()结束 -启动 CAPT_AppStart()

    时间1-2:0.21s

    3. CAPT_AppStart()结束-现在触摸板位于 main while (1)中

    转换计数150

    转换增益为100

    时间2-3:0.56s

    4.我发送0x81参数转换计数420的点-正常操作停止

    5.在这里,我的主机 MCU 开始读取触摸按钮

    6.强制校准结束并开始正常操作

    时间4-5:1.27秒

    时间5-6: 1.17秒-这是我的问题、因为主机器件此时不工作(用户必须等待第一次触摸)

    时间4-6:2.47s -强制校准总时间。 如果我在0x81之后仅发送0x81或0x8E、则该时间相同。

    形成点1。 MSP430始终处于通电状态。 使用 P1OUT BIT1进行测量、因此没有错误。

    以下是用户过早按下触摸按钮(第6点之前)时发生的情况-几次按下:

    时间6-7:1.27秒

    8.正常工作

    时间6-8:6.3s -取决于您按下按钮的时间、但这是正常的。

    我认为时间6-7是重校准、但下面仍然是这个重校准为什么比强制校准短两倍的问题?

    感谢你能抽出时间。

    此致

    Igor

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

    Igor、

    您能否向我发送 CAPT_UserConfig.c 和.h 文件的副本?

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

    其中包括:

    #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_SELF_FREQ_CNT];
    tCaptivateElementTuning BTN00_E00_Tuning[CAPT_SELF_FREQ_CNT];
    tElement BTN00_E00 =
    {
        .ui8RxPin = 2,
        .ui8RxBlock = 0,
        .ui8TouchThreshold = 10,
        .pRawCount = BTN00_E00_RawCnts,
        .pTuning = BTN00_E00_Tuning,
    };
    
    // Sensor: BTN00, Element: E01
    uint16_t BTN00_E01_RawCnts[CAPT_SELF_FREQ_CNT];
    tCaptivateElementTuning BTN00_E01_Tuning[CAPT_SELF_FREQ_CNT];
    tElement BTN00_E01 =
    {
        .ui8RxPin = 3,
        .ui8RxBlock = 0,
        .ui8TouchThreshold = 10,
        .pRawCount = BTN00_E01_RawCnts,
        .pTuning = BTN00_E01_Tuning,
    };
    
    // Sensor: BTN00, Element: E02
    uint16_t BTN00_E02_RawCnts[CAPT_SELF_FREQ_CNT];
    tCaptivateElementTuning BTN00_E02_Tuning[CAPT_SELF_FREQ_CNT];
    tElement BTN00_E02 =
    {
        .ui8RxPin = 0,
        .ui8RxBlock = 0,
        .ui8TouchThreshold = 10,
        .pRawCount = BTN00_E02_RawCnts,
        .pTuning = BTN00_E02_Tuning,
    };
    
    // Sensor: BTN00, Element: E03
    uint16_t BTN00_E03_RawCnts[CAPT_SELF_FREQ_CNT];
    tCaptivateElementTuning BTN00_E03_Tuning[CAPT_SELF_FREQ_CNT];
    tElement BTN00_E03 =
    {
        .ui8RxPin = 1,
        .ui8RxBlock = 0,
        .ui8TouchThreshold = 10,
        .pRawCount = BTN00_E03_RawCnts,
        .pTuning = BTN00_E03_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,
    };
    
    
    //*****************************************************************************
    //
    //! 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[4] =
    {
        &BTN00_C00,
        &BTN00_C01,
        &BTN00_C02,
        &BTN00_C03,
    };
    
    tButtonSensorParams BTN00_Params;
    tSensor BTN00 =
    {
        // Basic Properties
        .TypeOfSensor = eButtonGroup,
        .SensingMethod = eSelf,
        .DirectionOfInterest = eDOIDown,
        .pvCallback = NULL,
        .ui8NrOfCycles = 4,
        .pCycle = BTN00_Cycles,
        .pSensorParams = (tGenericSensorParams*)&BTN00_Params,
        // Conversion Control Parameters
        .ui16ConversionCount = 150,
        .ui16ConversionGain = 100,
        .ui8FreqDiv = 2,
        .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 = 10,
        .ui16WakeOnProxModeScanPeriod = 100,
        .ui16InactivityTimeout = 32,
        .ui8WakeupInterval = 5,
    };
    

    #ifndef CAPT_USERCONFIG_H_
    #define CAPT_USERCONFIG_H_
    
    //
    // CapTIvate User Configuration Template Version
    //
    #ifndef __CAPTIVATE_CONFIG_VERSION__
    #define __CAPTIVATE_CONFIG_VERSION__ 18300
    #endif
    
    //
    // Include the CapTIvate Software Library
    //
    #include "captivate.h"
    
    //
    // Compile-Time System Configuration Definitions
    //
    #define CAPT_SENSOR_COUNT                     (1)
    #define CAPT_INTERFACE  (__CAPT_REGISTERI2C_INTERFACE__)
    #define CAPT_WAKEONPROX_ENABLE  (false)
    #define CAPT_WAKEONPROX_SENSOR  (none)
    #define CAPT_TRACKPAD_ENABLE  (false)
    #define CAPT_LOW_POWER_MODE (LPM0_bits)
    
    //
    // Compile-Time Noise Immunity Configuration Definitions
    //
    #define CAPT_CONDUCTED_NOISE_IMMUNITY_ENABLE  (true)
    #define CAPT_SELF_MODE_CONVERSION_STYLE  (eMultiFrequency)
    #define CAPT_PROJ_MODE_CONVERSION_STYLE  (eMultiFrequencyWithOutlierRemoval)
    #define CAPT_SELF_MODE_OVERSAMPLING_STYLE  (e2xOversampling)
    #define CAPT_PROJ_MODE_OVERSAMPLING_STYLE  (eNoOversampling)
    #define CAPT_NOISE_THRESHOLD  (50)
    #define CAPT_CALIBRATION_NOISE_LIMIT  (50)
    #define CAPT_DYNAMIC_THRESHOLD_ADJUSTMENT  (true)
    
    //
    // Captivate Frequency Count Definitions
    // If conducted noise is enabled, multiple
    // frequency scanning is enabled.  These definitions
    // ensure that RAM space is set aside to store
    // frequency specific information.
    //
    #if CAPT_CONDUCTED_NOISE_IMMUNITY_ENABLE
    #define CAPT_SELF_FREQ_CNT        (4)
    #define CAPT_MUTUAL_FREQ_CNT      (4)
    #else
    #define CAPT_SELF_FREQ_CNT        (1)
    #define CAPT_MUTUAL_FREQ_CNT      (1)
    #endif
    
    //*****************************************************************************
    //
    //! \def CAPT_MS_TO_CYCLES is a macro to convert a period value in 
    //! milliseconds to an approximate cycle count based on a 
    //! 32.768 kHz clock frequency.
    //
    //*****************************************************************************
    #define CAPT_MS_TO_CYCLES(ms)                                         (ms * 32)
    
    //*****************************************************************************
    //
    //! \def CAPT_MS_TO_CYCLES_VLO is a macro to convert a period value in
    //! milliseconds to an approximate cycle count based on a
    //! 10 kHz clock frequency.  The VLO oscillator is approximately 10 kHz.
    //
    //*****************************************************************************
    #define CAPT_MS_TO_CYCLES_VLO(ms)                                     (ms * 10)
    
    //
    // Captivate Sensor Prototypes
    // These prototypes enable access to sensors
    // from the application.
    //
    extern tSensor BTN00;
    
    //*****************************************************************************
    //
    //! \var g_EMCConfig
    //! This structure stores the EMC configuration for this application.
    //
    //*****************************************************************************
    extern const tEMCConfig g_EMCConfig;
    
    //*****************************************************************************
    //
    //! \var g_pCaptivateSensorArray
    //! This array allows for indexed access to any
    //! sensor in the configuration.
    //
    //*****************************************************************************
    extern tSensor* g_pCaptivateSensorArray[CAPT_SENSOR_COUNT];
    
    //*****************************************************************************
    //
    //! \var g_uiApp
    //! This structure stores the global settings for this application.
    //
    //*****************************************************************************
    extern tCaptivateApplication g_uiApp;
    
    //*****************************************************************************
    //
    //! Software Library / User Configuration Version Check
    //
    //*****************************************************************************
    #ifndef __CAPTIVATE_LIB_VERSION__
    #warning "CapTIvate library version not found by user configuration."
    #elif __CAPTIVATE_LIB_VERSION__ != __CAPTIVATE_CONFIG_VERSION__
    #warning "CapTIvate software library and user configuration version mismatch."
    #endif
    
    #endif /* CAPT_USERCONFIG_H_ */
    
    


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

    尊敬的 Dennis:

    我发现问题在哪里。

    MSP430首次启动(上电)后、命令0x81所需的时间是正常的两倍。

    我在 P1OUT BIT1上添加了一个短脉冲以获得校准启动:

    void CAPT_calibrateUI(tCaptivateApplication *pApp)
    {
        uint8_t ui8SensorID;
    
        //
        // Loop through all of the sensors in the application pointed to by
        // pApp.  For each sensor, call the appropriate calibration routine via
        // the calibration macro.
        //
        if(P1OUT & BIT1)
        {
            P1OUT &= ~BIT1;
            P1OUT |= BIT1;
        }
        else
        {
            P1OUT |= BIT1;
            P1OUT &= ~BIT1;
        }
        for (ui8SensorID=0; ui8SensorID<pApp->ui8NrOfSensors; ui8SensorID++)
        {
            CAPT_MANAGER_CALIBRATE_SENSOR(pApp->pSensorList[ui8SensorID]);
        }
    }
    

    这是发生正常上电时的图片:

    1.加电

    2、在这里我发送0x81

    3.校准实际开始的点(P1OUT 上的短脉冲)

    时间2-3:1.25秒

    时间3-4:1.25秒

    以下通道是主机 MCU 的 SCL 和 SDA 线。

    第2点更精确:

    下图展示了使用 RESET 命令重新启动主机 MCU 时 MSP430保持通电的情况:

    1.重启主机 MCU

    2.发送0x81

    3.校准开始

    第2点和第3点更精确:

    时间2-3:10ms

    因此、在上电之后、第一个0x81命令 MSP430会进入某个位置(我无法调试此命令) 1.25秒、但肯定不会进行校准。

    您是否有任何解决方案? 现在我有点赶时间了...

    此致

    Igor

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

    您好 Igor、

    现在、我将浏览源代码以查看导致第一个延迟的原因。  我还将设置 HW、以查看是否可以复制。  我看到您的工作时间很短、因此我将尽力快速获得解决方案。

    我还有一个替代校准例程、它将校准时间减少1/3。  默认校准例程使用线性搜索在校准期间完成所有增益和偏移设置。  此备用例程使用二进制搜索树、因此可以显著缩短时间。  我们正在下一个 CapTIvate 版本中发布此替代校准、但我现在将向您提供。  我将在准备时提供有关如何实施的说明。

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

    您好 Igor、

    我使用 FR2633 EVM 和 FR2433 Launchpad 作为主机。  我想指出的是、我将 FR2633配置为一个传感器、其中包含4个元件、其中每个元件都处于自己的测量周期。  这与 FR2512相同、4个元件、4个测量周期。  因此、当执行校准时、每次执行一个周期、因此对于 FR2512、它将需要4个校准周期。 我将使用150作为具有 f/4转换时钟(4MHz)的转换计数。  有效转换速率为2MHz、因为一个充电时钟周期、第二个传输时钟周期。

    我可以让主机发送0x8E。  在这张图中、CH2迹线是正在执行的校准(4个周期为112ms)。  ch3跟踪是从器件在 APP_handler 中检查入站数据包、在这里我要切换 IO 引脚。   通道4、5是 I2C。  您可以看到、每个请求只进行校准。  左侧的第一次校准是器件复位后的第一次校准请求。

    此处的放大显示了接收到0x8E 命令后检查入站数据包和校准后两者之间的关系。  请注意、该命令与从器件检查入站数据包时异步、但在下一次检查时、它会处理该命令并执行校准。  我只能从主机的命令看到一次校准。

    这是 I2C 消息。

    我仍在为您获取更快的校准例程。

    您是否有示波器、或者您的逻辑分析仪是否有模拟通道?  我问、因为我可能让您分别探测四个 CapTIvate 通道、并测量电极执行充电/传输的实际时间。

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

    尊敬的 Dennis:

    感谢您的努力。

    将转换计数更改为700后、我发现此死机时间与校准时间相同。 唯一 的解释是、校准开始两次、但第一次进入点不在:

    void CAPT_calibrateUI(tCaptivateApplication *pApp)
    

    因此、我在 main 中放置一个全局变量、执行一个 simpy 权变措施:

    	CAPT_appStart();
        first_startup = 1;
    
    

    并在 void CAPT_calibrateUI (tCapTIvateApplication *应用程序)中进行检查:

        if(first_startup == 1)
        {
            first_startup = 0;
        }
        else
        {
            for (ui8SensorID=0; ui8SensorID<pApp->ui8NrOfSensors; ui8SensorID++)
            {
                CAPT_MANAGER_CALIBRATE_SENSOR(pApp->pSensorList[ui8SensorID]);
            }
        }
    

    之后、结果为:

    1.加电

    2. 0x81参数

    正常运行、仅在主机 MCU 显示屏幕后20ms、但这不是问题。

    时间2-3:1.35s、转换计数为500。

    读取0x81参数后、MSP43板的转换计数器设置为500。

    因此、问题已经解决、但我们非常希望启动时间更短、以便在加电时能够实现更短的校准时间。 我将等待新版本。

    非常感谢、致以诚挚的问候。

    Igor

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

    您好 Igor、

    随附的 CCS 工程演示了默认校准和更快的 BST (二进制搜索树)并将其进行了比较。  项目所需的两个文件是 CAPT_CALIBRAT_BST.c 和.h  只需将其复制。  此外、zip 文件中还有一个 pdf、描述了您需要对项目进行的更改。  请告诉我它是如何为您工作的。

    e2e.ti.com/.../FR2633_5F00_BST_5F00_calibration_5F00_demo.zip

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

    尊敬的 Dennis:

    这个用于校准的新函数要快得多、但没有解决问题。 校准后,程序跳至 CAPT_updateUI()并在此处进行另一次校准:

            if ((MAP_CAPT_testForMaxCountRecalibration(pApp->pSensorList[ui8SensorID]) == true) ||\
                (MAP_CAPT_testForNegativeTouchRecalibration(pApp->pSensorList[ui8SensorID]) == true) ||\
                (MAP_CAPT_testForRecalibration(pApp->pSensorList[ui8SensorID]) == true))
            {
                CAPT_MANAGER_CALIBRATE_SENSOR(pApp->pSensorList[ui8SensorID]);
    //            CAPT_calibrateSensorSA(pApp->pSensorList[ui8SensorID],false);
            }
    

    如果我在这里放置一个新函数、那么什么都不起作用、程序会不断地出现在这里。

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

    您好 Igor、

    为了帮助隔离问题、通过设置传感器的结构成员.bReCalibrateEnable = false 来禁用自动重新校准。  如果执行此操作、则只能在 POR 处看到初始校准。

    接下来、您需要确定检查上述重校准的这三个函数中的哪一个返回"true"。  简单的方法是修改 if()语句,以便只调用一个函数。  然后尝试这三个函数中的每一个、以确定哪个函数抛出标志。  一旦您确定它是哪个函数、我们就可以专注于原因。

    MAP_CAPT_testForMaxCountCalibration 会检查是否有任何通道超过其最大计数限制。  默认情况下为8191。  如果您尚未更改此参数、则表示通道或传感器元件出现故障。  传感器结构元件为.ui16ErrorThreshold。  检查是否已将其设置为8191

    MAP_CAPT_testForNegativeTouchCalibration 检查测量计数是否与目标方向 DOI 相反。  对于自电容模式、添加电容会导致计数值变低。  相反、如果测量值升高并超过负触摸阈值、则将检测到负触摸并设置重新校准标志。  传感器结构元件为.ui16NegativeTouchThreshold。  检查您是否已将此设置为30。

    MAP_CAPT_testForRecalibration 会检查 LTA 是否在上次校准后漂移+/- 12.5%。  在这种情况下不太可能。

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

    尊敬的 Dennis:

    使用新功能进行校准大约需要40ms、这非常出色、但是...

    我已经过测试、如果我调用您的新函数、MAP_CAPT_testForRecalibration (PAPP->pSensorList[ui8SensorID])会不断返回 true。

    您有什么想法吗?

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

    你好,Igor,这很奇怪。

    在 POR 时在 CAPT_AppStart()中完成的第一次校准足以开始进行校准,因此,现在如果您在 CAPT_manager.c 中注释掉这三个重校准检查,您是否可以向 GUI 发送数据?  如果您打开传感器的"条形视图"、您是否看到任何条形?  在不触摸的情况下、您看到的蓝色轮廓线是什么级别或计数值?  如果您触摸电极、该条的值会变为什么?

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

    您好 Igor、

    我从您那里听说过几天,因此我假设您能够解决您的问题。
    如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。