AnsweredAssumed Answered

Periodical ADC offset jumps on Kinetis K02

Question asked by Adrian Keil on Nov 15, 2017
Latest reply on Dec 1, 2017 by Adrian Keil

Hello,

 

I'm using the MK02FN64VLH10 for a temperature regualtion and I get weird jumps in the ADC-value. The ADC-value periodically jumps up and down about 600 lsb. It is not a peak but a permanent offset! The time in between these jumps is about 11h.

I also measured the voltage on the ADC externally and it's perfectly stable.

The ADC is configured using Processor Expert and Hardware Average is enabled. Every ms the COCO-bit is checked and if the ADC has finished the value is read (see code below).

Core Clock is 80MHz, Bus Clock is 40MHz.

It's also worth mentioning that the problem does not always appear. Sometimes it works just fine and after a reboot the problem starts to occur.

Does anyone has an idea by what this could be caused?

 

In adConv1.c:

const adc16_converter_config_t adConv1_InitConfig0 = {
  .lowPowerEnable = false,
  .clkDividerMode = kAdc16ClkDividerOf8,
  .longSampleTimeEnable = true,
  .resolution = kAdc16ResolutionBitOf16,
  .clkSrc = kAdc16ClkSrcOfBusClk,
  .asyncClkEnable = false,
  .highSpeedEnable = false,
  .longSampleCycleMode = kAdc16LongSampleCycleOf24,
  .hwTriggerEnable = false,
  .refVoltSrc = kAdc16RefVoltSrcOfValt,
  .continuousConvEnable = false,
  .dmaEnable = false,
};

const adc16_hw_average_config_t adcAverageConfig = {
   .hwAverageEnable = true,
   .hwAverageCountMode = kAdc16HwAverageCountOf32,
};

 

In main.c:

ADC16_DRV_ConfigHwAverage(FSL_ADCONV1,&adcAverageConfig);

ADC16_DRV_ConfigConvChn(FSL_ADCONV1,0,&TemperatureB);

for(;;)

{

   if(f1ms>=1)
   {
      f1ms = 0;
      ADC_Type * base = g_adcBase[FSL_ADCONV1];
      if ( ADC16_HAL_GetChnConvCompletedFlag(base, 0) )
      {
         gAdcValue = ADC16_DRV_GetConvValueRAW(FSL_ADCONV1,0);
         ADC16_DRV_ConfigConvChn(FSL_ADCONV1,0,&TemperatureB);
      }

   }

   //Rest of the code which has nothing to do with th ADC...

}

 

However the periodic time seems to be dependant on the ADC-configuration. When I configured it to collect ADC-values much faster the periodic time was just 20min (no Hardware Average, rest of main as above):

const adc16_converter_config_t adConv1_InitConfig0 = {
  .lowPowerEnable = false,
  .clkDividerMode = kAdc16ClkDividerOf1,
  .longSampleTimeEnable = false,
  .resolution = kAdc16ResolutionBitOf16,
  .clkSrc = kAdc16ClkSrcOfAsynClk,
  .asyncClkEnable = false,
  .highSpeedEnable = true,
  .longSampleCycleMode = kAdc16LongSampleCycleOf4,
  .hwTriggerEnable = false,
  .refVoltSrc = kAdc16RefVoltSrcOfValt,
  .continuousConvEnable = false,
  .dmaEnable = false,
};

Outcomes