|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MAX31865是一款设计简洁且功能强大的热敏电阻至数字输出转换器,特别适用于铂电阻温度检测器(RTD)的应用。该器件通过外部电阻设置RTD的灵敏度,并利用高精度Δ-Σ模数转换器(ADC)将RTD电阻与基准电阻的比值转换为数字信号输出。其输入端具备高达±45V的过压保护,并能检测RTD及电缆的开路、短路情况,因此在医疗、工业、温度控制、卫星、气象以及阻值计算等高精度温度测量领域得到了广泛应用。
3 e) H. ^% M. s2 p8 p; M) G; l# [& ?( r/ K
. o! V' f1 G$ [/ i& }) M
9 P! o) e# [0 R- u& |0 Z飞凌嵌入式基于瑞芯微RK3562处理器推出的OK3562J-C开发板,在P8插针引脚上预留了SPI2接口,包括:1 {5 ^# P9 N) v3 s2 y! I6 M
# k7 D: }$ w: h. d1 `
SPI2_CLK_M0、SPI2_CSN0_M0、SPI2_MOSI_M0和SPI2_MISO_M0。
, z$ t5 p9 s4 A9 ?6 h0 [9 a$ n
+ f( @5 u1 \" T2 \7 P" a' ? " k5 u$ M& `+ q3 H8 k0 G a
5 a! H# V6 P! ?
本文将详细介绍如何在飞凌嵌入式RK3562开发板上使用SPI2接口挂载MAX31865数字式RTD温度传感器。
4 f0 v6 _- J: i6 C+ x0 D( v' p( h- N Z. o/ {' P
: u+ B* x' R* l5 m, c$ V6 c& P& H) E! s7 c
u& N4 i1 g+ Z& H) b9 X2 R [backcolor=rgba(0, 0, 0, 0.1)]
! E( V! V. @3 Q9 e- Y3 w[backcolor=rgba(0, 0, 0, 0.1)]8 g4 X9 N5 E5 r; J# |* ?
% r; F/ S7 n- G& E 9 C; r6 `8 ~7 Z0 j
3 { R7 D+ Z$ X* P7 Z, J" a$ x, V: f R
/ w! z- T0 A4 \, N! s/ |0 A3 G
/ K g! h4 K) v0 D& H
2 }' K. b6 `1 k+ w4 O
* k0 D1 p( Z9 `8 s+ m
" ?* c- x/ U5 Z; u% e+ J9 g9 h2 y# F' M% H( ^
一、添加SPI设备的思路/ f5 P. c; ?- y+ h; A) {8 \/ P; w+ S
在飞凌嵌入式RK3562开发板上添加一个新的SPI设备,通常需要遵循以下步骤:
& W( E9 C3 k& Y7 G J$ }( y! U( y2 s* {. T7 h
- 在设备树中添加相应设备的描述。
, g+ o" P9 K4 u8 g0 l" E# W - 确保设备树描述与设备驱动相匹配。
2 S. Z! H. k; Z; K# }! K - 将设备驱动添加到内核中。( x/ N3 p9 Y& m8 n% o. P
* w7 I3 |: U C4 i 5 l6 L% }; r. f0 ^- g7 O4 y
6 I* D" T$ z# x8 y; F; M
二、具体实现方法# h! k' U8 C1 C' F4 R( S
1. 接线方式
' J9 b5 y, }' f4 |9 t% ~MAX31865支持2线、3线和4线接线方式。为了简化接线并减少引线数量,我们选择3线接线方式。3线连接是一种折中方案,通过从(RTDIN+ RTDIN-)中减去FORCE+和RTDIN+之间的电压来补偿导线上的压降,利用FORCE2对输入采样实现。如果电缆电阻具有较好的一致性,这种方法可以有效消除电缆电阻引入的误差。在接线之前,需要按照下图将模块焊接成3线模式。
?3 [6 t$ O: i/ \; `6 t3 d7 n7 D2 l1 R2 o% j
0 J7 ~( G, d8 g. [2 ]) s0 [5 s! ]5 u9 j, t% N4 F' y1 _1 I
2 X9 O; a. H% v, q [backcolor=rgba(0, 0, 0, 0.1)]
/ o6 p9 ?' R$ S M' j5 u$ v[backcolor=rgba(0, 0, 0, 0.1)]
4 L: T! r* _4 c0 a& V" Z* }: Q
2 X# C' y9 I( C( q: L1 V2 C
& [2 e7 |$ u3 j0 x9 w8 C
! X' p4 \9 W/ q- o$ J
3 {( C: o/ M9 \3 f
: Y0 I0 J, G$ U8 y( X/ _5 ~$ V5 W! c9 q" |. n2 X
. @6 \5 S$ h/ t5 l
1 C' M. W& ~* z1 Y: x
}3 U" Y$ c7 m+ ^" q* U' F
9 H9 R2 ]6 M5 i7 ^2. 设备树配置
1 {2 L5 h5 z) {2 @$ s在设备树中添加MAX31865的相关描述。由于我们采用的是3线接法,因此需要添加maxim,3-wire参数。 H5 u3 }6 k- f# ^8 ^- H, f) y
% T: r6 |0 u2 f0 c) p" O. T4 r3 D
, w J: e; B( o% t
[backcolor=rgba(0, 0, 0, 0.1)]: V* v9 [' c2 L I2 s: k
[backcolor=rgba(0, 0, 0, 0.1)]
4 s+ ]- y! e% F% o3 b" _& X2 _' @1 Z5 O) S
" T$ X( D; t3 y' h; x, L& c% I
6 |, ~# J- \6 h3 I* A
$ ^" e2 m, U( ` V& {7 _4 _
, r8 I' t4 J: [) ^+ s/ R3 w. Y+ ^
0 S% ], p N e( `! X9 x( d& s, W+ s7 L! }
- }9 ~1 b U9 w
' }0 f- h2 j; h8 [5 N6 @3 Y2 w
* Q' N' m9 i1 @ G1 S3. 驱动编译与加载" i1 \- i3 Z8 `* g+ P
(1)在内核源码的/drivers目录下创建max31865文件夹,并添加max31865.c和Makefile文件。
) L2 y/ x; c) X( V
' J" U W4 {9 M7 J' {7 H
/ H: R' _# x/ S+ L8 f' ~- K2 b& \% e0 p" ~7 W/ K7 X9 d: U9 t
! i! u+ {7 o5 m [backcolor=rgba(0, 0, 0, 0.1)]
! `! T( D3 ]9 X7 C- |5 o[backcolor=rgba(0, 0, 0, 0.1)]
5 Y& ], w4 i7 h3 e4 {
& |7 N7 M2 w, f 5 g0 Q% |' G* B
# Q7 G% @6 m. U7 L/ x
9 t9 ^, u( B( d$ w, o5 G* |
1 U8 B% a+ w- j! X% T* }6 I+ k N6 Z6 _' B
1 i# V$ G5 J& o+ E6 s( U
* ]4 i" s) ~$ f
' I$ u& m3 E3 M1 p$ ] [backcolor=rgba(0, 0, 0, 0.1)]- b4 x4 _/ D4 ?1 G( W: T: l& o
[backcolor=rgba(0, 0, 0, 0.1)]! i+ ^6 G1 h$ d
' f2 S4 u8 I& z$ J7 J
- M$ X+ }( I' ~2 u7 V
/ n3 u R2 h0 `6 y) s/ Z( B; I/ ?: Z a" |
) Z+ s( f b! V7 G6 j
: ^/ E& `5 m5 [" _2 Y8 n& c
, D3 @8 ]; C8 W9 v# K0 V
* i5 E9 P/ f4 |1 j
2 f+ u7 `+ H! |1 B* w; p% q" C3 c2 t" B k/ O0 V& v1 ~# f4 A
(2)修改父目录/kernel/drivers/Makefile文件,添加对max31865目录的编译支持。具体修改如下:8 e2 V3 J0 {) Q3 L" U
1 W' L) d9 v. F8 j. ?2 P* J# E/drivers/max31865/Makefile内容:
1 D' y1 z" _! G9 r& d5 ^
; T" v ^; q; ?; z# v, }4 E, B' k+ fmakefile复制代码obj-m += max31865.o- y" c% g7 {' ^! U# I
: [& {; @# A! C, ~
# W5 A4 y8 z; W* b* z/kernel/drivers/Makefile添加:
, r3 S _3 ?* k; Q# J. d' y6 F3 }* ]( X6 R
makefile复制代码obj-y += max31865
; O4 i1 p R- U+ O7 b2 Y2 e, b
1 ~& @6 v+ L+ K9 W0 m" U6 b e5 k0 P% C- C5 U8 W' q
执行./build.sh kernel脚本编译内核,编译完成后,在/drivers/max31865目录下会生成max31865.ko模块。
0 T1 e/ j- t7 x& f0 v$ X& K
2 u5 ]; Y: w: O7 ^7 G% A/ z
; A3 Y# ~7 c% q. I; j7 l# |* F [backcolor=rgba(0, 0, 0, 0.1)]
( j2 {4 i* g( b[backcolor=rgba(0, 0, 0, 0.1)]1 T6 u9 H4 m( e; L
9 q" n$ c% {4 Z( `4 T9 _" R" _+ T
3 O8 |/ }& f7 N, G3 h
+ J; t7 k9 J' P' a4 X. N) t
9 U) ~) S3 \/ Y( r8 m: I
X) H9 v4 s* h
2 ~. a) M/ \5 V
! \ B+ l% q9 \1 b7 [6 k4 G! y1 Y9 O9 y7 v* r2 m% E% p$ c
4 v3 n: j6 O0 `; s
2 r+ V% n4 k* u! R
(3)将max31865.ko模块拷贝到飞凌嵌入式RK3562开发板中,并执行insmod max31865.ko命令加载模块。; q( }) f$ x3 S9 b) C( U
+ g* f" H5 |" x+ [! z }' d5 b! L7 C
[backcolor=rgba(0, 0, 0, 0.1)]1 w. S9 G [+ D
[backcolor=rgba(0, 0, 0, 0.1)]
# m! S. a- F, g6 M1 q( g$ D, S( n2 ^- ~3 C6 K
]: U$ ?0 {: q9 Q4 y& e
3 c# t: q3 L' S
) w+ E) K( q6 S' Y( q L2 q/ A
8 t+ D& c3 P1 [$ x$ }% S( t
0 d) w, [6 r; O8 j" R0 w% n- n# \) u# _9 m) [ i* T& w' l
! R3 H7 K& b/ g% a( m
/ d X* Q q. P3 Y7 I4 [( O- g$ f/ H
8 Z* Q/ _) m* n! ]# c5 U
4. 测试与验证/ N; h5 t1 f5 l! A4 z' H9 }; d# |
使用22Ω的电阻模拟铂电阻,通过以下命令查看ADC的原始值:& M" ~1 C3 t b. g
D# x9 l |4 `1 V0 Zbash复制代码cat /sys/bus/iio/devices/iio:device2/in_temp_raw: \) F2 }% b# B) G: [, ~. {* O
# o0 O3 a9 _0 x8 q [backcolor=rgba(0, 0, 0, 0.1)]7 F9 n5 E5 L% w7 T0 N* ^5 v/ \4 g
[backcolor=rgba(0, 0, 0, 0.1)]
, ?3 I$ V" \4 i# Z
( c7 ]0 O; G& N" s/ O: o% O+ @& P 7 }/ f( Q3 i) ?- ]( j- b
# H8 B# V+ B5 |3 g9 D$ L
4 T$ I6 W' N( i0 q9 F* k$ c7 x3 {1 C! b* J
. J( e9 D8 O5 i. W' [! l$ D4 P. ~( X! @6 K5 R
5 D5 X+ n& W- c$ h/ r: J
1 R' Z& Q% T0 t; k9 d
4 y5 Q* A5 L0 a6 L6 i2 ~& b4 l
观察到22Ω电阻对应的ADC值为1655。与芯片手册中的值进行对比,确认该值在正常范围内,对应的温度大约在-190℃左右。
7 s. B% ?/ o+ Z7 @/ V. I$ {- c
' @, P8 J3 R* K$ p5 L, G. z [backcolor=rgba(0, 0, 0, 0.1)]1 T1 Z" Y$ m: l( f3 K! V
[backcolor=rgba(0, 0, 0, 0.1)]' y. `7 H+ B" b- F$ k
. m8 Q7 s y- W* K" v & W8 W% x6 M0 }2 ~6 ^: t& H5 J: j
8 o( u; ~7 M: J) s* e4 n* _' `$ o) P5 [) Y
2 ], y" t: L# v+ a! _" k2 Q6 I% l& t% x K# E; `0 g, `) t
$ ]8 C9 a% p. D8 l \* \
0 X5 b4 U" _: l
5 ~: G; @0 \. a
1 Y2 }0 c" b/ [. ]0 g至此,我们成功在飞凌嵌入式RK3562开发板上通过SPI2接口挂载了MAX31865数字式RTD温度传感器。开发者可以根据读取到的ADC原始值,开发自己的应用来对应当前测量的温度。. T/ A. d$ G/ a1 Y8 I- `0 F8 s
) x9 e* K! |( O7 I8 q! L/ e6 N( O4 e/ y# H8 ^
|
|