新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 心電圖方案全解析:手把手教你開(kāi)發(fā)醫(yī)療級(jí)心電監(jiān)測(cè)設(shè)備!

STM32 心電圖方案全解析:手把手教你開(kāi)發(fā)醫(yī)療級(jí)心電監(jiān)測(cè)設(shè)備!

作者:嵌入式芯視野 時(shí)間:2025-08-04 來(lái)源:今日頭條 收藏

心電圖(ECG)方案基于 芯片開(kāi)發(fā),主要應(yīng)用于醫(yī)療領(lǐng)域的心電圖機(jī)設(shè)備。該設(shè)備通過(guò)采集人體體表電信號(hào),記錄心臟電活動(dòng)的波形,為心臟疾病診斷提供關(guān)鍵數(shù)據(jù)支持。其典型應(yīng)用包括:

  • 臨床診斷:用于常規(guī)體檢、心臟病患者的日常監(jiān)測(cè)及病情評(píng)估。

  • 重癥監(jiān)護(hù):與多參數(shù)監(jiān)護(hù)儀集成,實(shí)時(shí)監(jiān)測(cè)患者心臟功能。

  • 家庭醫(yī)療:便攜式心電圖機(jī)可滿足家庭用戶的日常健康監(jiān)測(cè)需求。

工作原理




ECG組成框圖


心臟在收縮和舒張過(guò)程中產(chǎn)生電激動(dòng),其微小電流經(jīng)身體組織傳導(dǎo)至體表,形成不同部位的電位差。心電圖機(jī)通過(guò)體表電極采集這些電位差,經(jīng)信號(hào)調(diào)理、模數(shù)轉(zhuǎn)換和數(shù)據(jù)處理后,生成心電圖波形。具體流程如下:

  1. 信號(hào)采集:通過(guò) 10 個(gè)體表電極(如右手 VR、左手 VL 等)獲取 12 導(dǎo)聯(lián)心電信號(hào)。

  2. 信號(hào)調(diào)理:經(jīng)儀表運(yùn)放(如 INA126)前級(jí)放大、精密運(yùn)放(如 ISL28248)后級(jí)放大,以及高通 / 低通濾波(HPF/LPF)去除噪聲。

  3. 模數(shù)轉(zhuǎn)換:利用高精度 ADC(如 ADS1258)將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)。

  4. 數(shù)據(jù)處理: 芯片對(duì)數(shù)字信號(hào)進(jìn)行濾波、放大倍數(shù)校準(zhǔn)等處理。

  5. 顯示與存儲(chǔ):將處理后的波形顯示在 LCD 上,并存儲(chǔ)歷史數(shù)據(jù)。

系統(tǒng)組成與 IC 選型

模塊

功能

推薦芯片

競(jìng)爭(zhēng)對(duì)手

主控芯片

完成 ADC 控制、數(shù)據(jù)處理及系統(tǒng)管理

F101/103 系列

MSP430 系列、MEGA 系列

前級(jí)放大

心電信號(hào)初級(jí)放大

INA126/128、ISL28470

AD620、AD623

后級(jí)放大

信號(hào)進(jìn)一步放大

ISL28248、TL062

-

模數(shù)轉(zhuǎn)換

模擬信號(hào)數(shù)字化

ADS1258、ADS8341

-

電壓基準(zhǔn)

為 ADC 提供參考電壓

REF30xx、ISL21009

-

電源管理

系統(tǒng)供電轉(zhuǎn)換

TPS5430、ISL8500

LM2576、LM2676

程序示例

以下是基于 STM32F103 的心電圖數(shù)據(jù)采集與處理程序示例(使用 HAL 庫(kù)):

/* 包含頭文件 */#include "stm32f10x_hal.h"#include "stdio.h"#include "math.h"/* 定義參數(shù) */#define SAMPLE_RATE 1000        // 采樣率1000Hz#define FILTER_ORDER 32         // FIR濾波器階數(shù)#define ECG_CHANNEL 8           // 心電通道數(shù)#define BUFFER_SIZE 1024        // 數(shù)據(jù)緩沖區(qū)大小/* 全局變量 */ADC_HandleTypeDef hadc;
DMA_HandleTypeDef hdma_adc;uint16_t adcBuffer[ECG_CHANNEL][BUFFER_SIZE];  // ADC數(shù)據(jù)緩沖區(qū)float ecgData[ECG_CHANNEL][BUFFER_SIZE];       // 心電數(shù)據(jù)數(shù)組float firCoeff[FILTER_ORDER] = {0};            // FIR濾波器系數(shù)uint32_t sampleCount = 0;                      // 采樣計(jì)數(shù)/* 函數(shù)聲明 */void SystemInit(void);void MX_GPIO_Init(void);void MX_ADC_Init(void);void MX_DMA_Init(void);void FIRFilter_Init(void);void FIRFilter_Process(float* input, float* output, uint32_t length);void ECG_Process(void);void LCD_DisplayECG(float* ecgData, uint32_t length);/* 主函數(shù) */int main(void){  /* 系統(tǒng)初始化 */
 HAL_Init();
 SystemInit();  
 /* 外設(shè)初始化 */
 MX_GPIO_Init();
 MX_ADC_Init();
 MX_DMA_Init();
 FIRFilter_Init();  // 初始化FIR濾波器
 
 /* 啟動(dòng)ADC_DMA傳輸 */
 HAL_ADC_Start_DMA(&hadc, (uint32_t*)adcBuffer, BUFFER_SIZE * ECG_CHANNEL);  
 /* 主循環(huán) */
 while (1)
 {    /* 心電數(shù)據(jù)處理 */
   if (sampleCount >= BUFFER_SIZE)
   {
     ECG_Process();  // 處理采集到的心電數(shù)據(jù)
     LCD_DisplayECG(ecgData[0], BUFFER_SIZE);  // 顯示第一通道心電波形
     sampleCount = 0;
   }    
   /* 其他系統(tǒng)任務(wù) */
   HAL_Delay(1);
 }
}/* ADC初始化 */void MX_ADC_Init(void){
 ADC_ChannelConfTypeDef sConfig = {0};

 hadc.Instance = ADC1;
 hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
 hadc.Init.Resolution = ADC_RESOLUTION_12B;
 hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
 hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
 hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
 hadc.Init.LowPowerAutoWait = DISABLE;
 hadc.Init.LowPowerAutoPowerOff = DISABLE;
 hadc.Init.ContinuousConvMode = ENABLE;
 hadc.Init.NbrOfConversion = ECG_CHANNEL;
 hadc.Init.DiscontinuousConvMode = DISABLE;
 HAL_ADC_Init(&hadc);  /* 配置心電通道 */
 for (uint8_t i = 0; i < ECG_CHANNEL; i++)
 {
   sConfig.Channel = ADC_CHANNEL_0 + i;  // 假設(shè)通道0-7為心電通道
   sConfig.Rank = i + 1;
   sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
   HAL_ADC_ConfigChannel(&hadc, &sConfig);
 }
}/* DMA初始化 */void MX_DMA_Init(void){
 hdma_adc.Instance = DMA1_Channel1;
 hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
 hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
 hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
 hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
 hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
 hdma_adc.Init.Mode = DMA_CIRCULAR;
 hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
 HAL_DMA_Init(&hdma_adc);

 __HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc);
}/* FIR濾波器初始化 */void FIRFilter_Init(void){  /* 生成低通FIR濾波器系數(shù)(截止頻率50Hz,采樣率1000Hz) */
 float fc = 50.0f / 1000.0f;  // 歸一化截止頻率
 for (int i = 0; i < FILTER_ORDER; i++)
 {    if (i == FILTER_ORDER / 2)
     firCoeff[i] = 2.0f * fc;    else
     firCoeff[i] = sinf(2.0f * PI * fc * (i - FILTER_ORDER / 2)) / (PI * (i - FILTER_ORDER / 2));    
   /* 漢明窗加權(quán) */
   firCoeff[i] *= 0.54f - 0.46f * cosf(2.0f * PI * i / (FILTER_ORDER - 1));
 }  
 /* 系數(shù)歸一化 */
 float sum = 0;  for (int i = 0; i < FILTER_ORDER; i++)
   sum += firCoeff[i];    
 for (int i = 0; i < FILTER_ORDER; i++)
   firCoeff[i] /= sum;
}/* FIR濾波器處理 */void FIRFilter_Process(float* input, float* output, uint32_t length){  static float buffer[FILTER_ORDER] = {0};  // 濾波器緩沖區(qū)
 
 for (uint32_t i = 0; i < length; i++)
 {    /* 移存輸入數(shù)據(jù) */
   for (int j = FILTER_ORDER - 1; j > 0; j--)
     buffer[j] = buffer[j - 1];
   buffer[0] = input[i];    
   /* 卷積計(jì)算 */
   output[i] = 0;    for (int j = 0; j < FILTER_ORDER; j++)
     output[i] += buffer[j] * firCoeff[j];
 }
}/* 心電數(shù)據(jù)處理 */void ECG_Process(void){  /* ADC數(shù)據(jù)轉(zhuǎn)換為電壓值(假設(shè)參考電壓3.3V) */
 for (uint8_t ch = 0; ch < ECG_CHANNEL; ch++)
 {    for (uint32_t i = 0; i < BUFFER_SIZE; i++)
   {
     ecgData[ch][i] = (float)adcBuffer[ch][i] * 3.3f / 4096.0f;
   }    
   /* 應(yīng)用FIR濾波器去除噪聲 */
   FIRFilter_Process(ecgData[ch], ecgData[ch], BUFFER_SIZE);    
   /* 基線漂移校正(簡(jiǎn)單直流分量去除) */
   float dcOffset = 0;    for (uint32_t i = 0; i < BUFFER_SIZE; i++)
     dcOffset += ecgData[ch][i];
   dcOffset /= BUFFER_SIZE;    
   for (uint32_t i = 0; i < BUFFER_SIZE; i++)
     ecgData[ch][i] -= dcOffset;
 }
 
 sampleCount += BUFFER_SIZE;
}

方案特點(diǎn)與優(yōu)勢(shì)

  1. 高精度采集:采用 12 位 ADC(如 ADS1258)和精密運(yùn)放,確保信號(hào)采集精度。

  2. 抗干擾設(shè)計(jì):通過(guò)多級(jí)濾波(高通、低通、FIR)有效抑制工頻干擾、基線漂移等噪聲。

  3. 多導(dǎo)聯(lián)支持:可同時(shí)采集 12 導(dǎo)聯(lián)心電信號(hào),滿足臨床診斷需求。

  4. 實(shí)時(shí)處理:STM32 的高速運(yùn)算能力實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)采集、處理與顯示。

  5. 低功耗設(shè)計(jì):采用 LDO 和 DC/DC 電源管理芯片,適合便攜式設(shè)備應(yīng)用。



關(guān)鍵詞: STM32

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉