ML51单片机通过ADC驱动NTC传感器测量温度实例

电子说

1.2w人已加入

描述

 

NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。

ML

 

ML



我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。

ML


实现温度转换

根据手册提供的公式:R=R0 exp B(1/T - 1/T0);其中R是待测电阻,R0是某个温度T0 K下的已知电阻,B是温度传感器常数。

通过以上公式反推T = temp=1/((1/T0)+(log(RT/R0)/B));

代入数据测试,例如T0=25摄氏度时候R0=10K欧姆,主意以上代入实际计算时候要使用绝对温度,单位开尔文。

经过测试上述公式可以完成验算,即,正确。

根据手册该型号的B常数在25到50度之间采用3380,25到80之间采用3428,25到85之间采用3434,25到100摄氏度之间采用3455.

为了方便,本项目采用3455计算。

完成代码如下所示。
 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
//***********************************************************************************************************//  File Function: ML51 series ADC software trigger on shot demo code//***********************************************************************************************************#include "ML51.h"#include "math.h"#include "NTC.h"/******************************************************************************The main C function.  Program execution startshere after stack initialization.******************************************************************************/


void main (){  unsigned int ADCRESULT;        float Rval;        float temp;
/*For UART0 P0.5 TXD output setting* include gipo.c in Library for GPIO mode setting* include uart.c in Library Setting for UART0*/    MFP_P31_UART0_TXD;                              // UART0 TXD use P0.5    P31_QUASI_MODE;                                 // set P0.5  as Quasi mode for UART0 trasnfer    UART_Open(24000000,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 115200    ENABLE_UART0_PRINTF;  /*  ADCS to trig ADC convert  * include adc.c in Library for ADC initial setting*/    ADC_Open(ADC_SINGLE,1);                                        //Enable ADC_CH4    ADC_ConvertTime(3,7);//* find ADC result in ADC interrupt*/                                                while(1)    {        set_ADCCON0_ADCS;                           // Software trig adc start        while((ADCCON0|CLR_BIT7)==CLR_BIT7);         // wait ADCF = 1;        ADCRESULT = (ADCRH<<4)+ADCRL;        printf("
 ADC result = %d  ", ADCRESULT);        Timer0_Delay(24000000,100,5000);                                Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));                                printf("
 Rval=%d Ohm",(unsigned int)Rval);                                temp=Res_to_Tem(Rval);                                printf("
 temp=%.2f",temp-K);                                printf("
----------------");                                           }  }

 

将阻抗转换为温度作为一个独立的头文件NTC.h  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#define K 273.15#define T0 (25.0+K)#define R0 10000.0#define B 3455.0        
/*电阻值换算到温度adc_val:NTC当前的阻抗值,单位欧姆返回值:摄氏度*/
float Res_to_Tem(float adc_val){        float temp;        temp=1/((1/T0)+(log(adc_val/R0)/B));        return temp-K;}
 这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。 

ML

 手册还给出的查表方法,给出了几个特殊点,如下图所示

ML


 绘制出曲线如下图所示。


 点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。    

     
 

责任编辑:xj

原文标题:实用应用案例:ML51单片机通过ADC驱动NTC传感器测量温度

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分