设计一个穿戴设备生物传感器与姿态算法的完整方案,包括:

  • 生物传感器电路设计:例如使用MAX30102(心率/血氧)或者AFE4400等,LED驱动电路(恒流源),体温传感器如MAX30205或NTC,皮肤阻抗可能使用AD5933等。

  • 数据采集:使用MCU的ADC(或外置ADC),配置多通道、DMA、滤波(如移动平均、IIR)。

  • 运动姿态算法:基于MPU6050或BMI160的6轴数据,实现计步(峰值检测、步态周期),睡眠监测(基于心率变异性、体动),运动模式识别(如决策树或简单阈值/机器学习)。

  • 数据校准:零点校准(静止时校准陀螺仪零偏,加速度计校准),佩戴姿态补偿(通过机器学习或姿态估计来旋转坐标系),多传感器融合(互补滤波或卡尔曼滤波得到姿态角)。

提供源代码示例(关键函数),比如计步算法、卡尔曼滤波、ADC DMA配置等。

将组织项目文件结构:包括硬件设计文档、固件源代码(驱动、算法、应用)等。

穿戴设备生物传感器与姿态算法设计方案

1. 系统概述

本方案针对智能穿戴设备(智能手环/手表),设计一套集成生物信号采集与运动姿态分析的嵌入式系统。硬件上采用多类型生物传感器(心率/血氧、体温、皮肤阻抗)和运动传感器(加速度计+陀螺仪),通过高精度ADC与DMA实现同步采集。软件层面包含数字信号处理、运动姿态算法(计步、睡眠监测、运动模式识别)以及多传感器融合与校准,以实现精准的健康监测和运动识别。


2. UML 建模

2.1 用例图

佩戴设备

查看健康数据

运动

蓝牙连接

触发

心率/血氧/体温/阻抗

加速度/陀螺仪

生理参数

计步/睡眠/运动模式

存储/上传

用户

WearDetection

App

Motion

BLE

SensorAcquisition

BioSignalProcessing

MotionSignalProcessing

DataLogging

2.2 类图(软件模块)

BioSensorManager

-adc_channel_config

-dma_buffer

+init()

+startAcquisition()

+processData()

HeartRateSensor

+init()

+setLedCurrent()

+getPPG()

-calculateHR()

-calculateSpO2()

TempSensor

+init()

+readTemp()

ImpedanceSensor

+init()

+measureImpedance()

MotionSensor

-accel_bias

-gyro_bias

+init()

+readAccelGyro()

+applyCalibration()

AttitudeEstimator

-filter_type

-quaternion

+update(accel, gyro)

+getRollPitchYaw()

StepCounter

-peak_detector

-step_threshold

+update(accel)

+getStepCount()

SleepMonitor

-hrv_calculator

+update(hr, motion)

+getSleepStage()

MotionClassifier

-features

-model

+classify(accel, gyro)

+getActivity()

2.3 状态机图(数据采集流程)

定时触发/中断

ADC启动转换

缓冲区半满/全满

数据处理完成

需要校准时

校准完成

Idle

Acquisition

DMA_Transfer

Processing

Calibration

2.4 活动图(姿态算法流程)

步行/跑步

静止

其他

加速度/陀螺仪原始数据

数据校准与滤波

运动模式识别

计步算法

睡眠监测

运动类型分类

步数累积

睡眠质量评估

活动类型标记

上传至APP


3. 生物传感器电路设计

3.1 心率/血氧传感器(MAX30102)

  • 光源驱动:MAX30102 内部集成两个LED(红光660nm、红外光880nm)和一个光电二极管,由内部驱动器控制,无需外部恒流源。仅需外部串联电阻限制峰值电流(典型:红光 20mA,红外 20mA)。
  • 驱动电路:通过I2C接口配置 LED 电流(050mA)和脉宽(69µs411µs),外部电源 1.8V 或 3.3V,需在 VDD 和 LED 引脚之间加去耦电容(0.1µF)。
  • 信号调理:内部 18 位 ADC 直接输出 PPG 信号,无需外部模拟前端。

3.2 体温传感器(MAX30205)

  • 数字温度传感器,精度 ±0.1°C,I2C 接口,直接输出温度值。
  • 电路简单:添加 4.7kΩ 上拉电阻,电源 3.3V。

3.3 皮肤阻抗传感器(AD5933)

  • 用于测量皮肤电活动(EDA)。AD5933 内置 DDS 产生正弦激励信号,通过外部电极加于皮肤,内部 ADC 采样响应,计算阻抗。
  • 电路要点:
    • 激励信号经过电流限制电阻(典型 10kΩ)连接至电极。
    • 反馈电阻 Rfb 和 Cfb 根据测量范围选择(如 Rfb=10kΩ,Cfb=10pF)。
    • 电极选用 Ag/AgCl 或导电橡胶,双电极差分测量,以减少接触阻抗影响。
  • 电源 3.3V,与 MCU 通过 I2C 通信。

4. 传感器数据采集

4.1 ADC 多通道同步采集

  • 对于非数字接口的模拟传感器(如 NTC 热敏电阻、皮肤阻抗信号),使用 MCU 内部 ADC(如 STM32 的 12 位 ADC)进行采集。
  • 配置 ADC 为 扫描模式 + 连续转换,多通道规则组,使用 DMA 循环传输。
  • 同步要求:生物信号(如 PPG)和运动信号(加速度)的时间对齐很重要,采用同一触发源(如定时器触发 ADC 转换)保证同步。

4.2 DMA 传输

  • 设置 DMA 缓冲区为双缓冲(ping-pong),半满中断或全满中断处理数据。
  • 示例配置(STM32):
// 配置 ADC1 通道 0,1,2 规则组,由 TIM2 触发
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, BUFFER_SIZE);
  • 在中断回调中处理数据,将数据送入算法模块。

4.3 传感器噪声抑制

  • 硬件滤波:模拟前端加 RC 低通(如 10kΩ+0.1µF,截止频率 ~160Hz)。
  • 软件滤波
    • PPG 信号:带通滤波(0.5~5Hz 心率范围),移动平均去噪。
    • 加速度信号:低通滤波(5Hz)用于姿态,高通滤波(0.1Hz)用于计步。
    • 采用 IIR 滤波器(如二阶 Butterworth)或 FIR 滤波器。

5. 运动姿态算法实现

5.1 基于加速度计的计步算法

  • 原理:检测垂直方向加速度的周期性变化。
  • 步骤
    1. 对加速度三轴进行低通滤波(去除高频噪声)和动态阈值计算。
    2. 计算合成加速度 acc_mag = sqrt(ax^2 + ay^2 + az^2)
    3. 减去重力加速度(静态分量)得到动态分量 acc_dyn
    4. 峰值检测:当 acc_dyn 超过动态阈值且与上次步数间隔大于最小时间(200ms)时计一步。
    5. 动态阈值根据最近 10 个峰值平均值自适应更新。
  • 代码示例
static float step_threshold = 0.5f;
static uint32_t last_step_time = 0;
static uint32_t step_count = 0;

void step_counter_update(float ax, float ay, float az)
{
    float acc_mag = sqrtf(ax*ax + ay*ay + az*az);
    static float acc_buf[10];
    // 移动平均滤波
    float acc_avg = moving_average(acc_buf, acc_mag);
    float acc_dyn = acc_mag - acc_avg;
    if (acc_dyn > step_threshold && (HAL_GetTick() - last_step_time) > 200) {
        step_count++;
        last_step_time = HAL_GetTick();
        // 动态调整阈值
        step_threshold = 0.6f * step_threshold + 0.4f * acc_dyn;
    }
}

5.2 睡眠监测算法

  • 依据:心率变异性(HRV)和体动频率。
  • 实现
    • 检测睡眠阶段:清醒期(高体动,心率高),浅睡期(低体动,心率稍降),深睡期(几乎无体动,心率低)。
    • 使用心率传感器获取 RR 间隔,计算时域指标(SDNN、RMSSD)作为 HRV。
    • 结合加速度计计算体动次数(每分钟超过阈值的样本数)。
    • 通过简单规则分类:
      • 体动次数 > 30 且 HRV < 20ms → 清醒
      • 体动次数 5~30 且 HRV 20~50ms → 浅睡
      • 体动次数 < 5 且 HRV > 50ms → 深睡

5.3 运动模式识别(步行/跑步/骑行)

  • 特征提取:从加速度和陀螺仪提取特征,如:
    • 加速度幅值的均值、方差、峰峰值
    • 频率域特征:FFT 后主频能量(步行1-2Hz,跑步2-4Hz,骑行~0.5-1Hz)
    • 陀螺仪角速度方差(骑行时手腕晃动较小)
  • 分类器:使用决策树(简单)或轻量级神经网络(如 TensorFlow Lite Micro)。
  • 决策树示例
typedef enum { ACTIVITY_WALK, ACTIVITY_RUN, ACTIVITY_BIKE } activity_t;
activity_t classify_activity(float acc_mean, float acc_std, float acc_peak_freq, float gyro_std) {
    if (acc_peak_freq < 0.8) return ACTIVITY_BIKE;
    else if (acc_peak_freq < 2.0) {
        if (acc_std > 1.5) return ACTIVITY_RUN;
        else return ACTIVITY_WALK;
    } else {
        return ACTIVITY_RUN;
    }
}

6. 数据校准与精度优化

6.1 传感器零点漂移校准

  • 加速度计:静止时记录三轴均值作为零偏,后期读数减去零偏。校准过程要求设备水平放置。
  • 陀螺仪:静止时记录角速度均值作为零偏,每次上电后自动校准(收集 200 个样本取平均)。
  • 温度传感器:出厂时用高精度恒温槽标定,存储校正系数(如线性插值表)。

6.2 不同佩戴姿态的数据补偿

  • 手腕佩戴姿态:通过加速度计确定设备相对于重力的方向,将传感器坐标系旋转至用户坐标系(如手臂方向)。使用四元数或旋转矩阵实现。
  • 例如:若设备戴在左手腕内侧,数据需要补偿 90° 旋转才能得到正确的运动方向。
  • 实现:使用姿态估计(Madgwick 或 Mahony 滤波器)得到设备姿态,将加速度/角速度转换到全局坐标系或身体坐标系。

6.3 多传感器融合提升姿态判断精度

  • 互补滤波:融合加速度计(长期姿态)和陀螺仪(短期姿态)。
  • 代码示例(Mahony 滤波)
void mahony_update(float gx, float gy, float gz, float ax, float ay, float az, float dt) {
    float recipNorm;
    float q0 = q[0], q1 = q[1], q2 = q[2], q3 = q[3];
    float gx_err, gy_err, gz_err;

    // 归一化加速度计数据
    recipNorm = invSqrt(ax*ax + ay*ay + az*az);
    ax *= recipNorm; ay *= recipNorm; az *= recipNorm;

    // 计算误差(叉积)
    float vx = 2*(q1*q3 - q0*q2);
    float vy = 2*(q0*q1 + q2*q3);
    float vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;
    gx_err = ay*vz - az*vy;
    gy_err = az*vx - ax*vz;
    gz_err = ax*vy - ay*vx;

    // 积分误差
    integral_fb[0] += gx_err * Ki * dt;
    integral_fb[1] += gy_err * Ki * dt;
    integral_fb[2] += gz_err * Ki * dt;

    // 应用反馈
    gx += Kp * gx_err + integral_fb[0];
    gy += Kp * gy_err + integral_fb[1];
    gz += Kp * gz_err + integral_fb[2];

    // 四元数积分
    float qdot1 = 0.5f * (-q1*gx - q2*gy - q3*gz);
    float qdot2 = 0.5f * ( q0*gx + q2*gz - q3*gy);
    float qdot3 = 0.5f * ( q0*gy - q1*gz + q3*gx);
    float qdot4 = 0.5f * ( q0*gz + q1*gy - q2*gx);
    q0 += qdot1 * dt; q1 += qdot2 * dt; q2 += qdot3 * dt; q3 += qdot4 * dt;
    recipNorm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
    q[0] = q0 * recipNorm; q[1] = q1 * recipNorm; q[2] = q2 * recipNorm; q[3] = q3 * recipNorm;
}
  • 融合后的姿态可用于更准确的计步(基于垂直轴加速度)和运动模式识别(身体坐标系下的角速度)。

7. 项目文件结构组织

wearable_biosensor/
├── docs/
│   ├── hardware_schematics/          # 硬件原理图(PDF/SCH)
│   │   ├── mainboard.pdf
│   │   ├── sensor_board.pdf
│   │   └── flex_circuit.pdf
│   ├── algorithms/                    # 算法设计文档
│   │   ├── step_counter.md
│   │   ├── sleep_monitor.md
│   │   └── activity_classifier.md
│   └── calibration/                   # 校准流程文档
├── firmware/
│   ├── inc/
│   │   ├── main.h
│   │   ├── sensors.h
│   │   ├── algorithms.h
│   │   ├── calibration.h
│   │   └── config.h
│   ├── src/
│   │   ├── main.c
│   │   ├── sensors.c
│   │   ├── algorithms.c
│   │   └── calibration.c
│   ├── drivers/
│   │   ├── max30102.c
│   │   ├── max30205.c
│   │   ├── ad5933.c
│   │   ├── bmi160.c
│   │   └── stm32_hal_adc_dma.c
│   ├── math/
│   │   ├── filters.c
│   │   ├── mahony_filter.c
│   │   └── fft.c
│   └── projects/
│       ├── keil/
│       └── makefile
├── tests/
│   ├── unit_tests/                    # 算法单元测试
│   │   ├── test_step_counter.c
│   │   └── test_sleep_monitor.c
│   └── validation/                    # 真人佩戴验证数据
├── tools/
│   ├── calibration_gui/               # PC端校准工具
│   └── data_logger/                   # 数据记录工具
└── README.md

8. 关键代码实现

8.1 ADC DMA 双缓冲采集(STM32 HAL)

#define ADC_BUFFER_SIZE 256
volatile uint16_t adc_buffer[ADC_BUFFER_SIZE];
volatile uint8_t buffer_index = 0;

void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc) {
    // 处理前一半数据
    process_adc_data(adc_buffer, ADC_BUFFER_SIZE/2);
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
    // 处理后一半数据
    process_adc_data(&adc_buffer[ADC_BUFFER_SIZE/2], ADC_BUFFER_SIZE/2);
}

void start_adc_dma(void) {
    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_BUFFER_SIZE);
}

void process_adc_data(uint16_t* data, uint32_t length) {
    for (uint32_t i = 0; i < length; i++) {
        // 将 ADC 值转换为物理量(电压、温度等)
        // 送入滤波器和算法模块
    }
}

8.2 PPG 信号处理(心率提取)

#define HR_BUFFER_SIZE 100
static float ppg_buffer[HR_BUFFER_SIZE];
static uint8_t ppg_index = 0;

void add_ppg_sample(float sample) {
    ppg_buffer[ppg_index++] = sample;
    if (ppg_index >= HR_BUFFER_SIZE) {
        ppg_index = 0;
        calculate_heart_rate();
    }
}

void calculate_heart_rate(void) {
    // 1. 带通滤波(0.5~5Hz)
    // 2. 峰值检测
    // 3. 计算平均间隔时间 -> 心率(bpm)
}

8.3 卡尔曼滤波用于姿态估计(简化)

typedef struct {
    float angle;      // 估计角度
    float bias;       // 陀螺仪漂移
    float P[2][2];    // 协方差矩阵
} Kalman_t;

void Kalman_init(Kalman_t *k, float q_angle, float q_bias, float r_measure) {
    // 初始化参数
}

float Kalman_update(Kalman_t *k, float new_angle, float new_rate, float dt) {
    // 预测
    k->angle += dt * (new_rate - k->bias);
    // 更新协方差
    // 计算卡尔曼增益
    // 更新角度和漂移
    return k->angle;
}

8.4 运动模式识别(基于特征和决策树)

typedef struct {
    float acc_mean;
    float acc_std;
    float acc_peak_freq;
    float gyro_std;
} MotionFeatures_t;

void extract_features(float* acc_buf, uint32_t len, float* gyro_buf, MotionFeatures_t* feat) {
    // 计算均值、标准差、FFT 获取主频等
}

activity_t classify(MotionFeatures_t* feat) {
    if (feat->acc_peak_freq < 0.8) return ACTIVITY_BIKE;
    else if (feat->acc_peak_freq < 2.0) {
        if (feat->acc_std > 1.5) return ACTIVITY_RUN;
        else return ACTIVITY_WALK;
    } else {
        return ACTIVITY_RUN;
    }
}

9. 总结

本方案详细阐述了智能穿戴设备中生物传感器与姿态算法的硬件电路设计、数据采集策略、核心算法实现及校准优化方法。通过多传感器融合、数字信号处理和机器学习分类,能够实现高精度的生理参数监测和运动识别。提供的代码框架和项目结构便于实际开发与测试。后续可根据产品需求增加更多生物传感器(如血压、血糖)并升级算法模型(如神经网络),进一步提升用户体验。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐