AnsweredAssumed Answered

ADC SyncMode Noise

Question asked by Alessandro Forino on Feb 19, 2020
Latest reply on Feb 24, 2020 by Daniel Haslimann

We currently face an issue with the i.MXRT1060 that noise is introduced to our ADC measurements whenever we take two measurements concurrently, but is absent when the Measurements are taken one after another.

 

This is how we configure the ADC_ETC with a serial measurement:

void ADC_Init(void)
{
    ADC_Configuration();

    adc_etc_config_t adcEtcConfig;
    ADC_ETC_GetDefaultConfig(&adcEtcConfig);
    adcEtcConfig.XBARtriggerMask = 0x1U;
    adcEtcConfig.enableTSCBypass = false;
    ADC_ETC_Init(DEMO_ADC_ETC_BASE, &adcEtcConfig);

    adc_etc_trigger_config_t adcEtcTriggerConfig;
    adcEtcTriggerConfig.enableSyncMode      = false;
    adcEtcTriggerConfig.enableSWTriggerMode = false;
    adcEtcTriggerConfig.sampleIntervalDelay = 0U;
    adcEtcTriggerConfig.initialDelay        = 0U;

    adcEtcTriggerConfig.triggerChainLength  = 1;
    adcEtcTriggerConfig.triggerPriority     = 3U;
    ADC_ETC_SetTriggerConfig(ADC_ETC, 0U, &adcEtcTriggerConfig);

    adc_etc_trigger_chain_config_t adcEtcTriggerChainConfig;
    adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U << ADC_CHANNEL;
    adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_InterruptDisable;

    adcEtcTriggerChainConfig.enableB2BMode = true;
    adcEtcTriggerChainConfig.ADCChannelSelect = BOARD_INITPINS_A_CHANNEL;
    ADC_ETC_SetTriggerChainConfig(ADC_ETC, 0U, 0U, &adcEtcTriggerChainConfig);

    adcEtcTriggerChainConfig.enableB2BMode = true;
    adcEtcTriggerChainConfig.ADCChannelSelect = BOARD_INITPINS_B_CHANNEL;
    adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable;
    ADC_ETC_SetTriggerChainConfig(ADC_ETC, 0U, 1U, &adcEtcTriggerChainConfig);
}

And the result of the channel A is as following. Sample time is 24kHz and 3000 measurements are taken.

If we configure the ADC now in synchronous sampling mode as following:

void ADC_Init(void)
{
    ADC_Configuration();

    adc_etc_config_t adcEtcConfig;
    ADC_ETC_GetDefaultConfig(&adcEtcConfig);
    adcEtcConfig.XBARtriggerMask = 0x1U;   
    adcEtcConfig.enableTSCBypass = false;
    ADC_ETC_Init(ADC_ETC, &adcEtcConfig);

    adc_etc_trigger_config_t adcEtcTriggerConfig;
    adcEtcTriggerConfig.enableSyncMode      = true;
    adcEtcTriggerConfig.enableSWTriggerMode = false;
    adcEtcTriggerConfig.sampleIntervalDelay = 0U;
    adcEtcTriggerConfig.initialDelay        = 0U;

    adcEtcTriggerConfig.triggerChainLength  = 0;
    adcEtcTriggerConfig.triggerPriority     = 3U;
    ADC_ETC_SetTriggerConfig(ADC_ETC, 0U, &adcEtcTriggerConfig);
    ADC_ETC_SetTriggerConfig(ADC_ETC, 4U, &adcEtcTriggerConfig);

    adc_etc_trigger_chain_config_t adcEtcTriggerChainConfig;
    adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U << ADC_CHANNEL;
    adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_InterruptDisable;

    adcEtcTriggerChainConfig.enableB2BMode = false;
    adcEtcTriggerChainConfig.ADCChannelSelect = BOARD_INITPINS_A_CHANNEL;
    ADC_ETC_SetTriggerChainConfig(ADC_ETC, 0U, 0U, &adcEtcTriggerChainConfig);

    adcEtcTriggerChainConfig.enableB2BMode = false;
    adcEtcTriggerChainConfig.ADCChannelSelect = BOARD_INITPINS_B_CHANNEL;
    adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable;
    ADC_ETC_SetTriggerChainConfig(ADC_ETC, 4U, 0U, &adcEtcTriggerChainConfig);
}

We get very strange results:

Exactly the same configuration of the ADCs is used in both cases. Noise of about 25bits is introduced and its noteworthy that it is only in positive direction. In both cases we sample VDDA_ADC_3P3/2 at the input, generated directly from VDDA_ADC_3P3 with a voltage divider. VDDA_ADC_3P3 is decoupled with one 220nF and one 1uF capacitor very close the pin. VDDA_ADC_3P3 is shorted with MCU_DCDC_IN as suggested from the reference design. We experience the same issue if we sample GND.

 

Did anybody experience a similar issue or has an idea where this phenomenon originates from?

 

Thanks in advance.

Outcomes