[DemoCode下载] ML51单片机通过ADC测内部温度和内部参考电压

[复制链接]
 楼主| 21mengnan 发表于 2025-1-25 14:26 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* SPDX-License-Identifier: Apache-2.0                                                                     */
  4. /* Copyright(c) 2020 Nuvoton Technology Corp. All rights reserved.                                         */
  5. /*                                                                                                         */
  6. /*---------------------------------------------------------------------------------------------------------*/

  7. #include "ml51.h"

  8. /* When Temperatue 25C, temperature voltage = 675mV, 1.83mV /per C */
  9. /* TemperatureVoltage = ADC_result*VREF / 4096                     */
  10. /* Temperature = 25 + ((673 - TemperatureVoltage)/1.83)            */
  11. /* so Temperture = 25 + (TTMPCAL - ADC_result*VREF)/VTEMPCOMDIV    */

  12. #define   TMPCAL        0x2A3000       /*    675*4096     */
  13. #define   VTEMPCOMDIV   7694           /*    4096*1.83    */



  14. void main (void)
  15. {
  16. /* GPIO initial setting
  17.   * include gpio.c in Library for GPIO mode setting
  18. */
  19.     unsigned int  u16bgvalue,ADC_BG_Result;
  20.     double  VREF_Voltage,RealTemperature;

  21.     MFP_P31_UART0_TXD;
  22.     P31_QUASI_MODE;
  23.     UART_Open(24000000,UART0_Timer3,115200);
  24.     ENABLE_UART0_PRINTF;
  25.    
  26. /* ADC initial setting
  27.   * include adc.c in Library for ADC setting.
  28. */
  29. /* Base on internal VREF 2560mV */  
  30.     VREF_Open(LEVEL1);
  31.     ADC_Open(ADC_SINGLE,VBG);  
  32. /* For the best result wait 10us delay for each sampling, ADCDIV=3, ADCAQT=7 is better */
  33.     ADC_SamplingTime(3,7);                             
  34.     clr_ADCCON0_ADCF;
  35.     set_ADCCON0_ADCS;
  36.     while(!(ADCCON0&SET_BIT7));
  37.     ADC_BG_Result = (ADCRH<<4) + ADCRL;
  38.     ADC_Close();
  39. /***************************************************************************************/
  40. /*                  VDD  Now                         READ_BANDGAP() VALUE
  41. /*    ------------------------------------- = ----------------------------------
  42. /*    3072mV(Storage value test condition)      NOW ADC Bandgap convert reuslt
  43. /***************************************************************************************/
  44.     VREF_Voltage = ((float)READ_BANDGAP()/(float)ADC_BG_Result)*3072;

  45.     printf ("\n VREF = %f",VREF_Voltage);
  46.     printf (" mV" );

  47. /* ADC temperature calculate */
  48.     ADC_SamplingTime(2,7);
  49.     ADC_Open(ADC_SINGLE,VTEMP);

  50.     clr_ADCCON0_ADCF;                              /*Clear ADC flag before ADC start */
  51.     set_ADCCON0_ADCS;                              /* Each time ADC start trig signal*/
  52.    
  53.     while(!(ADCCON0&SET_BIT7));                    /* wait ADCF = 1 */
  54.     u16bgvalue = (ADCRH<<4)+ADCRL;
  55.     ADC_Close();

  56.     RealTemperature = 25 + ((TMPCAL - (u16bgvalue * VREF_Voltage))/VTEMPCOMDIV);
  57.     printf ("\n Temperature = %f",RealTemperature);

  58.     while(1);
  59. }




 楼主| 21mengnan 发表于 2025-1-25 14:27 | 显示全部楼层
你知道单片机内部测温度用的是什么吗,是NTC温度传感器吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1140

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部