基于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) | | (实时显示/存储) |
+---------------------+ +---------------------+ +---------------------+
二、硬件配置要点
-
ADC模块选型
- 推荐ADS1299(24位ΔΣ ADC)
- 支持8通道同步采样
- 内置参考电压(2.4V)
- 可编程增益放大器(PGA):1-64倍
-
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);
三、软件实现流程
-
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位数据 } } -
数据预处理
#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; } -
蓝牙数据传输
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端处理方案
-
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 -
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
五、关键优化措施
-
信号完整性保障
- 硬件级:添加二级工频陷波滤波器(50/60Hz)
- 软件级:采用移动平均滤波(窗口宽度=10)
-
功耗管理方案
// 低功耗模式配置 HAL_PWR_EnableSleepOnExit(); HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); -
数据可靠性机制
- CRC16校验:每帧数据附加2字节校验码
- 重传机制:异常数据包自动重发(最大3次)
六、调试建议
- 使用逻辑分析仪验证SPI通信时序
- 通过示波器观察ADC输入/输出波形
- 在PC端实现虚拟示波器功能实时监控
- 使用Wireshark抓包分析蓝牙通信数据
浙公网安备 33010602011771号