【免费开源】基于STM32的ADXL345三轴加速度传感器姿态检测倾角测量完整项目源码分享

发布时间:2026/5/30 20:23:58
【免费开源】基于STM32的ADXL345三轴加速度传感器姿态检测倾角测量完整项目源码分享
【免费开源】基于STM32的ADXL345三轴加速度传感器姿态检测倾角测量完整项目源码分享一、项目背景ADXL345 是 ADI 公司出品的一款经典 ±2g/±4g/±8g/±16g 量程的三轴数字加速度计分辨率高达 13 位支持 SPI 与 IIC 接口被广泛用于人体动作识别、电子计步器、防摔报警、无人机姿态、车载倾角仪等场景。本项目基于 STM32 ADXL345 三轴加速度传感器提供完整的硬件接线方案、IIC/SPI 双驱动实现、姿态解算算法Roll/Pitch以及上位机数据可视化代码是学习数字传感器和惯性测量入门的优质工程。二、项目流程图否是是STM32 上电IIC/SPI 初始化读取 DEVID 寄存器DEVID 0xE5?报错: 通信失败配置量程 ±4g, 数据率 100Hz使能 MEASURE 模式启动 10ms 定时器定时器中断?突发读 DATAX0~DATAZ1共 6 字节合并 LSBMSB → int16原始值 × 灵敏度 g低通滤波: y0.8y0.2x计算 Roll/PitchRollatan2 Y,ZPitchatan2 -X,sqrt Y²Z²串口发送数据帧OLED 显示倾角三、硬件接线IIC 模式ADXL345STM32VCC3.3VGNDGNDSDAPB7SCLPB6CS3.3V (固定高)SDOGND (设地址 0x53)四、核心代码4.1 ADXL345 初始化与读取#includeadxl345.h#includemain.hexternI2C_HandleTypeDef hi2c1;#defineADDR(0x531)uint8_tADXL345_Init(void){uint8_tid0;HAL_I2C_Mem_Read(hi2c1,ADDR,0x00,1,id,1,100);if(id!0xE5)return0;uint8_tv0x0B;/* full_res, ±16g */HAL_I2C_Mem_Write(hi2c1,ADDR,0x31,1,v,1,100);v0x0A;/* 100Hz */HAL_I2C_Mem_Write(hi2c1,ADDR,0x2C,1,v,1,100);v0x08;/* MEASURE */HAL_I2C_Mem_Write(hi2c1,ADDR,0x2D,1,v,1,100);return1;}voidADXL345_ReadXYZ(int16_t*x,int16_t*y,int16_t*z){uint8_tb[6];HAL_I2C_Mem_Read(hi2c1,ADDR,0x32,1,b,6,100);*x(int16_t)(b[1]8|b[0]);*y(int16_t)(b[3]8|b[2]);*z(int16_t)(b[5]8|b[4]);}4.2 姿态解算#includemath.htypedefstruct{floatroll,pitch;}Att_t;Att_tADXL_Pose(int16_tx,int16_ty,int16_tz){floatgxx*0.0039f,gyy*0.0039f,gzz*0.0039f;Att_t a;a.rollatan2f(gy,gz)*57.2958f;a.pitchatan2f(-gx,sqrtf(gy*gygz*gz))*57.2958f;returna;}4.3 主程序externUART_HandleTypeDef huart1;intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();MX_USART1_UART_Init();if(!ADXL345_Init()){while(1);}int16_tx,y,z;charbuf[64];while(1){ADXL345_ReadXYZ(x,y,z);Att_t aADXL_Pose(x,y,z);intnsnprintf(buf,sizeof(buf),R%.1f P%.1f\r\n,a.roll,a.pitch);HAL_UART_Transmit(huart1,(uint8_t*)buf,n,100);HAL_Delay(10);}}五、关键技术点5.1 量程与灵敏度ADXL345 在 FULL_RES 模式下每 LSB 3.9mg本工程使用 ±16g 量程对应 13 位有效。如果是体感识别建议使用 ±4g 量程提高分辨率。5.2 中断与 FIFOADXL345 有 32 级 FIFO 和 2 路硬件中断输出INT1/INT2可以配置 Activity/Inactivity/Tap/DoubleTap/FreeFall/Overrun 等中断实现低功耗下的事件驱动采样。5.3 滤波加速度信号高频噪声大建议软件加一阶低通滤波IIR或滑动平均窗口 8。如果项目对实时性要求很高可以直接使用 ADXL345 内部的高通/低通滤波寄存器。5.4 倾角解算仅靠加速度计计算倾角在静态时精度高但动态情况下会有线性加速度干扰。可以与陀螺仪数据通过互补滤波或卡尔曼滤波融合获得稳定 Roll/Pitch/Yaw。六、应用案例智能手环/手表的步数检测防摔检测的老人监护设备数控机床、电梯倾角监测DIY 平衡车、四轴飞行器工业振动监测泵、电机、轴承。七、调试经验DEVID 必须为 0xE5否则就是接线问题或上电时序问题CS 必须接 3.3V否则芯片进入 SPI 模式无法被 IIC 读取SDO 决定 IIC 地址接 GND 是 0x53接 VCC 是 0x1D量程切换后需重置 MEASURE否则采样数据可能错乱板子贴近金属时灵敏度会下降注意安装结构。八、总结本项目用清晰的代码与硬件方案完整实现了 ADXL345 在 STM32 上的应用全流程从底层 IIC 通信、寄存器配置到上层倾角解算和数据上报麻雀虽小五脏俱全。完整工程已开源在压缩包中方便读者直接编译运行并扩展为更复杂的姿态测量系统。