ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

STM32C5开发IIS3DWB10IS(1)----SPI获取震动计数据

STM32C5开发IIS3DWB10IS(1)----SPI获取震动计数据 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_IIS3DWB10IShttps://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®串行接口● 嵌入式FIFO2048个槽位支持加速度计、温度传感器和ISPU数据的可配置批处理● 嵌入式温度传感器● 嵌入式自检功能● 电源电压1.7 V至3.6 V● 紧凑型封装LGA 4.5 x 4.5 x 1.5 mm 16引线采用可湿性侧面● 符合ECOPACK和RoHS标准串口配置查看原理图PA9和PA10设置为开发板的串口。在左侧 Peripherals 中选择 Connectivity → USART1Mode 选择 Async表示配置为异步串口模式Function used by the component 显示为 UART说明 USART1 在异步模式下使用 UART HAL 驱动串口参数配置为115200 波特率、8 位数据位、无校验、1 位停止位、收发模式GPIO TxUSART1_TX 选择 PA9GPIO RxUSART1_RX 选择 PA10PA9 / PA10 均配置为 Alternate 复用功能模式Pull 选择 No pull-up and no pull-downOutput type 选择 Push pullSpeed 选择 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时钟分频8SPI通信速率18 Mbit/s时钟极性Low时钟相位First edge数据顺序MSB firstNSS片选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-M33Core 为 0点击 Finish完成 CMake 工程导入设置工程编码在 Project Explorer 中选中当前工程点击菜单栏 Project选择 Properties进入工程属性设置在工程属性中选择 ResourceText file encoding 选择 Other编码格式输入 GBK点击 Apply and Close 保存设置添加头文件在 main.c 中添加头文件#includemx_usart1.h#includestdio.h#includestring.hprintf 重定向为了让 printf() 输出到 USART1需要重写 _write() 函数。GCC 工程中printf() 底层会调用 _write() 输出字符因此只需要在 _write() 中调用 HAL_UART_Transmit()就可以把 printf() 的内容通过串口发送出去。int_write(intfile,char*ptr,intlen){hal_uart_handle_t*huart1mx_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)头文件设置添加头文件。#includeiis3dwb10is_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_num0,temp_event_num0;staticuint8_txl_event0,temp_event0;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_regplatform_write;dev_ctx.read_regplatform_read;dev_ctx.mdelayplatform_delay;dev_ctx.handlemx_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_ID0x%x,id0x%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.roundingIIS3DWB10IS_WRAPAROUND_DISABLED;iis3dwb10is_xl_data_config_set(dev_ctx,xl_cfg);将加速度计量程设置为 ±50 g。IIS3DWB10IS 支持 ±50 g、±100 g 和 ±200 g 三种量程。本例选择 ±50 giis3dwb10is_xl_full_scale_set(dev_ctx,IIS3DWB10IS_50g);随后配置 INT1 引脚将加速度数据就绪和温度数据就绪信号映射到 INT1 。 当新的加速度数据产生时传感器可通过 INT1 输出加速度数据就绪信号当新的温度数据产生时也可通过 INT1 输出温度数据就绪信号。iis3dwb10is_pin_int1_route_get(dev_ctx,route);route.drdy_xl1;route.drdy_temp1;iis3dwb10is_pin_int1_route_set(dev_ctx,route);最后将传感器设置为连续采样模式并将输出数据速率配置为 10 kHz。/* Set Output Data Rate */rate.burstIIS3DWB10IS_CONTINUOS_MODE;rate.odrIIS3DWB10IS_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_event1;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_event1;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_event0;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_event0;temperature_degCiis3dwb10is_from_lsb_to_celsius(data_raw_temperature);printf(Temperature [degC]:%6.2f\r\n,temperature_degC);}}平放与反放测试将 IIS3DWB10IS 传感器板分别进行平放和反放测试串口输出结果如下。这部分差值主要来自传感器的零偏。IIS3DWB10IS 数据手册中的 TyOff 参数表示加速度零重力偏移规格表给出的零偏精度为 1 g同时零偏还会随温度变化。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进