|
NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
/ u) l+ S$ h" i* \8 I
7 F, {. x% r' Y0 e1 b! o
我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
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
, p. L) Z' K, M6 y0 n- //***********************************************************************************************************2 w6 c* y) k+ t& W3 L7 n
- // File Function: ML51 series ADC software trigger on shot demo code
+ G0 U) w7 U2 k/ n" A6 s - //***********************************************************************************************************
* I4 t9 |! _7 p - #include "ML51.h"
, Q8 ~ G% J% P3 O; X( l - #include "math.h"
7 c& U& k: ^$ t; [ J( M - #include "NTC.h"
3 i8 L) s7 w$ w- w% r: Y - /******************************************************************************( U* R# l/ D- E. V4 ^$ x2 {& @
- The main C function. Program execution starts
7 r& d) h+ D' z4 n: D - here after stack initialization.
; q1 X3 J7 W, ^* ?* m( d - ******************************************************************************/
- l1 D$ t9 ^& e% g1 W
5 ~1 X9 U) P' b9 I3 I" U: x7 ~- 8 B5 d2 U( l c; ?8 m, G- T) P
# v' D/ h$ K g4 ?- void main ()& `6 |7 k* ?; n% w
- {
$ m. x5 d1 [* T9 O3 x* R( o# p) x - unsigned int ADCRESULT;" |) u* \4 m2 u r2 {' r [( ]
- float Rval;! A1 [" ?$ L0 @8 k
- float temp;
4 \+ Q$ R% K6 D9 V
3 A1 q& l3 o$ _; {: t- /*0 _2 c @* x8 K/ `1 Z7 [2 k
- For UART0 P0.5 TXD output setting
* J1 ~& P m1 E( j( r# Y - * include gipo.c in Library for GPIO mode setting! f% w C. ^7 ?' M$ a/ E, T! H
- * include uart.c in Library Setting for UART0$ [; L0 u( r( c5 `7 ]" t; G
- */
) ^& v7 t, M, q+ g/ i7 ]& l6 s - MFP_P31_UART0_TXD; // UART0 TXD use P0.5
A6 E4 t0 d9 n. i2 T - P31_QUASI_MODE; // set P0.5 as Quasi mode for UART0 trasnfer7 O/ y& L7 C' u! B
- 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 - ENABLE_UART0_PRINTF;
- i" _% k/ x/ |+ i O - /*$ U8 E2 M" U! l! _
- ADCS to trig ADC convert
: i) \9 v' ~% C, Q2 q; M$ j - * include adc.c in Library for ADC initial setting
/ _2 |( F4 O" A' y2 x - */
0 j; p8 i5 j6 z8 X6 l% X - ADC_Open(ADC_SINGLE,1); //Enable ADC_CH4
4 X% z6 M& N9 L( x/ @ t - ADC_ConvertTime(3,7);. Q7 a( Z! l, q$ l
- //* find ADC result in ADC interrupt*/- m6 K& Y C' k) v7 ~
-
4 X- H- B2 o7 A4 B; @7 N - while(1)
: x; ?+ ]! O4 l' N3 _) W) X, B/ E - {
: k7 w' I/ @& f# I: W - set_ADCCON0_ADCS; // Software trig adc start7 e" p+ `6 M8 E( ~. J
- while((ADCCON0|CLR_BIT7)==CLR_BIT7); // wait ADCF = 1;/ X/ y* J) L# T, a$ X% F4 I3 R' Y
- ADCRESULT = (ADCRH<<4)+ADCRL;
$ L& l, N- L" m3 ?: e6 K% d - printf("\n ADC result = %d ", ADCRESULT);
0 u% J4 J; f2 t- T! t1 C/ F- G- b- G - Timer0_Delay(24000000,100,5000);
: h" g; ]0 C) u5 X! \& t1 Z6 n# W - Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));
) ?6 M& l, h# j' w1 ? - printf("\n Rval=%d Ohm",(unsigned int)Rval);; L# H0 o1 u) H9 r( ]9 I% g% {
- temp=Res_to_Tem(Rval);( d) U v* r3 |% ]/ `. e
- printf("\n temp=%.2f",temp-K);
7 H- T8 `5 R& j4 z& @" Y, q - printf("\n----------------"); * l' D4 Y6 ], B7 H
- }+ A. Z! ~- `3 d
- $ X$ r+ B& F1 N
- }
复制代码 将阻抗转换为温度作为一个独立的头文件NTC.h. }/ i5 A+ ~+ s/ Q9 D3 `) c
' r- ]- ?+ o. Z8 ~2 K- T8 v- #define K 273.158 O5 {' ?+ u7 x* t6 X" b: N/ x6 W
- #define T0 (25.0+K)
* ]! _! C: X9 Q - #define R0 10000.04 l& T _* [: a# n
- #define B 3455.0 O' w( G1 g$ `0 W4 o" T, T
- : Q0 w h/ d( A
- /*
% c1 ?5 ` P% W$ _: W3 g4 h - 电阻值换算到温度' j& _# c8 R$ c) g% T% }- f
- adc_val:NTC当前的阻抗值,单位欧姆
( T! |2 b* V- R$ n) o - 返回值:摄氏度
8 @/ v ]8 l% y, b$ f; Q+ [ - */% F- T5 t8 h9 N- U
- " _+ j( Q, A5 f) s- O
- float Res_to_Tem(float adc_val)
8 Z2 m5 }% ^* C" T0 D - {
9 C% L+ ^# g/ @3 T6 L8 o9 ~0 j - float temp;8 S7 j; i( g0 |9 D6 J, z
- temp=1/((1/T0)+(log(adc_val/R0)/B));
+ L8 G1 ?' Z* D0 Q/ V0 j - return temp-K;
" b3 P' ]2 e6 a7 s - }
复制代码 $ j2 W& N% g* E/ o2 x3 l
这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。
, X5 ~' C# |! h) w3 D
手册还给出的查表方法,给出了几个特殊点,如下图所示* ^& S0 K' A+ Y0 I, l& k
5 k0 z& |: F& U# O# J
1 ~) e5 M! _1 b3 V* m. j绘制出曲线如下图所示。* D/ z% E$ B9 F) f/ F# r
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
' B/ R6 Z* s; c5 w3 u/ M% X @1 s! k3 z# Z
|