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

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

[复制链接]
gaosmile 发布时间:2021-1-20 12:22
NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
微信图片_20210120122056.png
微信图片_20210120122059.png 7 l# G0 `; P" r* c5 x$ u/ Q$ v2 f

) U8 u( r! B7 u7 r6 x) q5 j, ]我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
微信图片_20210120122102.png
" r/ ?! A2 G  f6 ]( \( @实现温度转换
根据手册提供的公式:R=R0 exp B(1/T - 1/T0);其中R是待测电阻,R0是某个温度T0 K下的已知电阻,B是温度传感器常数。
, |* ]; ~( N! }* }' d( f0 \7 J" S
通过以上公式反推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计算。
完成代码如下所示。( R$ J+ M; x- H7 P2 y' E

  1. 7 A: W/ _$ W/ f# E: w, z2 A
  2. //***********************************************************************************************************/ P4 x2 Z" ?4 ]7 \: {8 o* {# A
  3. //  File Function: ML51 series ADC software trigger on shot demo code, b# Q- z% g0 @. T3 v4 r
  4. //***********************************************************************************************************
    : C# h3 w  m& s& l8 u7 O
  5. #include "ML51.h"  T& X4 \3 A# a6 s* m
  6. #include "math.h"
    ! ]6 X! J. @# g& W1 X
  7. #include "NTC.h"
    $ j, t" ~" ^$ G9 t& A  l
  8. /******************************************************************************( E$ ]2 L5 U5 k$ @7 H) p" f$ H
  9. The main C function.  Program execution starts
    # Q; E) j, {7 j8 i
  10. here after stack initialization." v! V' _4 f" v. e/ ?
  11. ******************************************************************************/4 Z2 g& e! W$ c1 F
  12. 1 G# G, a# W$ U- I
  13. . _% o+ N7 X) b2 p! U+ I# `
  14. 8 `4 |: Z9 h7 g9 a! h: j" Z  q
  15. void main ()
    , m# C3 x# J0 g& p) ?/ e
  16. {
    % Y( N, C' \; S8 Z( A3 Y( y
  17.   unsigned int ADCRESULT;2 T* p$ v# K: F* E& d( M( t' G
  18.         float Rval;1 `" G1 R  l5 y5 Y0 e# G
  19.         float temp;
    # W& L: M7 V: C  I, F0 \

  20. . b7 l* n: v2 t9 I7 b* m7 ?' ~2 I
  21. /*
    & d  c& m: t: ^8 L/ a
  22. For UART0 P0.5 TXD output setting
    + x1 m2 t. b3 [
  23. * include gipo.c in Library for GPIO mode setting- f6 H8 i9 O9 x" ?( T
  24. * include uart.c in Library Setting for UART02 j+ ~6 h" ]/ `- ?4 Y; L6 I: I
  25. */
    ) ^) D0 q- M% z# {% W
  26.     MFP_P31_UART0_TXD;                              // UART0 TXD use P0.5. s1 V* Z0 _: A& J* `9 L% J
  27.     P31_QUASI_MODE;                                 // set P0.5  as Quasi mode for UART0 trasnfer, i& j/ r* I4 H, |/ |
  28.     UART_Open(24000000,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 115200
    : B/ |: s; W1 k% A
  29.     ENABLE_UART0_PRINTF;  
    , u5 u# Y1 i2 _, ]
  30. /** H' P# O% ^4 I
  31.   ADCS to trig ADC convert7 G- L8 {2 o. ]4 z. ^
  32.   * include adc.c in Library for ADC initial setting
    0 j. |# O( _: G4 F  x5 O
  33. */
    # g6 D) A5 [/ H
  34.     ADC_Open(ADC_SINGLE,1);                                        //Enable ADC_CH4  L1 _, z, ]& C
  35.     ADC_ConvertTime(3,7);! d( b+ t4 x1 F0 k9 Q! o8 o
  36. //* find ADC result in ADC interrupt*/" L  U* n' f$ t: ^. }& L
  37.                                             
    " W" o5 l  D. D
  38.     while(1)/ Q$ z0 ~; h' y+ ~! u, }
  39.     {
    ' ^- n( N3 N0 p6 l0 s9 H/ {
  40.         set_ADCCON0_ADCS;                           // Software trig adc start
    ( W$ J0 f3 a: w2 M6 [0 `
  41.         while((ADCCON0|CLR_BIT7)==CLR_BIT7);         // wait ADCF = 1;
    / ~5 W- f2 }- y% Y' K0 [
  42.         ADCRESULT = (ADCRH<<4)+ADCRL;1 o7 B) A# p! _7 U- a
  43.         printf("\n ADC result = %d  ", ADCRESULT);, h+ P5 Q. _" U8 K5 ?2 p! y9 h: i
  44.         Timer0_Delay(24000000,100,5000);0 N4 V7 z, l( |6 ~9 [2 t" Y/ T) s( v
  45.                                 Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));/ W7 b) a1 }! [0 U8 V0 v
  46.                                 printf("\n Rval=%d Ohm",(unsigned int)Rval);; Z7 n# t: F+ @6 j- O5 e
  47.                                 temp=Res_to_Tem(Rval);) G, E, x8 R7 N$ |) X7 x
  48.                                 printf("\n temp=%.2f",temp-K);
    ' m: h/ Z/ z4 l2 |! f% ~, `2 [
  49.                                 printf("\n----------------");                                       
    7 Y& q. ~, m9 f4 ]: F* k1 [1 K
  50.     }
    ; v4 k  W7 i8 m) h% S+ [
  51.   " q5 H, [$ p, P, I* Q: K" S: \5 m3 j
  52. }
复制代码
将阻抗转换为温度作为一个独立的头文件NTC.h
7 ]; }* \: i9 ^% Y- S$ l
  1. / x; ?' f2 |. w4 I, |7 [8 a# q
  2. #define K 273.15. j+ g$ D; n3 d" b2 c5 N
  3. #define T0 (25.0+K)
    ' l9 i2 ]8 N% |9 M
  4. #define R0 10000.0$ R$ ~/ k% x3 w- a9 t: u) n% |
  5. #define B 3455.0        - o* q" _( a6 I- L
  6. + Z4 u2 t2 S* y1 D( L* o1 V
  7. /*
    , `- n( f3 S, I  [7 W. c
  8. 电阻值换算到温度
    " I% E$ e* k2 a
  9. adc_val:NTC当前的阻抗值,单位欧姆
    0 }4 j- ]& I' E. {# w! u/ ^) h# f
  10. 返回值:摄氏度  j( A, c+ P6 d/ Q
  11. */
    $ b- p9 s: y# d, C! ^  \( Q* |+ k
  12. , Q: m% L* }6 \) H
  13. float Res_to_Tem(float adc_val)9 M- j4 ]& P* d7 b& ^
  14. {
    8 F6 w8 ?# {5 J; d% }+ O, @) Y
  15.         float temp;
    & Y2 y4 s4 ~; \  J
  16.         temp=1/((1/T0)+(log(adc_val/R0)/B));
    + c4 R% f) F5 }: W) z4 [/ }* a
  17.         return temp-K;" S4 N7 T: a' r$ K' U
  18. }
复制代码

( }! L( Z6 e4 Z% c; K
这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。 微信图片_20210120122105.png
9 R$ x6 D* }& |! n1 U8 d
手册还给出的查表方法,给出了几个特殊点,如下图所示5 X6 n! _5 {3 c- x7 @
微信图片_20210120122109.png 3 F# \, D" F' n& R) t1 p
$ I- w& o7 u4 L( o
绘制出曲线如下图所示。
; A" `% I: o% F7 H# r 微信图片_20210120122111.png
+ H' ^6 d, E8 D& k% V% u+ x& j& ~; I
点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。& m0 N' a9 b* w7 G7 w: a
微信图片_20210120122114.png
  U8 d* Y* v4 m" V* k! Z2 {9 b- X9 D( d3 o$ j) a. {
收藏 评论0 发布时间:2021-1-20 12:22

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版