STM32C5开发IIS3DWB10IS.1--SPI获取震动计数据
- 概述
- 视频教程
- 样品申请
- 源码下载
- 硬件准备
- 参考程序
- 所有功能
- 串口配置
- 通信模式
- 管脚定义
- SPI通信模式
- 速率
- SPI配置
- CS设置
- 生成项目
- 导入STM32CubeIDE
- 设置工程编码
- 添加头文件
- printf 重定向
- 参考程序
- CMake设置
- 头文件设置
- 初始换管脚
- 获取ID
- 配置工作参数
- 轮询读取数据
- 平放与反放测试
概述
IIS3DWB10IS采用系统级封装,配备3轴数字振动传感器,在超宽平坦频率范围内保持低噪声。这款器件具有宽带宽、低噪声、高稳定性和可重复的灵敏度,能在扩展温度范围(最高+125°C)下工作,且量程加速度可达±200 g,因此特别适合各种工业应用(包括在最恶劣和要求最严苛的环境)中的振动监测。
IIS3DWB10IS具有可选的±50/±100/±200 g量程加速度范围,能够测量带宽超过10 kHz的加速度。该器件集成了一个2048槽位的先进先出 (FIFO) 缓冲区,用于批量处理来自集成加速度计、温度传感器或ISPU的数据,同时避免数据丢失并减少主处理器的干预。
IIS3DWB10IS内嵌意法半导体的一款新型处理器件ISPU(智能传感器处理单元),支持依赖传感器数据的实时应用。ISPU是一个超低功耗、高性能的可编程内核,能够执行实时信号处理和边缘AI算法。ISPU支持C语言编程,并可依托意法半导体及第三方提供的库、工具/IDE构成的生态系统。
其针对算法实时执行而优化的超低功耗硬件电路是面向工业5.0的任何无线传感器节点的一项先进功能。
意法半导体的MEMS传感器模块系列采用稳健成熟的制造工艺,已经在微机械加工的加速度计和陀螺仪产品中广泛应用,可满足汽车、工业和消费类市场的需求。传感元件采用意法半导体专门的微型机械加工工艺制造,而内嵌的IC接口采用CMOS技术开发。
IIS3DWB10IS具有自检功能,可用于检查传感器在最终应用中的功能。IIS3DWB10IS采用16引脚塑料焊盘栅格阵列 (LGA) 封装,可确保在扩展温度范围(-40 °C至+125 °C)内正常工作。
需要样片的可以加qun申请:925643491 / 615061293 。
视频教程
https://www.bilibili.com/video/BV1C9ut6GEq3/
样品申请
https://www.wjx.top/vm/OhcKxJk.aspx#
源码下载
https://download.csdn.net/download/qq_24312945/93287432
硬件准备
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32C542CC,振动传感器为IIS3DWB10IS。
参考程序
https://github.com/CoreMaker-lab/STM32C542CC_IIS3DWB10IS
https://gitee.com/CoreMaker/STM32C542CC_IIS3DWB10IS
所有功能
● 3轴振动传感器带数字输出
● 用户可选量程:±50/±100/±200 g
● 超宽平坦频率响应范围:从DC到10 kHz以上(±3 dB点)
● 均衡与滤波可确保平坦且无混叠的频率响应
● 超低噪声密度:低至35 µg/√Hz
● 嵌入式ISPU(智能传感器处理单元):超低功耗、高性能的可编程内核,用于执行实时信号处理和边缘AI算法
● 灵敏度在不同温度条件和机械冲击下高度稳定
● 支持精确的外部时钟输入,以实现传感器阵列的精确同步并提高ODR稳定性
● 更宽的温度范围:-40 °C至+125 °C
● 多种工作模式
○ 连续模式 (CM)40 / 80 kHz ODR @ >10 kHz带宽2.5 / 5 / 10 / 20 kHz ODR @ ODR/2带宽
○ 突发模式 (BM)可在CM模式下配置由ISPU、FIFO、内部定时器或外部条件触发的采集突发
● 低功耗:单轴激活时为1.9 mA,三轴全部激活时为4.1 mA
● SPI串行接口/MIPI I3C®串行接口
● 嵌入式FIFO:2048个槽位,支持加速度计、温度传感器和ISPU数据的可配置批处理
● 嵌入式温度传感器
● 嵌入式自检功能
● 电源电压:1.7 V至3.6 V
● 紧凑型封装:LGA 4.5 x 4.5 x 1.5 mm 16引线,采用可湿性侧面
● 符合ECOPACK和RoHS标准
串口配置
查看原理图,PA9和PA10设置为开发板的串口。
- 在左侧 Peripherals 中选择 Connectivity → USART1
- Mode 选择 Async,表示配置为异步串口模式
- Function used by the component 显示为 UART,说明 USART1 在异步模式下使用 UART HAL 驱动
- 串口参数配置为:115200 波特率、8 位数据位、无校验、1 位停止位、收发模式
- GPIO Tx:USART1_TX 选择 PA9
- GPIO Rx:USART1_RX 选择 PA10
- PA9 / PA10 均配置为 Alternate 复用功能模式
- Pull 选择 No pull-up and no pull-down,Output type 选择 Push pull,Speed 选择 Low
通信模式
对于IIS3DWB10IS,可以使用SPI或者IIC进行通讯。
在CS管脚为0的时候,为SPI模式。
本文使用的板子原理图如下所示。
管脚定义
SPI通信模式
静态地址为 0x1A / 0x1B,取决于 SDO 引脚状态。
速率
该模块支持的SPI速度最快为25MHz。
SPI配置
IIS3DWB10IS 通过 SPI 接口与 STM32C542CCT6 进行通信。传感器的 SPC、SDI、SDO 和 CS 分别连接到 STM32C542CCT6 的 PA5、PA7、PA6 和 PB0,对应 SPI_SCK、SPI_MOSI、SPI_MISO 和片选信号。
原理图通过 0 Ω 电阻实现 SPI 与 I3C 接口切换。使用 SPI 时,应焊接 R17、R20 和 R22,不焊接 R16、R19 和 R21。
在 STM32CubeMX2 中配置 STM32C542CCT6 的 SPI1 外设,用于与 IIS3DWB10IS 进行通信。
- 打开外设配置界面,进入 Connectivity 分类。
- 选择并使能 SPI1 外设。
- 将 SPI1 工作模式设置为 SPI。
- 在 Main features 中设置以下参数:
工作模式:Master
通信方向:Full-duplex
数据位宽:8-bit
时钟源:APB2 Peripheral Clock
时钟源频率:144 MHz
时钟分频:8
SPI通信速率:18 Mbit/s
时钟极性:Low
时钟相位:First edge
数据顺序:MSB first
NSS片选:Deactivated
数据格式:Motorola
其中,时钟极性为 Low、时钟相位为 First edge,对应 SPI Mode 0。IIS3DWB10IS 支持 SPI Mode 0 和 Mode 3,因此该配置可以正常使用。SPI1 的硬件 NSS 功能关闭,传感器的 CS 引脚由 PB0 配置为普通 GPIO,通过软件控制其高低电平。
根据硬件连接,将 SPI1 的时钟、数据输入和数据输出分别分配到 PA5、PA6 和 PA7。
其中,PA5 用于输出 SPI 时钟,PA7 用于 STM32C542CCT6 向 IIS3DWB10IS 发送数据,PA6 用于接收 IIS3DWB10IS 返回的数据。
CS设置
IIS3DWB10IS 通过 SPI 接口与 STM32C542CCT6 进行通信。传感器的 CS 连接到 STM32C542CCT6 的PB0,对应片选信号。
由于 SPI1 的硬件 NSS 功能未启用,因此使用 PB0 作为普通 GPIO 控制 IIS3DWB10IS 的片选信号。在 Pinout 页面选择 PB0,并将其配置为 GPIO 输出模式,同时添加信号标签 CS,便于后续程序调用。
生成项目
- 修改配置后,左下角会提示 Click to save,需要先保存当前工程配置
- 点击左侧 Project settings,进入工程生成设置页面
- 在 IDE Project Generation 中选择工程格式和工具链,本例选择 CMake + GCC,然后点击 Generate IDE project 生成工程
导入STM32CubeIDE
- 打开 STM32CubeIDE,点击菜单栏 File
- 选择 Import…,准备导入 STM32CubeMX2 生成的 CMake 工程
- 在 Import 窗口中展开 Import STM32 Project
- 选择 STM32 CMake Project
- 点击 Next,进入 CMake 工程路径选择页面
- Project name:填写导入到 STM32CubeIDE 中显示的工程名称
- Source directory:选择 STM32CubeMX2 生成的 CMake 工程目录
- 点击 Next,继续完成工程导入
- Toolchain:选择 MCU ARM GCC,表示使用 ARM GCC 工具链进行编译
- MCU:确认芯片型号为 STM32C542CCTx,与前面 STM32CubeMX2 中选择的 MCU 保持一致
- CPU/Core:确认内核为 Cortex-M33,Core 为 0
- 点击 Finish,完成 CMake 工程导入
设置工程编码
- 在 Project Explorer 中选中当前工程
- 点击菜单栏 Project
- 选择 Properties,进入工程属性设置
- 在工程属性中选择 Resource
- Text file encoding 选择 Other
- 编码格式输入 GBK
- 点击 Apply and Close 保存设置
添加头文件
在 main.c 中添加头文件
#include"mx_usart1.h"#include<stdio.h>#include<string.h>printf 重定向
为了让 printf() 输出到 USART1,需要重写 _write() 函数。GCC 工程中,printf() 底层会调用 _write() 输出字符,因此只需要在 _write() 中调用 HAL_UART_Transmit(),就可以把 printf() 的内容通过串口发送出去。
int_write(intfile,char*ptr,intlen){hal_uart_handle_t*huart1=mx_usart1_uart_gethandle();if(huart1!=NULL){HAL_UART_Transmit(huart1,ptr,len,1000);}returnlen;}参考程序
https://github.com/STMicroelectronics/iis3dwb10is-pid
添加对应驱动程序。
CMake设置
把iis3dwb10is_reg.c 加入 CMake 编译 。
#Stubs to be able to add compiler flag overrides,e.g.-Ostarget_sources(${CMAKE_PROJECT_NAME}PRIVATE#Add additional source files hereiis3dwb10is_reg.c)printf 输出浮点数需要额外开启 float printf 支持。
CMake 官方说明 target_link_options() 就是给可执行目标添加 linker options 的命令。
target_link_options(${CMAKE_PROJECT_NAME}PUBLIC#Add additional linker flags here-u _printf_float)头文件设置
添加头文件。
#include"iis3dwb10is_reg.h"初始换管脚
IIS3DWB10IS 的 SPI 片选信号 CS 为低电平有效。系统初始化完成后,先将 CS 引脚置为高电平,使传感器保持在未选中状态,避免上电过程中产生误通信。
printf("HELLO\n");HAL_GPIO_WritePin(CS_PORT,CS_PIN,HAL_GPIO_PIN_SET);变量定义。
/* Private macro -------------------------------------------------------------*/#defineBOOT_TIME20//ms/* Private variables ---------------------------------------------------------*/staticint32_tdata_raw_acceleration[3];staticint16_tdata_raw_temperature;staticfloat_tacceleration_mg[3];staticfloat_ttemperature_degC;staticuint8_twhoamI;staticuint8_ttx_buffer[1000];staticiis3dwb10is_pin_int_route_troute={0};/* 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. * */staticint32_tplatform_write(void*handle,uint8_treg,constuint8_t*bufp,uint16_tlen);staticint32_tplatform_read(void*handle,uint8_treg,uint8_t*bufp,uint16_tlen);staticvoidtx_com(uint8_t*tx_buffer,uint16_tlen);staticvoidplatform_delay(uint32_tms);staticvoidplatform_init(void);staticuint64_txl_event_num=0,temp_event_num=0;staticuint8_txl_event=0,temp_event=0;staticstmdev_ctx_tdev_ctx;获取ID
我们可以向WHO_AM_I (0Fh)获取固定值,判断是否为0x50。
对应的获取ID驱动程序,如下所示。
iis3dwb10is_data_rate_trate;iis3dwb10is_xl_data_cfg_txl_cfg;/* Initialize mems driver interface */dev_ctx.write_reg=platform_write;dev_ctx.read_reg=platform_read;dev_ctx.mdelay=platform_delay;dev_ctx.handle=mx_spi1_gethandle();/* Init test platform */// platform_init();/* Wait sensor boot time */platform_delay(BOOT_TIME);/* Check device ID */iis3dwb10is_device_id_get(&dev_ctx,&whoamI);printf("IIS3DWB10IS_ID=0x%x,id=0x%x\n",IIS3DWB10IS_ID,whoamI);if(whoamI!=IIS3DWB10IS_ID)while(1);配置工作参数
首先读取当前加速度计数据配置,在保留 X、Y、Z 三轴使能状态的基础上,关闭输出寄存器的回绕读取功能,然后将配置重新写入传感器。
iis3dwb10is_xl_data_config_get(&dev_ctx,&xl_cfg);xl_cfg.rounding=IIS3DWB10IS_WRAPAROUND_DISABLED;iis3dwb10is_xl_data_config_set(&dev_ctx,xl_cfg);
将加速度计量程设置为 ±50 g。IIS3DWB10IS 支持 ±50 g、±100 g 和 ±200 g 三种量程。本例选择 ±50 g
iis3dwb10is_xl_full_scale_set(&dev_ctx,IIS3DWB10IS_50g);
随后配置 INT1 引脚,将加速度数据就绪和温度数据就绪信号映射到 INT1 。 当新的加速度数据产生时,传感器可通过 INT1 输出加速度数据就绪信号;当新的温度数据产生时,也可通过 INT1 输出温度数据就绪信号。
iis3dwb10is_pin_int1_route_get(&dev_ctx,&route);route.drdy_xl=1;route.drdy_temp=1;iis3dwb10is_pin_int1_route_set(&dev_ctx,route);
最后将传感器设置为连续采样模式,并将输出数据速率配置为 10 kHz。
/* Set Output Data Rate */rate.burst=IIS3DWB10IS_CONTINUOS_MODE;rate.odr=IIS3DWB10IS_ODR_10KHz;iis3dwb10is_xl_data_rate_set(&dev_ctx,rate);/* Wait until the first valid sample is available */platform_delay(5);printf("IIS3DWB10IS initialization successful.\r\n");轮询读取数据
进入主循环后,程序不断读取 IIS3DWB10IS 的数据状态,判断是否产生了新的加速度或温度数据。
加速度 ODR 设置为 10 kHz。如果每次循环都打印,会产生大量串口数据,因此这里每读取到100次数据打印一次。
while(1){/* * Poll the status register on every loop. * The previous code only checked xl_event/temp_event, but never set * these flags or read the sensor data, so the print conditions could * never become true. */iis3dwb10is_data_ready_tdrdy;memset(&drdy,0x00,sizeof(drdy));iis3dwb10is_data_ready_get(&dev_ctx,&drdy);/* Read acceleration when a new sample is available */if(drdy.drdy_xl){xl_event=1;xl_event_num++;memset(data_raw_acceleration,0x00,3U*sizeof(data_raw_acceleration[0]));iis3dwb10is_acceleration_raw_get(&dev_ctx,data_raw_acceleration);}/* Read temperature when a new sample is available */if(drdy.drdy_temp){temp_event=1;temp_event_num++;memset(&data_raw_temperature,0x00,sizeof(data_raw_temperature));iis3dwb10is_temperature_raw_get(&dev_ctx,&data_raw_temperature);}/* 10 kHz ODR: print one acceleration sample every 100 reads */if(xl_event&&((xl_event_num%100U)==0U)){xl_event=0;acceleration_mg[0]=iis3dwb10is_from_fs50g_to_mg(data_raw_acceleration[0]);acceleration_mg[1]=iis3dwb10is_from_fs50g_to_mg(data_raw_acceleration[1]);acceleration_mg[2]=iis3dwb10is_from_fs50g_to_mg(data_raw_acceleration[2]);printf("Acceleration [mg]:%4.2f\t%4.2f\t%4.2f\r\n",acceleration_mg[0],acceleration_mg[1],acceleration_mg[2]);}/* Temperature refresh rate is 52 Hz: print about once per second */if(temp_event&&((temp_event_num%52U)==0U)){temp_event=0;temperature_degC=iis3dwb10is_from_lsb_to_celsius(data_raw_temperature);printf("Temperature [degC]:%6.2f\r\n",temperature_degC);}}平放与反放测试
将 IIS3DWB10IS 传感器板分别进行平放和反放测试,串口输出结果如下。
这部分差值主要来自传感器的零偏。IIS3DWB10IS 数据手册中的 TyOff 参数表示加速度零重力偏移,规格表给出的零偏精度为 1 g;同时,零偏还会随温度变化。