<?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>Kinetis MicrocontrollersのトピックMKW30Z temperature sensor calibration</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628818#M37795</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;KW40Z_Connectivity_Software_1.0.1 (KSDK_1.3.0) IAR 7.5&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;MKW40Z/30Z/20Z Reference Manual, Rev. 1.2, 10/2015&lt;BR /&gt;28.4.8 Temperature sensor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; links to&lt;/P&gt;&lt;P&gt;Temperature Sensor for the HCS08 Microcontroller Family (document AN3031).&lt;/P&gt;&lt;P&gt;&lt;A href="http://cache.freescale.com/files/microcontrollers/doc/app_note/AN3031.pdf"&gt;http://cache.freescale.com/files/microcontrollers/doc/app_note/AN3031.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;witch presents a calibration implementation:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Floating-Point&lt;/STRONG&gt; &lt;BR /&gt;Calibrated (3 Points) Typical Accuracy &lt;STRONG&gt;± 2.5&lt;/STRONG&gt;degs C&lt;BR /&gt;Uncalibrated&amp;nbsp; Typical Accuracy &lt;STRONG&gt;± 8&lt;/STRONG&gt;degs C&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #ff0000;"&gt;&lt;STRONG&gt;Fixed-Point&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;Calibrated (3 Points) Typical Accuracy &lt;STRONG style="color: #ff0000;"&gt;± 12&lt;/STRONG&gt;degs C&lt;BR /&gt;Uncalibrated&amp;nbsp; Typical Accuracy &lt;STRONG style="color: #ff0000;"&gt;± 18&lt;/STRONG&gt;degs C&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In conclusion having &lt;EM&gt;fixed-point arithmetic&lt;/EM&gt; calibrated and un-calibrated does not help you at all...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Having no calibration at all and floating point algo goes to &lt;STRONG&gt;±&lt;/STRONG&gt;8 deg C with is quite hight.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;3 point calibration gives good result but is hard to achieve in production (as time and resources).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In production, one point calibration is the easiest to do - measure by chip and measure by reference thermometer near chip.&lt;BR /&gt;(@ room temperature)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The HCS08 AN3031 document is accurate on MKW30Z ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Is some sort of calibration implemented in framework ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What would be the Calibrated 1 Point Typical Accuracy ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Lucian&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 28 Nov 2016 11:47:09 GMT</pubDate>
    <dc:creator>lucianfiran</dc:creator>
    <dc:date>2016-11-28T11:47:09Z</dc:date>
    <item>
      <title>MKW30Z temperature sensor calibration</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628818#M37795</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;KW40Z_Connectivity_Software_1.0.1 (KSDK_1.3.0) IAR 7.5&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;MKW40Z/30Z/20Z Reference Manual, Rev. 1.2, 10/2015&lt;BR /&gt;28.4.8 Temperature sensor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; links to&lt;/P&gt;&lt;P&gt;Temperature Sensor for the HCS08 Microcontroller Family (document AN3031).&lt;/P&gt;&lt;P&gt;&lt;A href="http://cache.freescale.com/files/microcontrollers/doc/app_note/AN3031.pdf"&gt;http://cache.freescale.com/files/microcontrollers/doc/app_note/AN3031.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;witch presents a calibration implementation:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Floating-Point&lt;/STRONG&gt; &lt;BR /&gt;Calibrated (3 Points) Typical Accuracy &lt;STRONG&gt;± 2.5&lt;/STRONG&gt;degs C&lt;BR /&gt;Uncalibrated&amp;nbsp; Typical Accuracy &lt;STRONG&gt;± 8&lt;/STRONG&gt;degs C&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #ff0000;"&gt;&lt;STRONG&gt;Fixed-Point&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;Calibrated (3 Points) Typical Accuracy &lt;STRONG style="color: #ff0000;"&gt;± 12&lt;/STRONG&gt;degs C&lt;BR /&gt;Uncalibrated&amp;nbsp; Typical Accuracy &lt;STRONG style="color: #ff0000;"&gt;± 18&lt;/STRONG&gt;degs C&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In conclusion having &lt;EM&gt;fixed-point arithmetic&lt;/EM&gt; calibrated and un-calibrated does not help you at all...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Having no calibration at all and floating point algo goes to &lt;STRONG&gt;±&lt;/STRONG&gt;8 deg C with is quite hight.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;3 point calibration gives good result but is hard to achieve in production (as time and resources).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In production, one point calibration is the easiest to do - measure by chip and measure by reference thermometer near chip.&lt;BR /&gt;(@ room temperature)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The HCS08 AN3031 document is accurate on MKW30Z ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Is some sort of calibration implemented in framework ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What would be the Calibrated 1 Point Typical Accuracy ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Lucian&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 28 Nov 2016 11:47:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628818#M37795</guid>
      <dc:creator>lucianfiran</dc:creator>
      <dc:date>2016-11-28T11:47:09Z</dc:date>
    </item>
    <item>
      <title>Re: MKW30Z temperature sensor calibration</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628819#M37796</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/thread/390524"&gt;On-chip temperature Calculations&lt;/A&gt; in which I show that with a 'good reference' and single-point (offset) calibration you could guarantee +/-2C 0to50C, using 32bit integer math.&lt;/P&gt;&lt;P&gt;Applies, as far as I know, to ANY former-Freescale microcontroller's temp-sense module (with allowance for the fact that 'older' parts published two slope factors).&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 28 Nov 2016 12:58:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628819#M37796</guid>
      <dc:creator>egoodii</dc:creator>
      <dc:date>2016-11-28T12:58:53Z</dc:date>
    </item>
    <item>
      <title>Re: MKW30Z temperature sensor calibration</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628820#M37797</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;BR /&gt;I understand that the AN is quite old and should be updated !&lt;BR /&gt;(Motorola, Freescale, NXP, Qualcomm)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The MKW30Z chip can use floating point math.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The chip measures die temperature or ambient temperature ?&lt;/P&gt;&lt;P&gt;6.4.1 Thermal operating requirements&lt;BR /&gt;TJ Die junction temperature –40 100 °C&lt;BR /&gt;TA Ambient temperature –40 85 °C&lt;/P&gt;&lt;P&gt;(Max/min expected temp value ?)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How many bits can we use (meters) ?&lt;/P&gt;&lt;P&gt;differential 16-bit, 13-bit, 11-bit, and 9-bit modes&lt;BR /&gt;single-ended 16-bit, 12-bit, 10-bit, and 8-bit modes&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ADC reference voltage selection.&lt;/P&gt;&lt;P&gt;Variants:&lt;BR /&gt;- internal band-gap &lt;BR /&gt;- external LDO NCP1117 (3.235V -&amp;gt; 3.365V) (Tlow = 0°C ,Thigh = 125°C)&lt;BR /&gt;- external special reference&lt;BR /&gt;- external DCDC convertor (buck/boost)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Witch is better NCP1117 3.3V (reference design) or internal band-gap ?&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Possible calibrations:&lt;/P&gt;&lt;P&gt;No Calibrattion&lt;BR /&gt;1 point calibration (Vtemp25C)&lt;BR /&gt;2 point calibration (Vtemp25C + hot slope)&lt;BR /&gt;2 point calibration (Vtemp25C + cold slope)&lt;BR /&gt;3 point calibration (Vtemp25C + hot, cold slope)&lt;BR /&gt;n point calibration&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Should we use a dual slope factor ( -40 to 25 to 100) or single&amp;nbsp; ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What about MKW30Z framework implementations ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;On &lt;STRONG&gt;frdm_kw40z_demo_1.0&lt;/STRONG&gt; - current chip temperature with a 0.01 °C resolution.&lt;/P&gt;&lt;P&gt;Seems a no calibration implementation.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;#define TEMPERATURE_SENSOR_V_BANDGAP_mV&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1000&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; Bandgap ADC channel voltage (in mV) */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define TEMPERATURE_SENSOR_ADC_RESOLUTION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 32768&amp;nbsp;&amp;nbsp; /*!&amp;lt; Expanded resolution value 2^Resolution */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define TEMPERATURE_SENSOR_VTEMP25_mV&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 716&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; Temperature sensor voltage @25C defined by the datasheet */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define TEMPERATURE_SENSOR_SLOPE_uV&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1620&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; Temperature sensor slope (in uV) defined by the datasheet */&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;int16_t &lt;STRONG&gt;temperature_sensor_get_chip_temperature&lt;/STRONG&gt; (void){&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; adc16_status_t result;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; int16_t bandgapVoltageAdcReading, temperatureChannelAdcReading;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; int16_t vReference, vTemperatureSensor;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; int16_t temperatureReading;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Start Bandgap Voltage Measurements */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; result = ADC16_DRV_ConfigConvChn(TEMPERATURE_SENSOR_ADC_INSTANCE, 0, &amp;amp;temperatureSensorBandgapVoltageChannel);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; if(result != kStatus_ADC16_Success)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kTemperatureSensorConversionStartError;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Wait for bandgap voltage measurement reading */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; ADC16_DRV_WaitConvDone (TEMPERATURE_SENSOR_ADC_INSTANCE, 0);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Get bandgap measurement */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; bandgapVoltageAdcReading = ADC16_DRV_GetConvValueSigned (TEMPERATURE_SENSOR_ADC_INSTANCE, 0); &amp;nbsp;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Start Temperature Channel Measurements */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; result = ADC16_DRV_ConfigConvChn(TEMPERATURE_SENSOR_ADC_INSTANCE, 0, &amp;amp;temperatureSensorChipTemperatureChannel);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; if(result != kStatus_ADC16_Success)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kTemperatureSensorConversionStartError;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Wait for temperature channel measurement reading */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; ADC16_DRV_WaitConvDone (TEMPERATURE_SENSOR_ADC_INSTANCE, 0);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Get temperature channel measurement */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; temperatureChannelAdcReading = ADC16_DRV_GetConvValueSigned (TEMPERATURE_SENSOR_ADC_INSTANCE, 0);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Calculate Reference Voltage */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; vReference = (int16_t)((TEMPERATURE_SENSOR_V_BANDGAP_mV * TEMPERATURE_SENSOR_ADC_RESOLUTION)/bandgapVoltageAdcReading);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Calculate Temperature Sensor Voltage */&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; vTemperatureSensor = (int16_t)((vReference*temperatureChannelAdcReading)/TEMPERATURE_SENSOR_ADC_RESOLUTION);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; /* Obtain temperature measurement*/&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; temperatureReading = 2500 - (((vTemperatureSensor - TEMPERATURE_SENSOR_VTEMP25_mV)*1000*100)/TEMPERATURE_SENSOR_SLOPE_uV);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; &lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp; return temperatureReading;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;}&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Another implementation &lt;STRONG&gt;bluetooth_temperature_sensor&lt;/STRONG&gt; on temp_sensor.c&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;/*!&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;* @brief These values are used to get the temperature. DO NOT MODIFY&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;* The method used in this demo to calculate temperature of chip is mapped to&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;* Temperature Sensor for the HCS08 Microcontroller Family document (Document Number: AN3031)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;*/&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define ADCR_VDD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (65535U)&amp;nbsp;&amp;nbsp;&amp;nbsp; // Maximum value when use 16b resolution&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define V_BG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1000U)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // BANDGAP voltage in mV (trim to 1.0V)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define V_TEMP25&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (716U)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Typical converted value at 25 oC in mV&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1620U)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Typical slope:uV/oC&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define STANDARD_TEMP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (25)&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;#define ADC16_INSTANCE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0)&amp;nbsp;&amp;nbsp; // ADC instacne&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define ADC16_TEMPERATURE_CHN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (kAdc16Chn26) // Temperature Sensor Channel&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define ADC16_BANDGAP_CHN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (kAdc16Chn27) // ADC channel of BANDGAP&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define ADC16_CHN_GROUP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0)&amp;nbsp;&amp;nbsp; // ADC group configuration selection&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;uint32_t adcValue = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ADC value&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;uint32_t adcrTemp25 = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calibrated ADCR_TEMP25&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;uint32_t adcr100m = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // calibrated conversion value of 100mV&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;adc16_converter_config_t adcUserConfig1;&amp;nbsp;&amp;nbsp; // structure for user config&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;EM&gt;int32_t T&lt;STRONG&gt;empSensor_GetTemperature&lt;/STRONG&gt;(void)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;{&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int32_t currentTemp = 0;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc16_chn_config_t chnConfig;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Configure the conversion channel&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // differential and interrupt mode disable.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chnConfig.chnIdx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (adc16_chn_t)ADC16_TEMPERATURE_CHN;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#if FSL_FEATURE_ADC16_HAS_DIFF_MODE&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chnConfig.diffConvEnable = false;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chnConfig.convCompletedIntEnable&amp;nbsp; = false;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Software trigger the conversion.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_ConfigConvChn(ADC16_INSTANCE, ADC16_CHN_GROUP, &amp;amp;chnConfig);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for the conversion to be done.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_WaitConvDone(ADC16_INSTANCE, ADC16_CHN_GROUP);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Fetch the conversion value.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adcValue = ADC16_DRV_GetConvValueSigned(ADC16_INSTANCE, ADC16_CHN_GROUP);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calculates adcValue in 16bit resolution&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // from 12bit resolution in order to convert to temperature.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#if (FSL_FEATURE_ADC16_MAX_RESOLUTION &amp;lt; 16)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adcValue = adcValue &amp;lt;&amp;lt; 4;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Multiplied by 1000 because M in uM/oC&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Temperature = 25 - (ADCR_T - ADCR_TEMP25) * 100*1000 / ADCR_100M*M&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentTemp = (int32_t)(STANDARD_TEMP - ((int32_t)adcValue - (int32_t)adcrTemp25) * 100000 /(int32_t)(adcr100m*M));&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pause the conversion.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_PauseConv(ADC16_INSTANCE, ADC16_CHN_GROUP);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return currentTemp;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;}&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;/*!&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;* @brief Parameters calibration: VDD and ADCR_TEMP25&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;*&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;* This function used BANDGAP as reference voltage to measure vdd and&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;* calibrate V_TEMP25 with that vdd value.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;*/&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;static void &lt;STRONG&gt;calibrateParams&lt;/STRONG&gt;(void)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;{&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc16_chn_config_t adcChnConfig;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#if FSL_FEATURE_ADC16_HAS_HW_AVERAGE&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc16_hw_average_config_t userHwAverageConfig;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pmc_bandgap_buffer_config_t pmcBandgapConfig = {&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enable = true,&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#if FSL_FEATURE_PMC_HAS_BGEN&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .enableInLowPower = false,&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#if FSL_FEATURE_PMC_HAS_BGBDS&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .drive = kPmcBandgapBufferDriveLow,&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t bandgapValue = 0;&amp;nbsp; // ADC value of BANDGAP&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t vdd = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // VDD in mV&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;#if FSL_FEATURE_ADC16_HAS_CALIBRATION&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Auto calibration&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adc16_calibration_param_t adcCalibraitionParam;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_GetAutoCalibrationParam(ADC16_INSTANCE, &amp;amp;adcCalibraitionParam);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_SetCalibrationParam(ADC16_INSTANCE, &amp;amp;adcCalibraitionParam);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif // FSL_FEATURE_ADC16_HAS_CALIBRATION.&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Enable BANDGAP reference voltage&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PMC_HAL_BandgapBufferConfig(PMC_BASE_PTR, &amp;amp;pmcBandgapConfig);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;#if FSL_FEATURE_ADC16_HAS_HW_AVERAGE&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Use hardware average to increase stability of the measurement.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHwAverageConfig.hwAverageEnable = true;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHwAverageConfig.hwAverageCountMode = kAdc16HwAverageCountOf32;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_ConfigHwAverage(ADC16_INSTANCE, &amp;amp;userHwAverageConfig);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif // FSL_FEATURE_ADC16_HAS_HW_AVERAGE&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Configure the conversion channel&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // differential and interrupt mode disable.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adcChnConfig.chnIdx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (adc16_chn_t)ADC16_BANDGAP_CHN;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#if FSL_FEATURE_ADC16_HAS_DIFF_MODE&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adcChnConfig.diffConvEnable&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = false;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adcChnConfig.convCompletedIntEnable&amp;nbsp; = false;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_ConfigConvChn(ADC16_INSTANCE, ADC16_CHN_GROUP, &amp;amp;adcChnConfig);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait for the conversion to be done&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_WaitConvDone(ADC16_INSTANCE, ADC16_CHN_GROUP);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get current ADC BANDGAP value and format it.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bandgapValue = ADC16_DRV_GetConvValueSigned(ADC16_INSTANCE, ADC16_CHN_GROUP);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calculates bandgapValue in 16bit resolution&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // from 12bit resolution to calibrate.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#if (FSL_FEATURE_ADC16_MAX_RESOLUTION &amp;lt; 16)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bandgapValue = bandgapValue &amp;lt;&amp;lt; 4;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#endif&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ADC stop conversion&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADC16_DRV_PauseConv(ADC16_INSTANCE, ADC16_CHN_GROUP);&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get VDD value measured in mV&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // VDD = (ADCR_VDD x V_BG) / ADCR_BG&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vdd = ADCR_VDD * V_BG / bandgapValue;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calibrate ADCR_TEMP25&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ADCR_TEMP25 = ADCR_VDD x V_TEMP25 / VDD&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adcrTemp25 = ADCR_VDD * V_TEMP25 / vdd;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calculate conversion value of 100mV.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ADCR_100M = ADCR_VDD x 100 / VDD&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adcr100m = ADCR_VDD*100/ vdd;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable BANDGAP reference voltage&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pmcBandgapConfig.enable = false;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PMC_HAL_BandgapBufferConfig(PMC_BASE_PTR, &amp;amp;pmcBandgapConfig);&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;}&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;What about these implementations ?&lt;/P&gt;&lt;P&gt;How good are they ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Lucian.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 28 Nov 2016 15:20:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628820#M37797</guid>
      <dc:creator>lucianfiran</dc:creator>
      <dc:date>2016-11-28T15:20:21Z</dc:date>
    </item>
    <item>
      <title>Re: MKW30Z temperature sensor calibration</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628821#M37798</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I can't go thru all that code in detail, but the concepts look like they follow my integer-implementation outlines -- with some debugging you can confirm the details.&amp;nbsp; &lt;EM&gt;&lt;STRONG&gt;temperature_sensor_get_chip_temperature&lt;/STRONG&gt;&lt;/EM&gt; looks most like my sequence, where you could 'skip' the vReference calculation (and use a constant) by using either 'good LDO' Vdd or a GOOD external voltage reference.&amp;nbsp; They also use some int16 where you might as well use int32 on a 32-bit processor.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The temperature measured is, of course, the CPU-chip's die temperature, more specifically 'at some particular point' on the die, but I suppose we can assume a 'small differential' across the die.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I would convert 16-bits; the Temp and BG channels are single-ended.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The internal bandgap is +/-2% 0to50C, +/-3% otherwise.&amp;nbsp; Your NCP LDO is +/-2% over that specified temp range, so 'somewhat better', but will contribute a +/-10C error-band, as per my writeup.&amp;nbsp; The temperature-cell-measurements are 'absolute voltages', and thus the conversion accuracy is directly related to the reference accuracy, and because the temperature-result is a DIFFERENCE of two similar numbers, conversion inaccuracy nets a much larger result-error.&amp;nbsp; To expect some 'real accuracy' will REQUIRE something like the 0.1%-accurate reference I suggest --- HOPEFULLY you have some other analog-functions for your system that would benefit from this precision reference!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;AT LEAST make a single-point calibration (to remove the +/-6.2C offset error), where you take the 'measured temperature cell' voltage at a stable operating point, and as compared to a co-located reference-temperature in your production-test-fixture, will allow you to 'assume' the 1.62mV/C slope (617mC/mV) is 'close', and run down that slope to what the measured temperature cell value would be at 25C, and save THAT as Vtemp25mv.&amp;nbsp; The published slope error is only upto +/-.043C/C, so even at a 50C difference from 25C it only opens a +/-2.5C error-band, and is probably NOT worth the extra production time to correct from a 2nd calibration point.&amp;nbsp; We do assume here that the temp-cell output is LINEAR, which of course is only an approximation.&amp;nbsp; I assume the 'older chips' supplied two slopes to try to 'help' that linearization -- I don't personally know what any non-linearity error will contribute.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you HAVE no 'other good use' for accurate Vref, I simply suggest dropping an ADT75A onto your I2C bus...precalibrated to deliver +/-3C -55to125C@Vdd=3.3V, and it WON'T be influenced (directly, at least!) by CPU-chip-heating.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 28 Nov 2016 21:09:02 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628821#M37798</guid>
      <dc:creator>egoodii</dc:creator>
      <dc:date>2016-11-28T21:09:02Z</dc:date>
    </item>
    <item>
      <title>Re: MKW30Z temperature sensor calibration</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628822#M37799</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;In my application I have the chip surrounded by a lot of LEDs in a close box, lamp head.&lt;/P&gt;&lt;P&gt;At some critical threshold temperature I will start dimm all outputs as some factor proportional to temperature.&lt;/P&gt;&lt;P&gt;If the temperature continue to rise another failure threshold will be set and all outputs will be off.&lt;/P&gt;&lt;P&gt;With some hysteresis after cooling the leds will work again.&lt;/P&gt;&lt;P&gt;Considering&amp;nbsp; die junction temperature –40 100 °C surrounding chip ambient temperature is –40 85 °C&lt;/P&gt;&lt;P&gt;Worst used leds have Operating Temperature Range Topr -40°C to +80°C&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So the region of interest is 60C - 75C ambient near chip temperature.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The board was design with a lot of ground plane to absorb and disperse the led temperature on surface&lt;/P&gt;&lt;P&gt;and a ~uniform temperature distribution on PCB.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I don't have any other other analog functions that require a 'good' reference.&lt;/P&gt;&lt;P&gt;If I use the LDO as reference will be an offset error of +/-10C error-band ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If an 1 point calibration will be done, the reference thermometer will be close to chip.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The error is due to 2 conversions TempP and TempM.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="pastedImage_1.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/8850iE9FC61488BF7E280/image-size/large?v=v2&amp;amp;px=999" role="button" title="pastedImage_1.png" alt="pastedImage_1.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The function &lt;EM&gt;T&lt;STRONG&gt;empSensor_GetTemperature&lt;/STRONG&gt;&lt;/EM&gt; use the values&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;EM&gt;uint32_t adcrTemp25 = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calibrated ADCR_TEMP25&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;uint32_t adcr100m = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // calibrated conversion value of 100mV&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;adc16_converter_config_t adcUserConfig1;&amp;nbsp;&amp;nbsp; // structure for user config&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Multiplied by 1000 because M in uM/oC&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Temperature = 25 - (ADCR_T - ADCR_TEMP25) * 100*1000 / ADCR_100M*M&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;currentTemp&lt;/STRONG&gt; = (int32_t)(STANDARD_TEMP - ((int32_t)adcValue - (int32_t)&lt;STRONG&gt;adcrTemp25&lt;/STRONG&gt;) * 100000 /(int32_t)(&lt;STRONG&gt;adcr100m&lt;/STRONG&gt;*M));&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;generated by function &lt;STRONG&gt;calibrateParams&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get VDD value measured in mV&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // VDD = (ADCR_VDD x V_BG) / ADCR_BG&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vdd = ADCR_VDD * V_BG / bandgapValue;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calibrate ADCR_TEMP25&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ADCR_TEMP25 = ADCR_VDD x V_TEMP25 / VDD&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;adcrTemp25&lt;/STRONG&gt; = ADCR_VDD * V_TEMP25 / vdd;&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calculate conversion value of 100mV.&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ADCR_100M = ADCR_VDD x 100 / VDD&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;adcr100m&lt;/STRONG&gt; = ADCR_VDD*100/ vdd;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;and the constants:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;#define ADCR_VDD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (65535U)&amp;nbsp;&amp;nbsp;&amp;nbsp; // Maximum value when use 16b resolution&lt;BR /&gt;&lt;EM&gt;#define V_BG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1000U)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // BANDGAP voltage in mV (trim to 1.0V)&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define V_TEMP25&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (716U)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Typical converted value at 25 oC in mV&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1620U)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Typical slope:uV/oC&lt;/EM&gt;&lt;BR /&gt;&lt;EM&gt;#define STANDARD_TEMP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (25)&lt;/EM&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Lucian&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 Nov 2016 09:22:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628822#M37799</guid>
      <dc:creator>lucianfiran</dc:creator>
      <dc:date>2016-11-29T09:22:13Z</dc:date>
    </item>
    <item>
      <title>Re: MKW30Z temperature sensor calibration</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628823#M37800</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;That should work fine -- so your calibration process will yield a 'better' V_TEMP25 (instead of the #define), OR maybe you will want to define a different calibration point (if you &lt;EM&gt;can&lt;/EM&gt; in production) closer to the 'temp range of interest', like around 60C for STANDARD_TEMP; but I WOULD use a constant for adcr100m(&lt;EM&gt;ADCR_VDD&lt;/EM&gt;*100/3300), since your Vdd 'reference' will already be BETTER than the on-chip bandgap.&amp;nbsp; And with that, slope error, and others you can expect 'worst case' +/-15C tolerance, usually MUCH better.&amp;nbsp; You will want to 'estimate' the on-chip to LED-chip differential in 'steady state' in the assembled product.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 Nov 2016 12:49:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/MKW30Z-temperature-sensor-calibration/m-p/628823#M37800</guid>
      <dc:creator>egoodii</dc:creator>
      <dc:date>2016-11-29T12:49:09Z</dc:date>
    </item>
  </channel>
</rss>

