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

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

[复制链接]
gaosmile 发布时间:2021-1-20 12:22
NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
微信图片_20210120122056.png
微信图片_20210120122059.png % _) V& q6 R: P& J
0 n4 n7 }, d) [% H
我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
微信图片_20210120122102.png
' `) G- y: [! y* q% y实现温度转换
根据手册提供的公式:R=R0 exp B(1/T - 1/T0);其中R是待测电阻,R0是某个温度T0 K下的已知电阻,B是温度传感器常数。
! l/ j; [; N9 a* Z( U
通过以上公式反推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计算。
完成代码如下所示。
% k3 a# }* V. [! U7 Z
  1. " h! m" ^* {- r9 ~
  2. //***********************************************************************************************************
    # B2 V# W$ _# z" ~8 [& O" `
  3. //  File Function: ML51 series ADC software trigger on shot demo code
    . y; n* f" e! D  q: A, M
  4. //***********************************************************************************************************
    9 y% E  D' }- n6 G. d0 {
  5. #include "ML51.h"
    . T( v0 V" k1 q9 I" J
  6. #include "math.h"6 o& O; e( W6 @- Q, x
  7. #include "NTC.h"7 V: A, u* Q* @  v
  8. /******************************************************************************
    / P9 b% i" U) X2 b1 z, s% n! x' p' X
  9. The main C function.  Program execution starts
    " z# p& x, A% j  [# u  A; v
  10. here after stack initialization.
    0 j- \, @8 s, @2 e; H
  11. ******************************************************************************/+ C& g$ {+ n' N; h) n  E
  12. * ^9 ]( j$ k' i- A
  13. ; K. U4 O- J7 Z+ R! l. d. A# Q
  14. , c: k8 P' ?# S4 i3 Y- [
  15. void main ()/ a* M5 y! L! V
  16. {
    0 [' i4 \6 ~  }- d' G
  17.   unsigned int ADCRESULT;
    % N$ H: l6 R, ^' x, O. a8 R8 |
  18.         float Rval;4 x% I2 ^8 X- C" V( z
  19.         float temp;
    ! W6 ^4 v/ W' a& F- N; Z& p8 Z+ u7 N: m
  20. 3 i! A5 l  }* E* d( W
  21. /*
    2 [* Q0 p- j" Q. i" V) E& `
  22. For UART0 P0.5 TXD output setting- K' q7 n8 u2 @. \7 A( I' T
  23. * include gipo.c in Library for GPIO mode setting
    & Y/ `: l$ C9 E: F
  24. * include uart.c in Library Setting for UART0
    3 E; Y8 x) ?  D$ k
  25. */
    ) {5 W' L2 p9 |9 f( z" c$ f
  26.     MFP_P31_UART0_TXD;                              // UART0 TXD use P0.59 S; |, n' q) u% A- D5 K2 O3 _! X
  27.     P31_QUASI_MODE;                                 // set P0.5  as Quasi mode for UART0 trasnfer# x2 v4 y4 v- Z" j% c3 L
  28.     UART_Open(24000000,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 115200
    & W# V& H9 G& X/ o) `
  29.     ENABLE_UART0_PRINTF;  
    3 K' u/ u( y, M
  30. /*6 d0 K6 K  m: Q+ v
  31.   ADCS to trig ADC convert
    / x: T* q$ S' u: {4 N$ Y
  32.   * include adc.c in Library for ADC initial setting
    # g) f" F  C4 [# d& n1 }* K) P
  33. */
    $ t0 C( K7 x: M+ a* X* {! L. D5 d
  34.     ADC_Open(ADC_SINGLE,1);                                        //Enable ADC_CH48 K7 R1 k4 Y/ m4 C. X* l- T
  35.     ADC_ConvertTime(3,7);
    ! `9 B/ d7 S) e2 J6 I
  36. //* find ADC result in ADC interrupt*/! F5 E  M/ z. E0 Z
  37.                                             
    : m; {) N( Y* m
  38.     while(1)8 D) }1 h( E5 s. `; X4 z
  39.     {
    ; w7 T4 Z9 {! D
  40.         set_ADCCON0_ADCS;                           // Software trig adc start7 k/ h& G/ l+ F5 ~8 x* H
  41.         while((ADCCON0|CLR_BIT7)==CLR_BIT7);         // wait ADCF = 1;4 z$ V6 k. f! |3 `( L5 |" i
  42.         ADCRESULT = (ADCRH<<4)+ADCRL;1 e, u# Y& c7 z& z% e  j) ~
  43.         printf("\n ADC result = %d  ", ADCRESULT);
    " s! K& K, b5 A6 D
  44.         Timer0_Delay(24000000,100,5000);
    4 K# e2 R8 X2 H& }+ s1 w
  45.                                 Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));
    ; E) E( _4 T% N4 ^0 F- h
  46.                                 printf("\n Rval=%d Ohm",(unsigned int)Rval);; B% U) q: G  t! I
  47.                                 temp=Res_to_Tem(Rval);! g! B: c2 b( R) c: x9 J( g
  48.                                 printf("\n temp=%.2f",temp-K);( |. ~$ J( z# K3 T3 P
  49.                                 printf("\n----------------");                                       
    , J5 ]; d3 O- L. I
  50.     }/ ~3 ^7 n/ M, o+ t0 B" n4 `3 Y
  51.   ) _/ g- K3 w% S
  52. }
复制代码
将阻抗转换为温度作为一个独立的头文件NTC.h. Z- Q+ n0 v% l
  1. 3 Y4 D# C( x% x$ b5 V
  2. #define K 273.15
    3 T! f! w9 V8 Z' T7 f
  3. #define T0 (25.0+K)) l7 o3 z& ^! e) f6 i# Z$ z
  4. #define R0 10000.03 C6 o; h4 M) d
  5. #define B 3455.0        
    % R9 N5 J% \4 _
  6. 1 b7 h* V' W: t9 t
  7. /*3 Q$ [3 h  t- E3 b9 s/ Y& L
  8. 电阻值换算到温度; A. N* m! H- ]) l' O6 G
  9. adc_val:NTC当前的阻抗值,单位欧姆
    ( y7 G/ E; h1 l' i$ c, E
  10. 返回值:摄氏度
    2 _. E- a; N, N! b
  11. */
    & v/ J5 c7 t' Q7 \7 M

  12. 6 A8 q3 d! ~' Y* {* b" I8 @
  13. float Res_to_Tem(float adc_val)
    * I) J/ p' r9 s* M
  14. {
    , S" z/ P( m. J" u, m4 E6 L1 v
  15.         float temp;
    6 R  s1 W$ \- `, z; U% b' ?7 w
  16.         temp=1/((1/T0)+(log(adc_val/R0)/B));
    + ?  W' x, n. p3 |
  17.         return temp-K;# w, Y1 t% x) S( {" }, x  b
  18. }
复制代码

  U' f5 @' R$ q$ T1 V7 N4 h
这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。 微信图片_20210120122105.png
% K& Y  c# E* ~5 P8 ^( ?9 B
手册还给出的查表方法,给出了几个特殊点,如下图所示
9 c. p+ j7 s2 x8 Q8 ?  }# z) W 微信图片_20210120122109.png - ^5 f4 }/ R* ^: e; h; {
* P2 `# K$ \/ O. N/ \
绘制出曲线如下图所示。
' e+ x( t, [. p" q 微信图片_20210120122111.png
# d4 w- P& Z$ F1 _
# v0 K2 A7 V* ]! {5 Z+ @: P
点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。) j$ ?( _2 K# Z/ k
微信图片_20210120122114.png
+ ?6 i  b  n3 B) l* l4 i
6 Z) c8 d+ R' [5 K6 I
收藏 评论0 发布时间:2021-1-20 12:22

举报

0个回答

所属标签

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