<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Hardware averaging of internal temperature sensor gives random values. in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Hardware-averaging-of-internal-temperature-sensor-gives-random/m-p/288298#M11295</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Paul,&lt;/P&gt;&lt;P&gt;Thanks for the fast reply. My calibration function looks like this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static uint32_t adc_calibrate(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t ad_calib = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; irq_disableInt(irq_ADC); //Disable the interrupt while calibrating&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_SC3 &amp;amp;= ~ADC_SC2_ADTRG_MASK;&amp;nbsp;&amp;nbsp; // Enable Software Conversion Trigger for Calibration Process&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_SC3 &amp;amp;= (~ADC_SC3_ADCO_MASK &amp;amp; ~ADC_SC3_AVGS_MASK);&amp;nbsp;&amp;nbsp; // set single conversion, clear avgs bitfield for next writing&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_SC3 |= (ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(3)); // Turn averaging ON and set at max value ( 32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_SC3 |= ADC_SC3_CAL_MASK; // Start CAL&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; while ((ADC0_SC1A &amp;amp; ADC_SC1_COCO_MASK) != ADC_SC1_COCO_MASK)&lt;/P&gt;&lt;P&gt;&amp;nbsp; ; // Wait until calibration ends&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ((ADC_SC3_REG(ADC0_BASE_PTR) &amp;amp; ADC_SC3_CALF_MASK) == ADC_SC3_CALF_MASK)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(FALSE); //Calibration failed.&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib = ADC0_CLP0; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLP1; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLP2; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLP3; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLP4; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLPS; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib /= 2; // divide by 2&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib |= 0x8000; // Set MSB&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_PG = ad_calib;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC_SC3_REG(ADC0_BASE_PTR) &amp;amp;= ~ADC_SC3_CAL_MASK; /* Clear CAL bit */&lt;/P&gt;&lt;P&gt;&amp;nbsp; return(TRUE); //Calibration successful&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The remaining setup code calls this calibration function as below:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if(adc_calibrate()) //If we have a successful calibration&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC0_SC1A |= ADC_SC1_AIEN_MASK; //Enable interrupt&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC0_CFG1 |= ADC_CFG1_MODE(1); // Set 12 bit mode&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC0_SC3&amp;nbsp; &amp;amp;= (uint8_t)(~ADC_SC3_AVGE_MASK); //Disable averaging&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //ADC0_SC3&amp;nbsp; = ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(0); //4 samples&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;After this the conversion is started with:&lt;/P&gt;&lt;P&gt;ADC0_SC1A = ( CHANNEL_TO_MEASURE &amp;amp; ADC_SC1_ADCH_MASK) | ADC_SC1_AIEN_MASK; //Start next conversion!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The result is extracted from the interrupt with&lt;/P&gt;&lt;P&gt;value = ADC0_RA;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I hope this was what you were looking for. In case it makes any difference, the MCU runs on 3.3V, and the analog reference voltage is 2.048V.&lt;/P&gt;&lt;P&gt;Thanks for the help!&lt;/P&gt;&lt;P&gt;Kind regards&lt;/P&gt;&lt;P&gt;Lars&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 20 Nov 2013 07:22:01 GMT</pubDate>
    <dc:creator>larsl</dc:creator>
    <dc:date>2013-11-20T07:22:01Z</dc:date>
    <item>
      <title>Hardware averaging of internal temperature sensor gives random values.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Hardware-averaging-of-internal-temperature-sensor-gives-random/m-p/288296#M11293</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm currently running a set of prototypes on the MKL04Z32xxx4 MCU. I've written some code for the ADC in order to be able to read a set of different channels. All used channels are working fine when hardware averaging is turned on, except the internal chip temperature one. The code is set up to use 12-bit measurements, and looks does this after calibration:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;ADC0_SC1A |= ADC_SC1_AIEN_MASK; //Enable interrupt&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;ADC0_CFG1 |= ADC_CFG1_MODE(1); // Set 12 bit mode&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;//ADC0_SC3&amp;nbsp; &amp;amp;= (uint8_t)(~ADC_SC3_AVGE_MASK); //Averaging disabled when this line is run.&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;ADC0_SC3&amp;nbsp; = ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(0); //4 samples enabled with this.&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I can get a proper reading on the chip temp when hardware averaging is turned off (un-commented line above), but not when the code runs as above. I've recorded twenty samples over a period of 20 seconds. As you can see the one with HW averaging acts in a random fashion...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//4 HW samples:&lt;/P&gt;&lt;P&gt;array[0]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1216&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[1]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 941&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[2]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 783&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[3]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 850&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[4]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 822&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[5]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 928&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[6]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 903&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[7]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 980&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[8]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 958&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[9]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 807&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[10]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 717&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[11]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 906&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[12]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 821&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[13]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 793&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[14]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 821&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[15]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 806&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[16]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1102&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[17]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 822&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[18]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 906&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[19]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 643&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//With averaging disabled:&lt;/P&gt;&lt;P&gt;array[0]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[1]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[2]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[3]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[4]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[5]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[6]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[7]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[8]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[9]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[10]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[11]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[12]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[13]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[14]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[15]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[16]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[17]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[18]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;array[19]&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t&amp;nbsp;&amp;nbsp;&amp;nbsp; 1412&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Does anybody know what might be going on? This problem is driving me nuts..&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;&lt;P&gt;/Lars&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 19 Nov 2013 14:48:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Hardware-averaging-of-internal-temperature-sensor-gives-random/m-p/288296#M11293</guid>
      <dc:creator>larsl</dc:creator>
      <dc:date>2013-11-19T14:48:34Z</dc:date>
    </item>
    <item>
      <title>Re: Hardware averaging of internal temperature sensor gives random values.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Hardware-averaging-of-internal-temperature-sensor-gives-random/m-p/288297#M11294</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, Larsl&lt;/P&gt;&lt;P&gt;Would you please help to show your complete ADC initial code? I would like to check it for you. Thanks a lot. Have a nice day.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards&lt;/P&gt;&lt;P&gt;Paul&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 20 Nov 2013 03:00:55 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Hardware-averaging-of-internal-temperature-sensor-gives-random/m-p/288297#M11294</guid>
      <dc:creator>Paul_Tian</dc:creator>
      <dc:date>2013-11-20T03:00:55Z</dc:date>
    </item>
    <item>
      <title>Re: Hardware averaging of internal temperature sensor gives random values.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Hardware-averaging-of-internal-temperature-sensor-gives-random/m-p/288298#M11295</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Paul,&lt;/P&gt;&lt;P&gt;Thanks for the fast reply. My calibration function looks like this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static uint32_t adc_calibrate(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t ad_calib = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; irq_disableInt(irq_ADC); //Disable the interrupt while calibrating&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_SC3 &amp;amp;= ~ADC_SC2_ADTRG_MASK;&amp;nbsp;&amp;nbsp; // Enable Software Conversion Trigger for Calibration Process&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_SC3 &amp;amp;= (~ADC_SC3_ADCO_MASK &amp;amp; ~ADC_SC3_AVGS_MASK);&amp;nbsp;&amp;nbsp; // set single conversion, clear avgs bitfield for next writing&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_SC3 |= (ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(3)); // Turn averaging ON and set at max value ( 32 )&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_SC3 |= ADC_SC3_CAL_MASK; // Start CAL&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; while ((ADC0_SC1A &amp;amp; ADC_SC1_COCO_MASK) != ADC_SC1_COCO_MASK)&lt;/P&gt;&lt;P&gt;&amp;nbsp; ; // Wait until calibration ends&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ((ADC_SC3_REG(ADC0_BASE_PTR) &amp;amp; ADC_SC3_CALF_MASK) == ADC_SC3_CALF_MASK)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(FALSE); //Calibration failed.&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib = ADC0_CLP0; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLP1; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLP2; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLP3; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLP4; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib += ADC0_CLPS; // Add results&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib /= 2; // divide by 2&lt;/P&gt;&lt;P&gt;&amp;nbsp; ad_calib |= 0x8000; // Set MSB&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC0_PG = ad_calib;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ADC_SC3_REG(ADC0_BASE_PTR) &amp;amp;= ~ADC_SC3_CAL_MASK; /* Clear CAL bit */&lt;/P&gt;&lt;P&gt;&amp;nbsp; return(TRUE); //Calibration successful&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The remaining setup code calls this calibration function as below:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if(adc_calibrate()) //If we have a successful calibration&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC0_SC1A |= ADC_SC1_AIEN_MASK; //Enable interrupt&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC0_CFG1 |= ADC_CFG1_MODE(1); // Set 12 bit mode&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC0_SC3&amp;nbsp; &amp;amp;= (uint8_t)(~ADC_SC3_AVGE_MASK); //Disable averaging&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //ADC0_SC3&amp;nbsp; = ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(0); //4 samples&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;After this the conversion is started with:&lt;/P&gt;&lt;P&gt;ADC0_SC1A = ( CHANNEL_TO_MEASURE &amp;amp; ADC_SC1_ADCH_MASK) | ADC_SC1_AIEN_MASK; //Start next conversion!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The result is extracted from the interrupt with&lt;/P&gt;&lt;P&gt;value = ADC0_RA;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I hope this was what you were looking for. In case it makes any difference, the MCU runs on 3.3V, and the analog reference voltage is 2.048V.&lt;/P&gt;&lt;P&gt;Thanks for the help!&lt;/P&gt;&lt;P&gt;Kind regards&lt;/P&gt;&lt;P&gt;Lars&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 20 Nov 2013 07:22:01 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Hardware-averaging-of-internal-temperature-sensor-gives-random/m-p/288298#M11295</guid>
      <dc:creator>larsl</dc:creator>
      <dc:date>2013-11-20T07:22:01Z</dc:date>
    </item>
  </channel>
</rss>

