这两天测试了一下板载的IIS2DH加速度传感器,这是一款低功耗的3轴加速度计,低功耗时能达到2uA,在工业领域广泛应用。从原理图上看,也是连接了SPI3接口,如图1所示:
2 n9 a) M3 r7 o, Z8 t8 E7 d
' o8 p& l& J( Q, B
8 B/ G+ }6 ~: A q2 h
# F" b$ [% x, m/ Q5 G+ c- X$ R图1 u' n4 ~) u5 k; a0 C! {
除了INT2和CS引脚需要重新配置,其他的配置和上一篇是相同的,在CubeMx中很方便重新建立工程文件。想着测试应该是很顺利的,但是能读Device ID,不能读取数据,一度不知道什么原因。隔了一天发现,是CS引脚在程序中搞错了,很多问题往往都是粗心大意导致的。来看软件,初始定义还是参考官方的例程,库也是使用官方的,这样测试比较节省时间。3 ^ z0 L: b. X- s! \
初始化如下:
0 s% ^1 z% M/ [5 u- dev_ctx .write_reg = platform_write ;
$ V5 {' w/ ]* o/ q& s0 R2 u - dev_ctx .read_reg = platform_read ;
. r0 f8 P+ Y. j8 ^( G - dev_ctx .handle = &hspi3 ;
* g9 M/ y2 M! F9 _( |. o) J2 G - HAL_Delay(10);7 C; _$ m$ h. k' y
-
2 y" J* Z) w6 o. [ - // IIS2DH_ReadID(&Obj ,&whoamI);+ z9 O9 R+ P0 a1 _# V
- iis2dh_device_id_get(&dev_ctx, &whoamI);% ]) r: s8 u; T, ~8 H
- // 1 R9 m' F/ Z4 A7 C: H7 K/ a' x
- // IIS2DH_Init(&Obj);3 z+ R. R2 I. q- h
* n$ f2 _) l, ^- iis2dh_block_data_update_set(&dev_ctx , PROPERTY_ENABLE);
. ? c" Y; T8 O" c% G - /* Set Output Data Rate to 1Hz */8 b. W# b( v" ?: Y
- iis2dh_data_rate_set(&dev_ctx , IIS2DH_ODR_1Hz);0 |* _ k/ h1 t: K2 f
- /* Set full scale to 2g */
& r4 i9 a/ k0 {5 F- q [4 Y - iis2dh_full_scale_set(&dev_ctx , IIS2DH_2g);& v% s7 [ K2 f, m& g. L# p! A% z
- // /* Enable temperature sensor */0 H1 T$ C& A, S$ A# r2 [% v
- iis2dh_temperature_meas_set(&dev_ctx, IIS2DH_TEMP_ENABLE);
# p! {/ i+ Y7 P' J" D! Q% o. ^0 H: E - // /* Set device in continuous mode with 12 bit resol. */
( B& E' k3 }% |3 ` - iis2dh_operating_mode_set(&dev_ctx , IIS2DH_HR_12bit);
复制代码 8 R! n! S- j6 S* Z ^
8 z0 }5 a: V3 e( h+ v9 N& U
读取加速度数据如下:
% s1 m2 a1 r5 d- iis2dh_xl_data_ready_get(&dev_ctx , &ddbyte );0 \ i8 s% ~& f/ }+ i/ [
- if(ddbyte )( ^+ h) g8 S `" j, b3 b
- {
- j7 ` a4 ~( V5 `! Z. | - /* Read accelerometer data */
. g0 z1 M. G" T) H- _2 X - memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
: d0 i, U8 t0 P* R I - " k& O6 P$ X5 I( A3 f, p ^9 {; k
- iis2dh_acceleration_raw_get(&dev_ctx , data_raw_acceleration);
0 A6 h5 _; v5 j; n- Q1 L -
( S/ ]8 {! p( \: ] - acceleration_mg[0] =iis2dh_from_fs2_hr_to_mg(data_raw_acceleration[0]);
* o5 o/ J1 N& I2 N* T. t -
1 ^/ Q9 G" z+ z. Q- Z& E - acceleration_mg[1] =iis2dh_from_fs2_hr_to_mg(data_raw_acceleration[1]);
! o) `, u6 B% Y6 @) Q. }7 I -
) E3 O$ j- P+ y9 d - acceleration_mg[2] = iis2dh_from_fs2_hr_to_mg(data_raw_acceleration[2]);8 n; f# F* \' g# X
- }
复制代码
" O& P$ X6 @0 e0 ~% k: i. Y% v" f }' s- }( g
读取温度数据如下:
9 z+ |9 q% N6 f% K6 |7 z' ?/ |" N9 y8 V( }6 E
iis2dh_temp_data_ready_get(&dev_ctx , &ddbyte );
9 |4 Z5 t+ i, r! H* u
/ ]8 C7 E$ F! b) f6 b7 ~) T1 I if (ddbyte)
6 P0 e0 ]5 h& Q9 q$ f {, L- c" R# i' c# b) y/ v$ L+ R
/* Read temperature data */. s/ d y9 f- E* h4 b& }
memset(&data_raw_temperature, 0x00, sizeof(int16_t));$ X; j+ c. J: L; ]
iis2dh_temperature_raw_get(&dev_ctx, &data_raw_temperature);7 y( T7 h9 s4 \9 A* X
temperature_degC =iis2dh_from_lsb_hr_to_celsius(data_raw_temperature);/ o h$ Q* s9 d+ a! m, C: n
}
. B0 Q& d3 |; A# d; X6 L) J$ E) k, v/ y. K) g9 ~* |2 w9 x8 U O8 \
测量结果如图2所示:
4 ]* s/ }8 {; @/ J+ ?
' n K) u2 U( L' C2 T0 ~0 L$ o! x1 x) K; `
图2+ u0 Q: {6 e" |1 k, L) [0 A, B
有一些功能还没测试,要深入学习才有所得。1 v" b6 h R q$ y$ }( g: @
|
這個時候測功耗意義不大吧
共同学习