你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STWINKT1B评测】2.初步测试IIS3DWB振动传感器

[复制链接]
jundao721 发布时间:2024-7-30 21:42
      根据AN5444应用笔记介绍,IIS3DWB是一款高性能MEMS三轴振动传感器,具有超宽带宽低噪声等特点,SPI标准接口输出。具体的介绍可参考AN5444应用笔记。本次先对该传感器有个初步的数据读取测试,关于滤波等后面学习时再添加。
2 v. O* X) M/ s  E7 o. l+ j     原理图关于该部分的说明,如图1所示:2 J! w$ V4 @( G) Q/ z3 H, Y
2-2.JPG
% x1 G/ V1 b  a4 V3 g, {2 @  j图1
; u; |2 Q/ I/ x1 {. z2 B3 b" a0 L5 |$ o$ J, U4 J1 F0 I
    先使用CubeMx建立工程,时钟等正常配置即可,因为要使用SPI通讯,所以引脚配置如图2:  H# l7 }6 k  y0 G( N* f
7 r; U# A7 R+ d/ M
2-3.JPG
( \) q1 p$ o  k; F7 p9 z
/ |, a. K+ D& j
图2( O1 Y# N8 I, A4 Y& L
   SPI外设参数的基本配置如图3:
" ~/ A! V" }" x/ b# r  o5 f0 c 2-4.JPG & F! L$ H  b1 {# y+ Q# P! P# R1 ?
7 d( T, g9 h( w6 T: C7 g7 `
图3* \- c3 G/ w! _/ N6 f( J8 U# x
  然后生成项目。在官方提供的文件中有IIS3DWB的驱动,4个文件,如图4所示:6 `" |2 }- }9 @; Q) g1 f
2-5.JPG " T4 _1 z' u. ?4 m

" |4 V( }" n' _- q) ]# K& t4 f) s图4
& x0 r( Z3 e$ Y- k  例程是参考官方github中提供的参考例程,修改了一下,增加了温度读取。初始化如下:
2 p+ y; @# n  J& _
  1. dev_ctx.write_reg = platform_write;0 h# F8 j( W- Z, ]8 w! q
  2. dev_ctx.read_reg = platform_read;
    $ ]9 }1 L2 i3 j& J
  3. dev_ctx.handle = &hspi3;
    % Q$ {9 B9 E8 g

  4. + `. m% U3 w) n! `; E# S8 S% }+ a
  5. HAL_Delay (10);
    . s/ J! n$ ?6 K& b& T8 p- ?7 v
  6. iis3dwb_device_id_get(&dev_ctx, &whoamI);
    ) }* L! U9 L( R( \) \- m( s7 J
  7. // 复位设备% Q9 O( t  |8 {3 q2 _& M* F
  8. iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);4 `4 d2 G6 M) h; q8 g- k
  9. // 配置加速度计
    3 W& C4 f) s$ ^5 `9 I
  10. iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);/ |; H& u, A6 ~# O- y( @6 t
  11. iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);3 I9 {$ X8 p. r- X* w
  12. iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
复制代码

4 t, Z7 e9 n2 }" n% M
( h6 b) |- {5 h2 j+ R) v  对于加速度值和温度的读取程序如下:
4 v0 Q* E8 r# B# i
  1.   // 读取加速度数据
    & `0 g4 a5 o. s
  2.    ; e" F7 _# P7 X
  3.         iis3dwb_xl_flag_data_ready_get(&dev_ctx, &drdy);//读取状态值
    " E4 f8 D, s; s2 P" m
  4.         if (drdy) {" g7 c6 f7 D7 T+ {0 Y9 P
  5.            7 n9 x! w) @3 m
  6.             iis3dwb_acceleration_raw_get(&dev_ctx, data_raw);1 d2 E& d! [0 [0 I6 _
  7.             ; }) u" [) z: i  R; {: B) W  ?+ J
  8.             acceleration_mg[0] = iis3dwb_from_fs2g_to_mg(data_raw[0]);* }; g: d" b1 L0 Y' P. N- C
  9.             acceleration_mg[1] = iis3dwb_from_fs2g_to_mg(data_raw[1]);
    2 a* |5 j/ L/ O4 d9 r
  10.             acceleration_mg[2] = iis3dwb_from_fs2g_to_mg(data_raw[2]);6 G# Q4 R. ^+ k! h5 f" l
  11.         }
    : [; D/ Y" o" P% N' D' C; G
  12.                 iis3dwb_read_reg (&dev_ctx ,IIS3DWB_OUT_TEMP_L ,temp_data ,2);, `9 u2 V8 P0 P$ J. |7 H. `
  13.                 temp_raw = (int16_t )((temp_data [1]<<8) | temp_data[0]);
    - U2 ?% N. e7 [" j  ?+ U$ N9 b
  14.                 temp_cel = temp_raw /256+25;; p2 f( I/ A2 S% ~: N( {
  15. - |! F$ x) k- ~4 K- K6 [! Q
  16.         HAL_Delay(1000); // 每秒读取一次数据
复制代码
  1. . W9 q! y; [: E& i+ U2 h+ \
复制代码
# v4 x% X( |* ?6 O+ m8 k/ {
  W( _, Z, w4 M& u. L6 p
  测试结果如图5所示:
1 i- ^/ T# y% J+ a/ q 2-1.JPG 5 o4 V9 m3 K4 t5 ]$ m1 O, O- T' {" k9 H8 Q

( ?; p+ q; q8 R' n4 W$ \2 b图5
+ g1 B+ d: k- i/ X; ]; G8 h( s( tDevice ID和温度值是正确的,滤波,FIFO等功能的增加一边理解一边添加测试。
9 X  J: C1 E$ |. r
: ^1 F7 ~- {3 y8 D* a1 E6 d3 s
4 I2 P1 H& F; ]3 ^: U
收藏 评论12 发布时间:2024-7-30 21:42

举报

12个回答
Minerva_ 回答时间:2025-3-17 11:42:19

jundao721 发表于 2025-3-16 09:43
这是我SPI3的基本配置,程序的话初始化完后,延时十几毫秒,再去读whoamI,别的基本上都是官库里的,正常 ...

感谢博主指导,我已经调试完成,发现是在使用spi3时只在spi.h文件中声明了spi3,并没有在main.h中声明,在声明之后后获取了数据,再次感谢博主的答疑,辛苦您了(鞠躬)

image.png

STMCU-管管 回答时间:2024-10-18 09:39:30

感谢分享

你也是双下巴 回答时间:2024-10-18 10:09:24
做温湿度显示意味着穿戴设备这个STWINKT1B是不是可以做
$ z4 C( L0 X% a9 @+ x( m8 \
养乐多 回答时间:2024-10-18 10:15:17
你也是双下巴 发表于 2024-10-18 10:097 @' W- Y$ }5 s; Q
做温湿度显示意味着穿戴设备这个STWINKT1B是不是可以做
, q, k# S/ h+ k  ?# F! K/ y7 f9 ?
这个板子肯定可以吧,性能满强的
你也是双下巴 回答时间:2024-10-18 10:15:59

养乐多 发表于 2024-10-18 10:15
这个板子肯定可以吧,性能满强的

确实,大佬

ghost110 回答时间:2024-10-18 10:36:38

感谢分享,学习

Minerva_ 回答时间:2025-3-9 21:28:41

你好博主,麻烦问一下您配置这个振动传感器的时候是怎么配置的呢,我看官方的应用笔记上面说明片选在拉低的时候才能用spi,但我配置之后仍然无法读到数据(可以的话能麻烦您分享一下源码我学习一下吗,谢谢您😄 )

jundao721 回答时间:2025-3-14 18:03:31

Minerva_ 发表于 2025-3-9 21:28
你好博主,麻烦问一下您配置这个振动传感器的时候是怎么配置的呢,我看官方的应用笔记上面说明片选在拉 ...

[md]不知道是否调通了,我是参考的官方的例程,cubemx配置好SPI后,将传感器的.c 和.h文件移植过来,在main函数中初始化即可。源代码我得找找,有什么问题可以随时留言交流。

Minerva_ 回答时间:2025-3-15 21:50:36

jundao721 发表于 2025-3-14 18:03
不知道是否调通了,我是参考的官方的例程,cubemx配置好SPI后,将传感器的.c 和.h文件移植过来,在ma ...

[md]我在cubeMX中直接配置了IIS3DWB的驱动文件,然后在官方的例程中进行了修改,但是貌似读取不到设备的ID,麻烦您看一下我这里的配置是有什么问题吗,谢谢您image.png

![image.png](data/attachment/forum/202503/15/214729d6o77wdnrv2ewwqz.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png"

image.png

define CS_up_GPIO_Port GPIOE

define CS_up_Pin GPIO_PIN_14

/ Private variables ---------------------------------------------------------/

static int16_t data_raw_acceleration[3];

//static int16_t data_raw_temperature;

static float acceleration_mg[3];

//static float temperature_degC;

static uint8_t whoamI = 0;

//static uint8_t tx_buffer[1000];

extern SPI_HandleTypeDef hspi3;

/ Extern variables ----------------------------------------------------------/

/ Private functions ---------------------------------------------------------/

/*

  • WARNING:
  • Functions declare in this section are defined at the end of this file
  • and are strictly related to the hardware platform used.

*/

static int32_t platform_write(void handle, uint8_t reg, const uint8_t bufp,

                      uint16_t len);

static int32_t platform_read(void handle, uint8_t reg, uint8_t bufp,

                     uint16_t len);

//static void tx_com( uint8_t *tx_buffer, uint16_t len );

static void platform_delay(uint32_t ms);

//static void platform_init(void);

/ Main Example --------------------------------------------------------------/

void iis3dwb_read_data_polling(void)

{

stmdev_ctx_t dev_ctx;

/ Initialize mems driver interface /

dev_ctx.write_reg = platform_write;

dev_ctx.read_reg = platform_read;

dev_ctx.handle = &hspi3;

/ Init test platform /

// platform_init();

/ Wait sensor boot time /

platform_delay(BOOT_TIME);

/ Check device ID /

iis3dwb_device_id_get(&dev_ctx, &whoamI);

uint8_t ctrl_reg;

iis3dwb_read_reg(&dev_ctx, IIS3DWB_CTRL1_XL, &ctrl_reg, 1);

printf("CTRL1_XL: 0x%02X\n", ctrl_reg);

// if (whoamI != IIS3DWB_ID)

// while (1);

/ Restore default configuration /

iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);

// do {

// iis3dwb_reset_get(&dev_ctx, &rst);

// } while (rst);

/ Enable Block Data Update /

iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

/ Set Output Data Rate /

iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);

/ Set full scale /

iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);

/* Configure filtering chain(No aux interface)

  • Accelerometer low pass filter path

*/

iis3dwb_xl_filt_path_on_out_set(&dev_ctx, IIS3DWB_LP_ODR_DIV_100);

/ Read samples in polling mode (no int) /

while (1) {

uint8_t reg;

/ Read output only if new xl value is available /

iis3dwb_xl_flag_data_ready_get(&dev_ctx, &reg);

if (reg) {

/ Read acceleration field data / // memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));

iis3dwb_acceleration_raw_get(&dev_ctx, data_raw_acceleration);

acceleration_mg[0] =

iis3dwb_from_fs2g_to_mg(data_raw_acceleration[0]);

acceleration_mg[1] =

iis3dwb_from_fs2g_to_mg(data_raw_acceleration[1]);

acceleration_mg[2] =

iis3dwb_from_fs2g_to_mg(data_raw_acceleration[2]);

}

HAL_Delay(100); // iis3dwb_temp_flag_data_ready_get(&dev_ctx, &reg);

//

// if (reg) {

// / Read temperature data /

// memset(&data_raw_temperature, 0x00, sizeof(int16_t));

// iis3dwb_temperature_raw_get(&dev_ctx, &data_raw_temperature);

// temperature_degC = iis3dwb_from_lsb_to_celsius(data_raw_temperature);

// sprintf((char *)tx_buffer,

// "Temperature [degC]:%6.2f\r\n", temperature_degC);

//// tx_com(tx_buffer, strlen((char const *)tx_buffer));

// }

}

}

/*

  • @brief Write generic device register (platform dependent)
  • @param handle customizable argument. In this examples is used in
  • order to select the correct sensor bus handler.
    • @param reg register to write
    • @param bufp pointer to data to write in register reg
    • @param len number of consecutive register to write
    • */

static int32_t platform_write(void handle, uint8_t reg, const uint8_t bufp,

                      uint16_t len)

{

//#ifdef STEVAL_MKI109V3

//

// if (handle == &hspi2) {

HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_RESET);

HAL_SPI_Transmit(handle, &reg, 1, 1000);

HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);

HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_SET); // }

//

//#elif defined(SPC584B_DIS)

// / Add here the SPC5 write SPI interface /

//#endif

return 0;

}

/*

  • @brief Read generic device register (platform dependent)
  • @param handle customizable argument. In this examples is used in
  • order to select the correct sensor bus handler.
    • @param reg register to read
    • @param bufp pointer to buffer that store the data read
    • @param len number of consecutive register to read
    • */

static int32_t platform_read(void handle, uint8_t reg, uint8_t bufp,

                     uint16_t len)

{

//#ifdef STEVAL_MKI109V3

//

// if (handle == &hspi2) {

/ Read command /

reg |= 0x80;

HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_RESET);

HAL_SPI_Transmit(handle, &reg, 1, 1000);

HAL_SPI_Receive(handle, bufp, len, 1000);

HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_SET); // }

//#elif defined(SPC584B_DIS)

// / Add here the SPC5 read SPI interface /

//#endif

return 0;

}

image.png

jundao721 回答时间:2025-3-16 09:43:42
Minerva_ 发表于 2025-3-15 21:50$ U3 ]8 t( t4 `2 Q$ S  V2 w
[md]我在cubeMX中直接配置了IIS3DWB的驱动文件,然后在官方的例程中进行了修改,但是貌似读取不到设备的I ...
% L+ {8 c3 m4 h/ P) o3 ?) _
IIS3DWB SPI.png 这是我SPI3的基本配置,程序的话初始化完后,延时十几毫秒,再去读whoamI,别的基本上都是官库里的,正常读写。& U; ?2 i9 F7 `8 E' z6 U
Minerva_ 回答时间:2025-3-16 19:52:13

jundao721 发表于 2025-3-16 09:43
这是我SPI3的基本配置,程序的话初始化完后,延时十几毫秒,再去读whoamI,别的基本上都是官库里的,正常 ...

那想问一下您在platform_write以及platform_read这个函数中的CS_up_GPIO_Port,以及CS_up_Pin是GPIOF pin5还是GPIOE pin14呢?我在csdn上看到一个博主这里是GPIOE pin14

image.png

jundao721 回答时间:2025-3-17 11:37:31
Minerva_ 发表于 2025-3-16 19:52- h% c7 K! \0 `7 X: K/ n+ |. q
那想问一下您在platform_write以及platform_read这个函数中的CS_up_GPIO_Port,以及CS_up_Pin是GPIOF  ...
2 D( X9 w7 B5 D: z' ?, D8 C$ A
" l" X9 [9 d- L( T
[md]CS我用的PF5,
4 [  a; d( J; _7 D$ V! m
( l6 d$ R0 C' D( t/ l5 x1 O```
! ~. A' \, o. cstatic int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp, uint16_t len)
' P8 C1 H* q, l{
- r# T, W% N( x' D) P% M3 ~//    uint8_t tx_buffer[1 + len];! I  j0 b; |3 y) d
//    tx_buffer[0] = reg;
8 Z" V( Z" P2 A/ p- z//    memcpy(&tx_buffer[1], bufp, len);; t* [  l! H* W

4 |; I8 w2 h) |# `( g    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_RESET); // 选择合适的CS引脚" E1 Y( b$ Z: O) V# y
//    HAL_StatusTypeDef status = HAL_SPI_Transmit(handle, tx_buffer, len + 1, HAL_MAX_DELAY);
6 y% x  `1 ]9 I3 q$ `4 ]' w6 U4 I& T' M8 ]! T" w
         HAL_SPI_Transmit(handle, &reg, 1, 1000);5 W2 ~( K5 x! `& t9 A8 h: W( J# B
    HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);
: o8 ~: \6 w7 F( U7 D/ i2 r5 l) `2 r    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_SET); // 选择合适的CS引脚. p. u; U0 X2 W

, v% B+ s* j- H//    return (status == HAL_OK) ? 0 : -1;6 g: s. u$ y3 W* b0 H4 D# n5 g' W
        return  0;6 f) T, t7 I/ e
}
/ n3 Z4 x) _5 z8 r/ `7 j```  N+ X6 _' D4 u0 ~( J% J

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版