NTC传感器如下图所示,NTC的阻抗随着温度升高而降低。手册给出了阻抗到温度的转换公式。
7 l# G0 `; P" r* c5 x$ u/ Q$ v2 f
) U8 u( r! B7 u7 r6 x) q5 j, ]我们可以通过ML51单片机提供的12位ADC来读取该串联电阻的分压,从而根据参考电阻计算出传感器的阻抗,然后利用手册的温度计算公式计算出温度。下图是手册给出的几个常用计算常数B,可根据测量的范围合理的选择,用于提高测量精度。
" 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
7 A: W/ _$ W/ f# E: w, z2 A- //***********************************************************************************************************/ P4 x2 Z" ?4 ]7 \: {8 o* {# A
- // File Function: ML51 series ADC software trigger on shot demo code, b# Q- z% g0 @. T3 v4 r
- //***********************************************************************************************************
: C# h3 w m& s& l8 u7 O - #include "ML51.h" T& X4 \3 A# a6 s* m
- #include "math.h"
! ]6 X! J. @# g& W1 X - #include "NTC.h"
$ j, t" ~" ^$ G9 t& A l - /******************************************************************************( E$ ]2 L5 U5 k$ @7 H) p" f$ H
- The main C function. Program execution starts
# Q; E) j, {7 j8 i - here after stack initialization." v! V' _4 f" v. e/ ?
- ******************************************************************************/4 Z2 g& e! W$ c1 F
- 1 G# G, a# W$ U- I
- . _% o+ N7 X) b2 p! U+ I# `
- 8 `4 |: Z9 h7 g9 a! h: j" Z q
- void main ()
, m# C3 x# J0 g& p) ?/ e - {
% Y( N, C' \; S8 Z( A3 Y( y - unsigned int ADCRESULT;2 T* p$ v# K: F* E& d( M( t' G
- float Rval;1 `" G1 R l5 y5 Y0 e# G
- float temp;
# W& L: M7 V: C I, F0 \
. b7 l* n: v2 t9 I7 b* m7 ?' ~2 I- /*
& d c& m: t: ^8 L/ a - For UART0 P0.5 TXD output setting
+ x1 m2 t. b3 [ - * include gipo.c in Library for GPIO mode setting- f6 H8 i9 O9 x" ?( T
- * include uart.c in Library Setting for UART02 j+ ~6 h" ]/ `- ?4 Y; L6 I: I
- */
) ^) D0 q- M% z# {% W - MFP_P31_UART0_TXD; // UART0 TXD use P0.5. s1 V* Z0 _: A& J* `9 L% J
- P31_QUASI_MODE; // set P0.5 as Quasi mode for UART0 trasnfer, i& j/ r* I4 H, |/ |
- UART_Open(24000000,UART0_Timer3,115200); // Open UART0 use timer1 as baudrate generate and baud rate = 115200
: B/ |: s; W1 k% A - ENABLE_UART0_PRINTF;
, u5 u# Y1 i2 _, ] - /** H' P# O% ^4 I
- ADCS to trig ADC convert7 G- L8 {2 o. ]4 z. ^
- * include adc.c in Library for ADC initial setting
0 j. |# O( _: G4 F x5 O - */
# g6 D) A5 [/ H - ADC_Open(ADC_SINGLE,1); //Enable ADC_CH4 L1 _, z, ]& C
- ADC_ConvertTime(3,7);! d( b+ t4 x1 F0 k9 Q! o8 o
- //* find ADC result in ADC interrupt*/" L U* n' f$ t: ^. }& L
-
" W" o5 l D. D - while(1)/ Q$ z0 ~; h' y+ ~! u, }
- {
' ^- n( N3 N0 p6 l0 s9 H/ { - set_ADCCON0_ADCS; // Software trig adc start
( W$ J0 f3 a: w2 M6 [0 ` - while((ADCCON0|CLR_BIT7)==CLR_BIT7); // wait ADCF = 1;
/ ~5 W- f2 }- y% Y' K0 [ - ADCRESULT = (ADCRH<<4)+ADCRL;1 o7 B) A# p! _7 U- a
- printf("\n ADC result = %d ", ADCRESULT);, h+ P5 Q. _" U8 K5 ?2 p! y9 h: i
- Timer0_Delay(24000000,100,5000);0 N4 V7 z, l( |6 ~9 [2 t" Y/ T) s( v
- Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));/ W7 b) a1 }! [0 U8 V0 v
- printf("\n Rval=%d Ohm",(unsigned int)Rval);; Z7 n# t: F+ @6 j- O5 e
- temp=Res_to_Tem(Rval);) G, E, x8 R7 N$ |) X7 x
- printf("\n temp=%.2f",temp-K);
' m: h/ Z/ z4 l2 |! f% ~, `2 [ - printf("\n----------------");
7 Y& q. ~, m9 f4 ]: F* k1 [1 K - }
; v4 k W7 i8 m) h% S+ [ - " q5 H, [$ p, P, I* Q: K" S: \5 m3 j
- }
复制代码 将阻抗转换为温度作为一个独立的头文件NTC.h
7 ]; }* \: i9 ^% Y- S$ l- / x; ?' f2 |. w4 I, |7 [8 a# q
- #define K 273.15. j+ g$ D; n3 d" b2 c5 N
- #define T0 (25.0+K)
' l9 i2 ]8 N% |9 M - #define R0 10000.0$ R$ ~/ k% x3 w- a9 t: u) n% |
- #define B 3455.0 - o* q" _( a6 I- L
- + Z4 u2 t2 S* y1 D( L* o1 V
- /*
, `- n( f3 S, I [7 W. c - 电阻值换算到温度
" I% E$ e* k2 a - adc_val:NTC当前的阻抗值,单位欧姆
0 }4 j- ]& I' E. {# w! u/ ^) h# f - 返回值:摄氏度 j( A, c+ P6 d/ Q
- */
$ b- p9 s: y# d, C! ^ \( Q* |+ k - , Q: m% L* }6 \) H
- float Res_to_Tem(float adc_val)9 M- j4 ]& P* d7 b& ^
- {
8 F6 w8 ?# {5 J; d% }+ O, @) Y - float temp;
& Y2 y4 s4 ~; \ J - temp=1/((1/T0)+(log(adc_val/R0)/B));
+ c4 R% f) F5 }: W) z4 [/ }* a - return temp-K;" S4 N7 T: a' r$ K' U
- }
复制代码
( }! L( Z6 e4 Z% c; K这样就可以直接调用得出摄氏度了。本例子,采用串口打印的测量结果如下图所示。
9 R$ x6 D* }& |! n1 U8 d手册还给出的查表方法,给出了几个特殊点,如下图所示5 X6 n! _5 {3 c- x7 @
3 F# \, D" F' n& R) t1 p
$ I- w& o7 u4 L( o
绘制出曲线如下图所示。
; A" `% I: o% F7 H# r
+ H' ^6 d, E8 D& k% V% u+ x& j& ~; I
点评:NTC测量温度成本低,响应迅速,只需要使用1路ADC通道即可。比数字类型的温度计驱动更加容易,使用更加灵活,还可以自己实现校准功能。& m0 N' a9 b* w7 G7 w: a
U8 d* Y* v4 m" V* k! Z2 {9 b- X9 D( d3 o$ j) a. {
|