第一章·项目介绍与创意阐述
1.1项目背景与任务要求
入门级题目2—姿态监测终端:利用6轴IMU以50Hz以上采样率实时采集姿态数据,计算俯仰角、横滚角等姿态信息,并通过OLED或PC端实时显示设备姿态。当倾斜角超过设定阈值(如60°)或姿态变化异常时,1秒内触发报警。
基本要求:
- 6轴IMU实时数据采集,采样率≥50Hz;
- 实时计算俯仰角(pitch)、横滚角(roll);
- 倾角阈值报警(默认60°)与姿态突变报警;
- 报警响应时间≤1s;
- 实时显示通道支持OLED或PC端网页;
- 报警状态可视化(LED指示);
- 设备水平放置时角度读数稳定,不漂移;
- 上位机(PC网页)可选择串口、解析数据、显示报警。
项目所属方向:嵌入式感知终端/工业物联网前端——以ARMCortex-M4主控+MEMS加速度计为典型形态的低功耗姿态监测方案。
1.2项目功能与目标
本终端实现以下功能(经测试验证):
- 50Hz姿态采样:基于LIS2HH12三轴加速度计,硬件配置50Hz输出数据率;
- pitch/roll实时解算:根据重力矢量在传感器三轴上的投影做线性映射,水平时输出0°,侧立时输出±90°;
- 倾角报警:阈值默认60°,带5°迟滞带避免抖动;
- 突变报警:单帧间倾角变化率≥200°/s时立即触发;
- JSON串口上报:UART0@115200-8N1,50Hz周期输出{type:"data",tick,ax,ay,az,pitch,roll,alarm,reason};
- PC端WebSerial网页:双击即用,支持串口选择、姿态实时可视化、CSS3D姿态方块、报警卡脉冲、原始日志;
- LED报警指示:板载红灯P1.14(报警时常亮)+绿灯P1.18(正常运行时常亮),采用软件PWM实现0→100%平滑渐变;
- 心跳帧:每秒一条alive帧,即使I2C短暂失败也能确认主循环在跑。
关键性能指标:
指标 | 目标值 | 实测值 |
采样率 | ≥50Hz | 50Hz |
报警响应时间 | ≤1s | ≤40ms (50Hz×2帧) |
倾角阈值 | 60° | 60°(迟滞5°) |
静态角度噪声 | <±1° | ±0.1° (两级IIR滤波后) |
角度线性范围 | 0°~90° | ±90° (线性映射,无atan2饱和) |
报警LED切换平滑时间 | <3s | 2s (软件PWM100档渐变) |
串口波特率 | — | 1152008N1 |
水平放置精度 | ±5° | 0° (32帧启动校准后) |
1.3项目创新点与特色
- 启动零偏自校准:上电后采集32帧(约640ms)取平均,作为DC偏置计入offset;后续每帧先减偏置再做角度解算,使平放状态下pitch/roll严格等于0°,无需人工操作。从工程实践角度看,这是解决MEMS传感器温漂与机械零位误差最经济的方案。
- 两级IIR+软件PWM的双层平滑机制:在加速度域与角度域分别做IIR低通(α=0.20/α=1.00),消除LIS2HH12在50HzODR下±30mg的静态噪声;同时LED通过软件PWM(1kHztick+20ms周期)实现0→100%渐变,避免传统On/Off模式在阈值附近的"频繁闪烁"。
- 基于浏览器WebSerialAPI的零依赖可视化方案:相比传统PC上位机(需安装、可执行文件、跨平台兼容),本项目网页采用浏览器原生WebSerialAPI,双击HTML文件即用——无服务器、无npm依赖、无数据库,适配Chrome/Edge。Pitch/Roll大字号+报警卡脉冲+CSS3D姿态方块,所有可视化全部原生HTML/CSS实现。
- JSON帧格式+心跳自诊断机制:除50Hz的data帧外,每秒额外输出一帧alive帧携带read_ok标志。即使I2C暂时失败,PC端仍可区分"主循环活着但传感器失败"与"程序彻底卡死"两种故障,显著降低现场调试时间。
第二章·硬件详细介绍
2.1 主控芯片选型

本项目主控采用MAX32650FTHR开发板,板上搭载MAX32650微控制器。
板子的接口资源如下:
2.2 其他模块介绍

LIS2HH12三轴加速度计传感器板:
- 型号:STMicroelectronics LIS2HH12TR
- 关键参数:±2g/±4g/±8g三档量程,10-bit/12-bit/16-bit输出,最高800HzODR,I2C/SPI接口
- 系统功能:感知设备三轴加速度,经主控解算得到pitch/roll
- I2C地址:0x1D(CS引脚接VDD时
第三章·方案设计与设计思路
3.1 系统总体方案框图

如图所示,系统由五大部分组成:
- 感知层:LIS2HH12传感器板→I2C1(P2.17SDA/P2.18SCL)→MAX32650
- 解算层:MAX32650内运行的姿态算法(IIR滤波+线性映射+报警判定)
- 指示层:软件PWM驱动P1.14/P1.18上的红/绿灯
- 通信层:UART0(P2.12TX)→USBCDC→PC端WebSerial网页
- 可视化层:浏览器HTML+CSS+原生JS,零依赖
3.2 整体设计思路
整体设计流程:
- 板级初始化:PinInit()配GPIO,PeripheralInit()配UART0/I2C1;
- I2C1探测:扫描0x1C~0x1F,确认LIS2HH12在0x1D;
- LIS2HH12初始化:写入CTRL1(50Hz+XYZ+BDU)与CTRL4(±2g+auto-inc);
- 启动零偏校准:32帧取平均作为DC偏置;
- 主循环:50Hz读取→滤波→角度→报警→上报+LED;
- 异常恢复:I2C失败时Shutdown+Init重建master模式。
3.3 核心算法设计
角度解算(线性映射):
pitch(°)=ay_filt/1000.0*90.0
roll(°)=ax_filt/1000.0*90.0
两级IIR低通滤波:
加速度计原始输出存在±30mg的高频噪声,直接做角度计算会产生±2°的角度抖动。因此加入两级滤波:
滤波级 | 输入 | α | 截止频率 | 作用 |
Stage1 | 原始ax/ay/az | 0.20 | ~2Hz | 抑制传感器白噪声 |
Stage2 | 角度pitch/roll | 1.00 | — | 关闭,使角度直接跟随 |
迟滞报警:
为避免阈值附近抖动,引入5°迟滞带:
if(alarm_state){
/*当前在报警:仅当<threshold-5°时解除*/
clearwhen(max(|pitch|,|roll|)<55°)
}else{
/*当前正常:仅当>threshold时触发*/
triggerwhen(max(|pitch|,|roll|)>=60°)
}
第四章·原理图与PCB设计
本项目硬件由两块成熟开发板组成(MAX32650FTHR+LIS2HH12传感器板),无需自行设计PCB。因此本节重点说明引脚映射与电气互联。
4.1 板级引脚互联

MAX32650FTHR与LIS2HH12板接线图
信号 | MAX32650FTHR引脚 | LIS2HH12板引脚 | 备注 |
I2CSDA | P2.17(ALT1) | SDA | 板载上拉4.7kΩ |
I2CSCL | P2.18(ALT1) | SCL | 板载上拉4.7kΩ |
I2C电源 | VIO(3V3) | VDD | 共用3.3V |
GND | GND | GND | 必须共地 |
红灯控制 | P1.14(OUT) | — | 板载LED |
绿灯控制 | P1.18(OUT) | — | 板载LED |
UARTTX | P2.12(ALT1) | — | 上位机接收 |
UARTRX | P2.11(ALT1) | — | 上位机发送(本项目未用) |
第五章·软件流程与关键代码
5.1软件系统流程图

5.2软件模块划分
模块 | 文件 | 职责 |
板级初始化 | GPIO/UART0/I2C1配置 | |
LIS2HH12驱动 | I2C1上LIS2HH12读写、E_BUSY自恢复 | |
姿态算法 | 校准、IIR滤波、角度映射、迟滞报警 | |
软件PWM | 20ms周期、1kHztick、100档平滑 | |
主程序 | 初始化、启动校准、50Hz主循环、JSON上报 |
5.3关键代码段
关键代码1:MAX32650MSDKI2C1主模式初始化
/*CFS模板默认masterMode=0(从机)-必须改为1*/
result=MXC_I2C_Init(MXC_I2C1,1,0U);//第2参=1表示master
if(result!=E_NO_ERROR)returnresult;
MXC_I2C_SetFrequency(MXC_I2C1,100000U);//100kHz
MXC_I2C_SetClockStretching(MXC_I2C1,1);//允许stretch
关键代码2:LIS2HH12寄存器位布局
/*CTRL1=(ODR<<5)|BDU|Zen|Yen|Xen*/
uint8_tctrl1=(uint8_t)(((odr_code&0x07)<<5)
|0x10/*BDU=1*/
|0x04|0x02|0x01);/*XYZ全开*/
/*CTRL4=FS[5:4]|IF_ADD_INC[2]*/
uint8_tctrl4=(uint8_t)((fs_code&0x30)|0x04);
关键代码3:I2C总线BUSY状态自动恢复
staticvoidi2c_bus_reinit(mxc_i2c_regs_t*i2c){
(void)MXC_I2C_Shutdown(i2c);
(void)MXC_I2C_Init(i2c,1,0U);
(void)MXC_I2C_SetFrequency(i2c,100000U);
(void)MXC_I2C_SetClockStretching(i2c,1);
}
inti2c_transfer(...){
intrc=MXC_I2C_MasterTransaction(req);
if(rc==E_BUSY){
i2c_bus_reinit(req->i2c);
rc=MXC_I2C_MasterTransaction(req);
}
returnrc;
}
关键代码4:线性角度映射
/*直接线性映射:1g重力对应±90°*/
constfloatpitch_raw=(st->ay_filt/1000.0f)*90.0f;
constfloatroll_raw=(st->ax_filt/1000.0f)*90.0f;
第六章·功能展示与测试说明
本次使用的是一个全新的开发环境ADI CodeFusion Studio,这是个基于VScode的插件工具,我们可以创建新工程,选择开发板,工程级初始化:
I2C配置:

串口配置:

也是通过这个工具进行build和下载调试:
相当于一站式实现工程的调试。
最后我们创建了一个基于串口打印的网页端进行效果展示:
超限报警:
第七章·难题与解决方法
传感器数据噪声大导致姿态抖动±2°
现象:板子静止时pitch/roll在±2°内乱跳,触发迟滞报警也会闪。
原因:
LIS2HH12在50HzODR、±2g量程下,白噪声约±30mg,直接计算角度抖动±2°。
解决:
加入两级IIR低通:
st->ax_filt=(1.0f-0.20f)*st->ax_filt+0.20f*ax_mg;
st->ay_filt=(1.0f-0.20f)*st->ay_filt+0.20f*ay_mg;
st->az_filt=(1.0f-0.20f)*st->az_filt+0.20f*az_mg;
同时把angle_alpha设为1.00,关闭第二级角度滤波——避免快速翻转时角度滞后。
第八章·心得体会
本项目以"任务驱动+工程实践"为指导思想,从硬件选型、I2C驱动调试、姿态算法设计、LEDPWM平滑过渡、PCWebSerial可视化五个层面,系统性地完成了"姿态监测终端"的全部功能需求。也体验了ADI的新工具,通过新工具进行接口的初始化,还是很方便的。这些经验对今后其他嵌入式项目有借鉴意义。