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

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

[复制链接]
gaosmile 发布时间:2021-1-20 12:22
NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
微信图片_20210120122056.png
微信图片_20210120122059.png / u) l+ S$ h" i* \8 I
7 F, {. x% r' Y0 e1 b! o
我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
微信图片_20210120122102.png 5 o* ]7 Z7 G0 h8 K6 G0 w5 i
实现温度转换
根据手册提供的公式:R=R0 exp B(1/T - 1/T0);其中R是待测电阻,R0是某个温度T0 K下的已知电阻,B是温度传感器常数。

6 Z+ H2 O$ v  {- J$ J; N
通过以上公式反推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计算。
完成代码如下所示。
6 I, q5 ^, j! o# J( y

  1. , p. L) Z' K, M6 y0 n
  2. //***********************************************************************************************************2 w6 c* y) k+ t& W3 L7 n
  3. //  File Function: ML51 series ADC software trigger on shot demo code
    + G0 U) w7 U2 k/ n" A6 s
  4. //***********************************************************************************************************
    * I4 t9 |! _7 p
  5. #include "ML51.h"
    , Q8 ~  G% J% P3 O; X( l
  6. #include "math.h"
    7 c& U& k: ^$ t; [  J( M
  7. #include "NTC.h"
    3 i8 L) s7 w$ w- w% r: Y
  8. /******************************************************************************( U* R# l/ D- E. V4 ^$ x2 {& @
  9. The main C function.  Program execution starts
    7 r& d) h+ D' z4 n: D
  10. here after stack initialization.
    ; q1 X3 J7 W, ^* ?* m( d
  11. ******************************************************************************/
    - l1 D$ t9 ^& e% g1 W

  12. 5 ~1 X9 U) P' b9 I3 I" U: x7 ~
  13. 8 B5 d2 U( l  c; ?8 m, G- T) P

  14. # v' D/ h$ K  g4 ?
  15. void main ()& `6 |7 k* ?; n% w
  16. {
    $ m. x5 d1 [* T9 O3 x* R( o# p) x
  17.   unsigned int ADCRESULT;" |) u* \4 m2 u  r2 {' r  [( ]
  18.         float Rval;! A1 [" ?$ L0 @8 k
  19.         float temp;
    4 \+ Q$ R% K6 D9 V

  20. 3 A1 q& l3 o$ _; {: t
  21. /*0 _2 c  @* x8 K/ `1 Z7 [2 k
  22. For UART0 P0.5 TXD output setting
    * J1 ~& P  m1 E( j( r# Y
  23. * include gipo.c in Library for GPIO mode setting! f% w  C. ^7 ?' M$ a/ E, T! H
  24. * include uart.c in Library Setting for UART0$ [; L0 u( r( c5 `7 ]" t; G
  25. */
    ) ^& v7 t, M, q+ g/ i7 ]& l6 s
  26.     MFP_P31_UART0_TXD;                              // UART0 TXD use P0.5
      A6 E4 t0 d9 n. i2 T
  27.     P31_QUASI_MODE;                                 // set P0.5  as Quasi mode for UART0 trasnfer7 O/ y& L7 C' u! B
  28.     UART_Open(24000000,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 115200
    1 V# W# V# b' z/ f; h, \* U
  29.     ENABLE_UART0_PRINTF;  
    - i" _% k/ x/ |+ i  O
  30. /*$ U8 E2 M" U! l! _
  31.   ADCS to trig ADC convert
    : i) \9 v' ~% C, Q2 q; M$ j
  32.   * include adc.c in Library for ADC initial setting
    / _2 |( F4 O" A' y2 x
  33. */
    0 j; p8 i5 j6 z8 X6 l% X
  34.     ADC_Open(ADC_SINGLE,1);                                        //Enable ADC_CH4
    4 X% z6 M& N9 L( x/ @  t
  35.     ADC_ConvertTime(3,7);. Q7 a( Z! l, q$ l
  36. //* find ADC result in ADC interrupt*/- m6 K& Y  C' k) v7 ~
  37.                                             
    4 X- H- B2 o7 A4 B; @7 N
  38.     while(1)
    : x; ?+ ]! O4 l' N3 _) W) X, B/ E
  39.     {
    : k7 w' I/ @& f# I: W
  40.         set_ADCCON0_ADCS;                           // Software trig adc start7 e" p+ `6 M8 E( ~. J
  41.         while((ADCCON0|CLR_BIT7)==CLR_BIT7);         // wait ADCF = 1;/ X/ y* J) L# T, a$ X% F4 I3 R' Y
  42.         ADCRESULT = (ADCRH<<4)+ADCRL;
    $ L& l, N- L" m3 ?: e6 K% d
  43.         printf("\n ADC result = %d  ", ADCRESULT);
    0 u% J4 J; f2 t- T! t1 C/ F- G- b- G
  44.         Timer0_Delay(24000000,100,5000);
    : h" g; ]0 C) u5 X! \& t1 Z6 n# W
  45.                                 Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));
    ) ?6 M& l, h# j' w1 ?
  46.                                 printf("\n Rval=%d Ohm",(unsigned int)Rval);; L# H0 o1 u) H9 r( ]9 I% g% {
  47.                                 temp=Res_to_Tem(Rval);( d) U  v* r3 |% ]/ `. e
  48.                                 printf("\n temp=%.2f",temp-K);
    7 H- T8 `5 R& j4 z& @" Y, q
  49.                                 printf("\n----------------");                                       * l' D4 Y6 ], B7 H
  50.     }+ A. Z! ~- `3 d
  51.   $ X$ r+ B& F1 N
  52. }
复制代码
将阻抗转换为温度作为一个独立的头文件NTC.h. }/ i5 A+ ~+ s/ Q9 D3 `) c

  1. ' r- ]- ?+ o. Z8 ~2 K- T8 v
  2. #define K 273.158 O5 {' ?+ u7 x* t6 X" b: N/ x6 W
  3. #define T0 (25.0+K)
    * ]! _! C: X9 Q
  4. #define R0 10000.04 l& T  _* [: a# n
  5. #define B 3455.0          O' w( G1 g$ `0 W4 o" T, T
  6. : Q0 w  h/ d( A
  7. /*
    % c1 ?5 `  P% W$ _: W3 g4 h
  8. 电阻值换算到温度' j& _# c8 R$ c) g% T% }- f
  9. adc_val:NTC当前的阻抗值,单位欧姆
    ( T! |2 b* V- R$ n) o
  10. 返回值:摄氏度
    8 @/ v  ]8 l% y, b$ f; Q+ [
  11. */% F- T5 t8 h9 N- U
  12. " _+ j( Q, A5 f) s- O
  13. float Res_to_Tem(float adc_val)
    8 Z2 m5 }% ^* C" T0 D
  14. {
    9 C% L+ ^# g/ @3 T6 L8 o9 ~0 j
  15.         float temp;8 S7 j; i( g0 |9 D6 J, z
  16.         temp=1/((1/T0)+(log(adc_val/R0)/B));
    + L8 G1 ?' Z* D0 Q/ V0 j
  17.         return temp-K;
    " b3 P' ]2 e6 a7 s
  18. }
复制代码
$ j2 W& N% g* E/ o2 x3 l
这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。 微信图片_20210120122105.png , X5 ~' C# |! h) w3 D
手册还给出的查表方法,给出了几个特殊点,如下图所示* ^& S0 K' A+ Y0 I, l& k
微信图片_20210120122109.png
5 k0 z& |: F& U# O# J
1 ~) e5 M! _1 b3 V* m. j
绘制出曲线如下图所示。* D/ z% E$ B9 F) f/ F# r
微信图片_20210120122111.png 9 n; K% J. r0 w2 o- a8 U4 O

) k& @3 k: U  w
点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。4 R2 q+ J5 Z. `3 @3 _( S
微信图片_20210120122114.png
' B/ R6 Z* s; c5 w3 u/ M% X  @1 s! k3 z# Z
赞 收藏 评论0 发布时间:2021-1-20 12:22

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版