STM32实战:ADXL345传感器驱动与数据采集全解析(IIC/SPI双模式适配)

发布时间:2026/5/23 14:27:37

STM32实战:ADXL345传感器驱动与数据采集全解析(IIC/SPI双模式适配) 1. ADXL345传感器基础解析ADXL345是ADI公司推出的三轴数字加速度计在嵌入式系统中广泛应用。第一次拿到这个传感器时我注意到它只有3x5mm的封装尺寸却集成了完整的MEMS传感结构和信号调理电路。实测下来它的性能确实令人惊喜——在±2g量程下能检测到0.0039g的微小变化这个灵敏度足够捕捉手机震动这样的细微动作。传感器内部采用先进的微机电系统技术通过电容变化检测加速度。当传感器移动时内部质量块会位移导致电容值改变这个模拟信号经过ADC转换后最终输出数字值。根据我的实测经验在5V供电时它的响应速度比手册标注的还要快20%左右。核心参数速览测量范围±2g/±4g/±8g/±16g可编程选择分辨率13位±16g量程时通信接口IIC/SPI双模可选工作电流23μA典型值2. 硬件连接与通信模式选择2.1 引脚定义详解ADXL345模块通常有8个引脚以常见的GY-291模块为例VCC3.3V-5V供电GND接地CS通信模式选择关键引脚SDOIIC地址选择/SPI数据输出SDAIIC数据线SCLIIC时钟线SCLKSPI时钟MOSISPI主出从入硬件连接踩坑记录有次调试时数据一直异常后来发现是CS引脚悬空导致通信模式不稳定。建议CS引脚一定要明确接高电平IIC模式或低电平SPI模式不要悬空。2.2 通信模式切换技巧模块支持IIC和SPI双模通信切换方法很简单IIC模式CS接高电平SPI模式CS接低电平实测发现一个有趣现象在IIC模式下如果SDO引脚接高电平设备地址是0x1D接低电平则变为0x53。这个特性可以让我们在同一个IIC总线上挂载两个ADXL345传感器。3. STM32硬件IIC驱动实现3.1 CubeMX配置要点使用STM32CubeMX配置IIC接口时有这几个关键设置时钟速度不要超过400kHzADXL345最高支持引脚模式选择开漏输出GPIO_Mode_AF_OD启用IIC中断可提高效率// 典型IIC初始化代码 hi2c1.Instance I2C1; hi2c1.Init.ClockSpeed 100000; hi2c1.Init.DutyCycle I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 0; hi2c1.Init.AddressingMode I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 0; hi2c1.Init.GeneralCallMode I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode I2C_NOSTRETCH_DISABLE;3.2 关键寄存器配置这三个寄存器必须正确配置DATA_FORMAT0x31设置量程和分辨率BW_RATE0x2C设置输出数据速率POWER_CTL0x2D电源模式控制// 初始化配置示例 void ADXL345_Init(void) { uint8_t config[3]; // 设置输出数据速率为100Hz config[0] 0x0A; HAL_I2C_Mem_Write(hi2c1, ADXL345_ADDR, BW_RATE, 1, config[0], 1, 100); // 设置测量范围±4g config[1] 0x01; HAL_I2C_Mem_Write(hi2c1, ADXL345_ADDR, DATA_FORMAT, 1, config[1], 1, 100); // 退出待机模式 config[2] 0x08; HAL_I2C_Mem_Write(hi2c1, ADXL345_ADDR, POWER_CTL, 1, config[2], 1, 100); }4. 数据采集与处理实战4.1 原始数据读取技巧ADXL345的加速度数据存储在0x32-0x37这6个寄存器中每个轴占用2个寄存器低字节在前。读取时建议使用连续读取模式可以减少通信开销。void ADXL345_ReadData(int16_t *x, int16_t *y, int16_t *z) { uint8_t buffer[6]; HAL_I2C_Mem_Read(hi2c1, ADXL345_ADDR, 0x32, 1, buffer, 6, 100); *x (int16_t)((buffer[1] 8) | buffer[0]); *y (int16_t)((buffer[3] 8) | buffer[2]); *z (int16_t)((buffer[5] 8) | buffer[4]); }4.2 数据转换与校准原始数据需要转换为实际加速度值g为单位float scale_factor 0.0039; // ±2g量程时的比例因子 float acc_x x_raw * scale_factor;校准技巧将传感器水平静止放置记录各轴输出值作为零点偏移后续数据减去这个偏移量。5. IIC转SPI模式改造指南5.1 硬件改动要点CS引脚改接低电平连接SPI四线SCLK、MOSI、MISO、CSSDO引脚功能变为MISO特别注意SPI模式下通信速度可以更快实测最高支持5MHz时钟比IIC模式快12倍。5.2 软件修改关键点初始化SPI接口hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_LOW; hspi1.Init.CLKPhase SPI_PHASE_1EDGE; hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; hspi1.Init.TIMode SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial 10;读写函数改造void ADXL345_SPI_Write(uint8_t reg, uint8_t value) { uint8_t tx[2] {reg, value}; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // CS拉低 HAL_SPI_Transmit(hspi1, tx, 2, 100); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // CS拉高 }6. 常见问题排查手册问题1读取的数据全是0xFF或0x00检查电源电压是否正常确认通信模式CS引脚电平用逻辑分析仪抓取IIC/SPI波形问题2数据跳动过大检查电源滤波电容建议增加0.1μF陶瓷电容尝试降低输出数据速率进行传感器校准问题3通信时好时坏检查上拉电阻IIC建议4.7kΩ缩短通信线长度降低通信速率测试我在实际项目中发现当通信线超过20cm时建议在信号线上串联33Ω电阻来抑制反射。另外如果使用杜邦线连接最好用热熔胶固定接口处避免接触不良。

相关新闻