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

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

[复制链接]
gaosmile 发布时间:2021-1-20 12:22
NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
微信图片_20210120122056.png
微信图片_20210120122059.png / d6 g, e* ^7 A* }
7 t1 y8 I1 D- f( h1 L" Y
我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
微信图片_20210120122102.png - y5 t& g# p  _& ~" Z
实现温度转换
根据手册提供的公式:R=R0 exp B(1/T - 1/T0);其中R是待测电阻,R0是某个温度T0 K下的已知电阻,B是温度传感器常数。

& |6 y& ~" |4 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计算。
完成代码如下所示。. o% n8 H' [2 b) n
  1. 7 q5 K! d& p& P. e
  2. //***********************************************************************************************************5 B+ Z6 R: N3 y6 }/ `1 m
  3. //  File Function: ML51 series ADC software trigger on shot demo code3 C5 o4 P6 X# F4 c4 _6 C
  4. //***********************************************************************************************************3 U4 P! v1 o, U3 T( O
  5. #include "ML51.h"
      f0 L6 _( F& r. ?
  6. #include "math.h"% Z# {0 ^8 |6 z, A
  7. #include "NTC.h"
    . h3 i+ ?* R3 m
  8. /******************************************************************************
    8 s+ `9 c0 ?. K2 B
  9. The main C function.  Program execution starts( s% H" e, H/ P- M4 R4 `( ~
  10. here after stack initialization.1 m* |, r7 h" I9 d/ A- E
  11. ******************************************************************************/- |0 \. b& o% _. C% G; J: J4 s8 V

  12. 6 d/ L! \( e+ N. f4 ]6 S
  13. 6 f. W  g$ t9 z" g6 i# {

  14. ! ~! `* Z0 H' d6 R
  15. void main ()( [- S! n4 r0 P' y  T
  16. {
    % z- p5 N5 a4 z* U7 n( {& h, c
  17.   unsigned int ADCRESULT;. g. `& k7 X+ Y, W- s! [0 o
  18.         float Rval;
    . R& F. B$ k) d( k2 u% b
  19.         float temp;, h- L' k/ }6 a) I. q0 B. O6 w2 |

  20. ! T- |9 j' Y/ q8 i- p; I: L
  21. /*
    1 K* R' x4 x* M" G, b$ I, Z/ _
  22. For UART0 P0.5 TXD output setting
    4 W: \* ?9 D! T+ i# b' q  `
  23. * include gipo.c in Library for GPIO mode setting
    7 P& T4 B7 ]! Y% T& U4 a& g
  24. * include uart.c in Library Setting for UART09 \: `3 N% M: n& \- _& b, A
  25. */. O+ a0 h) @* s5 y
  26.     MFP_P31_UART0_TXD;                              // UART0 TXD use P0.5
    ( U6 a5 a/ y7 ]6 @1 V+ }# a4 Q
  27.     P31_QUASI_MODE;                                 // set P0.5  as Quasi mode for UART0 trasnfer/ D5 s8 Z; h% s/ |
  28.     UART_Open(24000000,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 1152007 b+ Y4 o9 X. h5 j! {
  29.     ENABLE_UART0_PRINTF;  
    3 Y( O/ K" A& R  U$ Z4 P5 e8 Y
  30. /*' x. {8 D+ P, Z/ _7 v- _; B
  31.   ADCS to trig ADC convert
    ) }. w% r1 B3 j6 P" g! s& N
  32.   * include adc.c in Library for ADC initial setting
    , Y3 N& y" b) |
  33. */- }) G2 {4 H9 z/ \* g5 h4 m
  34.     ADC_Open(ADC_SINGLE,1);                                        //Enable ADC_CH4
    2 E$ B/ }2 e0 l& P
  35.     ADC_ConvertTime(3,7);
    ; d) E$ T! z2 n5 D( J# j. c
  36. //* find ADC result in ADC interrupt*/
    : ?1 D4 d7 M+ n1 p
  37.                                             ) P9 ?. K! M$ h, T4 y" _- k
  38.     while(1)
    + O; d1 y$ \. {  \/ g
  39.     {
    ' G4 l8 _, J& ~, r2 \+ g$ ?7 I/ V$ R
  40.         set_ADCCON0_ADCS;                           // Software trig adc start
    - Z% q  ~" o( r' ]4 C7 N( H
  41.         while((ADCCON0|CLR_BIT7)==CLR_BIT7);         // wait ADCF = 1;. c3 T1 h0 }; Z) b
  42.         ADCRESULT = (ADCRH<<4)+ADCRL;
      u' Q* H& Q/ U* K- ?5 g* n; X5 D& J
  43.         printf("\n ADC result = %d  ", ADCRESULT);" h6 L0 ^* [# B' r1 k% y
  44.         Timer0_Delay(24000000,100,5000);
    9 t$ K- @. I. k6 ]) b7 G
  45.                                 Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));
    9 a; B: G( {) x- M% J$ X6 w( c# Z
  46.                                 printf("\n Rval=%d Ohm",(unsigned int)Rval);( U8 M6 V; I6 e, L: A3 _5 m
  47.                                 temp=Res_to_Tem(Rval);
    / X, v. r6 d( Z) D$ Q" M3 h; H
  48.                                 printf("\n temp=%.2f",temp-K);8 N. c! m# ~/ p
  49.                                 printf("\n----------------");                                       & q# u) \; X& C8 r& \& \
  50.     }
    5 A2 J6 i: t: y
  51.   
      B  E0 U0 ?; D5 s% @
  52. }
复制代码
将阻抗转换为温度作为一个独立的头文件NTC.h. A6 u, c/ _7 ^9 }
  1. * B  b$ m, a9 j
  2. #define K 273.156 a( K8 x, `8 g
  3. #define T0 (25.0+K)4 D6 z/ _4 G+ j+ x- j/ i
  4. #define R0 10000.0
    & W- M9 l/ d, [
  5. #define B 3455.0        / f4 S' ^+ D+ e5 |3 M3 @* S

  6. . f* }/ r6 J" r% A9 P
  7. /*( b' e) M( f; o9 T, [5 s- ?
  8. 电阻值换算到温度( E/ p6 k( O9 c( A; `9 o
  9. adc_val:NTC当前的阻抗值,单位欧姆! W% v$ J/ f' ?- Y* S
  10. 返回值:摄氏度
    6 m- ?  J# D3 R' s
  11. */
    " x  Z) H$ ?% m+ `0 i# [* v0 ^/ |& N- `+ D% `
  12. 1 T* n# P8 T: j$ S
  13. float Res_to_Tem(float adc_val)
    " g2 b: g  A0 A3 `3 y
  14. {
    . W; N' ]3 _! F5 n, Q7 S3 W0 U! O
  15.         float temp;! `; L2 N- ~" P4 T& @) n# v- t
  16.         temp=1/((1/T0)+(log(adc_val/R0)/B));6 k/ y$ ]: a" s7 ~, r0 J( k: s
  17.         return temp-K;
    9 v1 i8 C& k6 ?- c. |! y2 t3 |2 F8 O* G
  18. }
复制代码
1 j; o, J# H& W" l) F7 N3 a
这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。 微信图片_20210120122105.png ' `+ N- y3 b! L  n7 w6 H
手册还给出的查表方法,给出了几个特殊点,如下图所示8 x5 {' R; Y& _) i9 l. t. |
微信图片_20210120122109.png   r" k' m- N' J4 F
$ T- @. a4 N2 x  ^2 r. Q
绘制出曲线如下图所示。- [9 W5 e# w- F6 b6 ~- p7 O
微信图片_20210120122111.png
' j  z+ g/ w+ H: B) i2 u; z0 d3 y9 U, _/ z6 E& N0 u4 T
点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。) O  L* x* q1 f1 }& F. I% l
微信图片_20210120122114.png
# A2 d8 L* g$ e$ W5 N/ F% w. f1 {- {' }
收藏 评论0 发布时间:2021-1-20 12:22

举报

0个回答

所属标签

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