发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[应用方案]

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

[复制链接]
1039|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# @21小跑堂

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通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。



使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2020-11-13
理由:恭喜通过原创文章审核!

沙发
antusheng| | 2020-11-12 16:03 | 只看该作者
漂亮,多谢分享,公式通用吗

使用特权

评论回复
板凳
wahahaheihei| | 2020-11-13 09:56 | 只看该作者
不错不错,给力。

使用特权

评论回复
地板
xuanhuanzi| | 2020-11-13 11:19 | 只看该作者
来个点赞。

使用特权

评论回复
5
gejigeji521| | 2020-11-13 11:41 | 只看该作者
研究的透彻,学习学习。

使用特权

评论回复
6
gaoyang9992006|  楼主 | 2020-11-17 17:34 | 只看该作者

GPIO_I2C_OLED.rar (100.87 KB)




使用特权

评论回复
7
734774645| | 2022-5-23 15:15 | 只看该作者
真不错,直接可以拿走用了。

使用特权

评论回复
8
match007| | 2022-6-12 13:35 | 只看该作者
adc不是采样么
怎么能驱动?

使用特权

评论回复
9
huahuagg| | 2022-11-21 14:15 | 只看该作者
这个贴,真棒,不仅有理论还有直接可以用的公式。

使用特权

评论回复
10
huahuagg| | 2022-11-21 14:15 | 只看该作者
match007 发表于 2022-6-12 13:35
adc不是采样么
怎么能驱动?

是提供测温公式吧

使用特权

评论回复
11
gaoyang9992006|  楼主 | 2022-11-21 14:48 | 只看该作者
match007 发表于 2022-6-12 13:35
adc不是采样么
怎么能驱动?

不驱动怎么能从热敏电阻获得温度值呢。

使用特权

评论回复
12
pmp| | 2022-12-15 09:51 | 只看该作者
ML51是自带ADC的吗?              

使用特权

评论回复
13
gaoyang9992006|  楼主 | 2022-12-15 10:30 | 只看该作者
pmp 发表于 2022-12-15 09:51
ML51是自带ADC的吗?

是的,自带ADC,功能强大。

使用特权

评论回复
14
benjaminka| | 2022-12-15 14:12 | 只看该作者
这个转换的公式在哪里?              

使用特权

评论回复
15
gaoyang9992006|  楼主 | 2022-12-15 14:16 | 只看该作者
benjaminka 发表于 2022-12-15 14:12
这个转换的公式在哪里?

看不到吗?我贴的代码里就有转换公式啊。公式是我根据手册的说明自己推出来的。

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1893

主题

15621

帖子

197

粉丝