[应用方案]ML51单片机通过ADC驱动NTC传感器测量温度

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

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

实现温度转换

根据手册提供的公式: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 starts

here 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("\n ADC result = %d  ", ADCRESULT);

        Timer0_Delay(24000000,100,5000);

                                Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));

                                printf("\n Rval=%d Ohm",(unsigned int)Rval);

                                temp=Res_to_Tem(Rval);

                                printf("\n temp=%.2f",temp-K);

                                printf("\n----------------");                                        

    }

  

}



将阻抗转换为温度作为一个独立的头文件
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;

}

这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。 
手册还给出的查表方法,给出了几个特殊点,如下图所示

绘制出曲线如下图所示。

点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。
---------------------
作者:gaoyang9992006
链接:https://bbs.21ic.com/icview-3046276-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值