你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
gaosmile 发布时间:2021-1-20 12:22
NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
微信图片_20210120122056.png
微信图片_20210120122059.png

我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
微信图片_20210120122102.png
实现温度转换
根据手册提供的公式: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计算。
完成代码如下所示。

  1. //***********************************************************************************************************
  2. //  File Function: ML51 series ADC software trigger on shot demo code
  3. //***********************************************************************************************************
  4. #include "ML51.h"
  5. #include "math.h"
  6. #include "NTC.h"
  7. /******************************************************************************
  8. The main C function.  Program execution starts
  9. here after stack initialization.
  10. ******************************************************************************/



  11. void main ()
  12. {
  13.   unsigned int ADCRESULT;
  14.         float Rval;
  15.         float temp;

  16. /*
  17. For UART0 P0.5 TXD output setting
  18. * include gipo.c in Library for GPIO mode setting
  19. * include uart.c in Library Setting for UART0
  20. */
  21.     MFP_P31_UART0_TXD;                              // UART0 TXD use P0.5
  22.     P31_QUASI_MODE;                                 // set P0.5  as Quasi mode for UART0 trasnfer
  23.     UART_Open(24000000,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 115200
  24.     ENABLE_UART0_PRINTF;  
  25. /*
  26.   ADCS to trig ADC convert
  27.   * include adc.c in Library for ADC initial setting
  28. */
  29.     ADC_Open(ADC_SINGLE,1);                                        //Enable ADC_CH4
  30.     ADC_ConvertTime(3,7);
  31. //* find ADC result in ADC interrupt*/
  32.                                             
  33.     while(1)
  34.     {
  35.         set_ADCCON0_ADCS;                           // Software trig adc start
  36.         while((ADCCON0|CLR_BIT7)==CLR_BIT7);         // wait ADCF = 1;
  37.         ADCRESULT = (ADCRH<<4)+ADCRL;
  38.         printf("\n ADC result = %d  ", ADCRESULT);
  39.         Timer0_Delay(24000000,100,5000);
  40.                                 Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));
  41.                                 printf("\n Rval=%d Ohm",(unsigned int)Rval);
  42.                                 temp=Res_to_Tem(Rval);
  43.                                 printf("\n temp=%.2f",temp-K);
  44.                                 printf("\n----------------");                                       
  45.     }
  46.   
  47. }
复制代码
将阻抗转换为温度作为一个独立的头文件NTC.h

  1. #define K 273.15
  2. #define T0 (25.0+K)
  3. #define R0 10000.0
  4. #define B 3455.0        

  5. /*
  6. 电阻值换算到温度
  7. adc_val:NTC当前的阻抗值,单位欧姆
  8. 返回值:摄氏度
  9. */

  10. float Res_to_Tem(float adc_val)
  11. {
  12.         float temp;
  13.         temp=1/((1/T0)+(log(adc_val/R0)/B));
  14.         return temp-K;
  15. }
复制代码

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

绘制出曲线如下图所示。
微信图片_20210120122111.png

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

收藏 评论0 发布时间:2021-1-20 12:22

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版