基于STM32实现多模态生物电信号采集与传输

基于STM32实现多模态生物电信号采集与传输的系统设计

一、系统架构设计

+---------------------+       +---------------------+       +---------------------+
| STM32 MCU           |<----SPI---->| ADC模块(ADS1299)    |<----| 生物电传感器阵列    |
| (主控制器)          |       | (24位ΔΣ ADC)        |       | (EEG/EOG/ECG电极)   |
+---------------------+       +---------------------+       +---------------------+
           |                            |                            |
           | USART+DMA                | SPI+DMA                    |
           v                            v                            v
+---------------------+       +---------------------+       +---------------------+
| 蓝牙模块(HC-05)     |<----UART---->| PC端处理系统        |       | 数据分析软件        |
| (BLE 4.0)           |       | (MATLAB/Python)     |       | (实时显示/存储)     |
+---------------------+       +---------------------+       +---------------------+

二、硬件配置要点

  1. ADC模块选型

    • 推荐ADS1299(24位ΔΣ ADC)
    • 支持8通道同步采样
    • 内置参考电压(2.4V)
    • 可编程增益放大器(PGA):1-64倍
  2. STM32外设配置

    // SPI1配置(ADC通信)
    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_256;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi1.Init.CRCPolynomial = 7;
    HAL_SPI_Init(&hspi1);
    
    // USART2配置(蓝牙通信)
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TXRX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart2);
    

三、软件实现流程

  1. ADC数据采集

    void ADC_Read_Data(uint8_t *buffer) {
        // 发送控制指令
        HAL_SPI_Transmit(&hspi1, (uint8_t*)0xA5A5, 2, 100); // 起始标志
        
        // 选择通道0-7
        for(int ch=0; ch<8; ch++) {
            HAL_SPI_Transmit(&hspi1, &ch, 1, 100);
            HAL_SPI_Receive(&hspi1, &buffer[ch*3], 3, 100); // 24位数据
        }
    }
    
  2. 数据预处理

    #define SAMPLE_RATE 250  // 250Hz采样率
    #define BUFFER_SIZE 512
    
    float butterworth_bandpass(float *input, float *output, int len) {
        // 实现0.5-40Hz带通滤波
        // 使用双二阶滤波器级联
        // 系数参考MATLAB生成
        return filtered_value;
    }
    
  3. 蓝牙数据传输

    void BLE_Send_Packet(uint8_t *data, uint16_t len) {
        uint8_t packet[256] = {0xAA, 0x55}; // 自定义协议头
        memcpy(packet+2, data, len);
        HAL_UART_Transmit(&huart2, packet, len+2, 1000);
    }
    

参考源码 STM32通过SPI通信控制ADC采集脑电、眼电、心电数据 www.youwenfan.com/contentcni/72775.html

四、PC端处理方案

  1. MATLAB实时分析脚本

    s = serialport('COM3', 115200);
    while true
        data = read(s, 512, 'uint8');
        % 解包处理
        [eeg, eog, ecg] = parse_data(data);
        % 实时显示
        plot_eeg(eeg);
        % 心率计算
        hr = calculate_hr(ecg);
        % 异常检测
        if detect_seizure(ecg)
            send_alert('异常脑电活动!');
        end
    end
    
  2. Python数据处理示例

    import serial
    import numpy as np
    from scipy.signal import butter, filtfilt
    
    ser = serial.Serial('COM3', 115200)
    buffer = np.zeros(512, dtype=np.float32)
    
    def process_data(data):
        # 解析二进制数据
        raw = np.frombuffer(data, dtype=np.int32)
        # 滤波处理
        b, a = butter(4, [0.5, 40]/(250/2), 'bandpass')
        filtered = filtfilt(b, a, raw)
        # 特征提取
        features = extract_features(filtered)
        return features
    

五、关键优化措施

  1. 信号完整性保障

    • 硬件级:添加二级工频陷波滤波器(50/60Hz)
    • 软件级:采用移动平均滤波(窗口宽度=10)
  2. 功耗管理方案

    // 低功耗模式配置
    HAL_PWR_EnableSleepOnExit();
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    
  3. 数据可靠性机制

    • CRC16校验:每帧数据附加2字节校验码
    • 重传机制:异常数据包自动重发(最大3次)

六、调试建议

  1. 使用逻辑分析仪验证SPI通信时序
  2. 通过示波器观察ADC输入/输出波形
  3. 在PC端实现虚拟示波器功能实时监控
  4. 使用Wireshark抓包分析蓝牙通信数据
posted @ 2025-09-25 16:53  chen_yig  阅读(37)  评论(0)    收藏  举报