NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
% _) V& q6 R: P& J
0 n4 n7 }, d) [% H
我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
' `) 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- " h! m" ^* {- r9 ~
- //***********************************************************************************************************
# B2 V# W$ _# z" ~8 [& O" ` - // File Function: ML51 series ADC software trigger on shot demo code
. y; n* f" e! D q: A, M - //***********************************************************************************************************
9 y% E D' }- n6 G. d0 { - #include "ML51.h"
. T( v0 V" k1 q9 I" J - #include "math.h"6 o& O; e( W6 @- Q, x
- #include "NTC.h"7 V: A, u* Q* @ v
- /******************************************************************************
/ P9 b% i" U) X2 b1 z, s% n! x' p' X - The main C function. Program execution starts
" z# p& x, A% j [# u A; v - here after stack initialization.
0 j- \, @8 s, @2 e; H - ******************************************************************************/+ C& g$ {+ n' N; h) n E
- * ^9 ]( j$ k' i- A
- ; K. U4 O- J7 Z+ R! l. d. A# Q
- , c: k8 P' ?# S4 i3 Y- [
- void main ()/ a* M5 y! L! V
- {
0 [' i4 \6 ~ }- d' G - unsigned int ADCRESULT;
% N$ H: l6 R, ^' x, O. a8 R8 | - float Rval;4 x% I2 ^8 X- C" V( z
- float temp;
! W6 ^4 v/ W' a& F- N; Z& p8 Z+ u7 N: m - 3 i! A5 l }* E* d( W
- /*
2 [* Q0 p- j" Q. i" V) E& ` - For UART0 P0.5 TXD output setting- K' q7 n8 u2 @. \7 A( I' T
- * include gipo.c in Library for GPIO mode setting
& Y/ `: l$ C9 E: F - * include uart.c in Library Setting for UART0
3 E; Y8 x) ? D$ k - */
) {5 W' L2 p9 |9 f( z" c$ f - MFP_P31_UART0_TXD; // UART0 TXD use P0.59 S; |, n' q) u% A- D5 K2 O3 _! X
- P31_QUASI_MODE; // set P0.5 as Quasi mode for UART0 trasnfer# x2 v4 y4 v- Z" j% c3 L
- UART_Open(24000000,UART0_Timer3,115200); // Open UART0 use timer1 as baudrate generate and baud rate = 115200
& W# V& H9 G& X/ o) ` - ENABLE_UART0_PRINTF;
3 K' u/ u( y, M - /*6 d0 K6 K m: Q+ v
- ADCS to trig ADC convert
/ x: T* q$ S' u: {4 N$ Y - * include adc.c in Library for ADC initial setting
# g) f" F C4 [# d& n1 }* K) P - */
$ t0 C( K7 x: M+ a* X* {! L. D5 d - ADC_Open(ADC_SINGLE,1); //Enable ADC_CH48 K7 R1 k4 Y/ m4 C. X* l- T
- ADC_ConvertTime(3,7);
! `9 B/ d7 S) e2 J6 I - //* find ADC result in ADC interrupt*/! F5 E M/ z. E0 Z
-
: m; {) N( Y* m - while(1)8 D) }1 h( E5 s. `; X4 z
- {
; w7 T4 Z9 {! D - set_ADCCON0_ADCS; // Software trig adc start7 k/ h& G/ l+ F5 ~8 x* H
- while((ADCCON0|CLR_BIT7)==CLR_BIT7); // wait ADCF = 1;4 z$ V6 k. f! |3 `( L5 |" i
- ADCRESULT = (ADCRH<<4)+ADCRL;1 e, u# Y& c7 z& z% e j) ~
- printf("\n ADC result = %d ", ADCRESULT);
" s! K& K, b5 A6 D - Timer0_Delay(24000000,100,5000);
4 K# e2 R8 X2 H& }+ s1 w - Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));
; E) E( _4 T% N4 ^0 F- h - printf("\n Rval=%d Ohm",(unsigned int)Rval);; B% U) q: G t! I
- temp=Res_to_Tem(Rval);! g! B: c2 b( R) c: x9 J( g
- printf("\n temp=%.2f",temp-K);( |. ~$ J( z# K3 T3 P
- printf("\n----------------");
, J5 ]; d3 O- L. I - }/ ~3 ^7 n/ M, o+ t0 B" n4 `3 Y
- ) _/ g- K3 w% S
- }
复制代码 将阻抗转换为温度作为一个独立的头文件NTC.h. Z- Q+ n0 v% l
- 3 Y4 D# C( x% x$ b5 V
- #define K 273.15
3 T! f! w9 V8 Z' T7 f - #define T0 (25.0+K)) l7 o3 z& ^! e) f6 i# Z$ z
- #define R0 10000.03 C6 o; h4 M) d
- #define B 3455.0
% R9 N5 J% \4 _ - 1 b7 h* V' W: t9 t
- /*3 Q$ [3 h t- E3 b9 s/ Y& L
- 电阻值换算到温度; A. N* m! H- ]) l' O6 G
- adc_val:NTC当前的阻抗值,单位欧姆
( y7 G/ E; h1 l' i$ c, E - 返回值:摄氏度
2 _. E- a; N, N! b - */
& v/ J5 c7 t' Q7 \7 M
6 A8 q3 d! ~' Y* {* b" I8 @- float Res_to_Tem(float adc_val)
* I) J/ p' r9 s* M - {
, S" z/ P( m. J" u, m4 E6 L1 v - float temp;
6 R s1 W$ \- `, z; U% b' ?7 w - temp=1/((1/T0)+(log(adc_val/R0)/B));
+ ? W' x, n. p3 | - return temp-K;# w, Y1 t% x) S( {" }, x b
- }
复制代码
U' f5 @' R$ q$ T1 V7 N4 h这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。
% K& Y c# E* ~5 P8 ^( ?9 B手册还给出的查表方法,给出了几个特殊点,如下图所示
9 c. p+ j7 s2 x8 Q8 ? }# z) W
- ^5 f4 }/ R* ^: e; h; {
* P2 `# K$ \/ O. N/ \
绘制出曲线如下图所示。
' e+ x( t, [. p" q
# d4 w- P& Z$ F1 _
# v0 K2 A7 V* ]! {5 Z+ @: P点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。) j$ ?( _2 K# Z/ k
+ ?6 i b n3 B) l* l4 i
6 Z) c8 d+ R' [5 K6 I |