• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 心電圖方案全解析:手把手教你開發醫療級心電監測設備!

    STM32 心電圖方案全解析:手把手教你開發醫療級心電監測設備!

    作者:嵌入式芯視野 時間:2025-08-04 來源:今日頭條 收藏

    心電圖(ECG)方案基于 芯片開發,主要應用于醫療領域的心電圖機設備。該設備通過采集人體體表電信號,記錄心臟電活動的波形,為心臟疾病診斷提供關鍵數據支持。其典型應用包括:

    • 臨床診斷:用于常規體檢、心臟病患者的日常監測及病情評估。

    • 重癥監護:與多參數監護儀集成,實時監測患者心臟功能。

    • 家庭醫療:便攜式心電圖機可滿足家庭用戶的日常健康監測需求。

    工作原理




    ECG組成框圖


    心臟在收縮和舒張過程中產生電激動,其微小電流經身體組織傳導至體表,形成不同部位的電位差。心電圖機通過體表電極采集這些電位差,經信號調理、模數轉換和數據處理后,生成心電圖波形。具體流程如下:

    1. 信號采集:通過 10 個體表電極(如右手 VR、左手 VL 等)獲取 12 導聯心電信號。

    2. 信號調理:經儀表運放(如 INA126)前級放大、精密運放(如 ISL28248)后級放大,以及高通 / 低通濾波(HPF/LPF)去除噪聲。

    3. 模數轉換:利用高精度 ADC(如 ADS1258)將模擬信號轉換為數字信號。

    4. 數據處理: 芯片對數字信號進行濾波、放大倍數校準等處理。

    5. 顯示與存儲:將處理后的波形顯示在 LCD 上,并存儲歷史數據。

    系統組成與 IC 選型

    模塊

    功能

    推薦芯片

    競爭對手

    主控芯片

    完成 ADC 控制、數據處理及系統管理

    F101/103 系列

    MSP430 系列、MEGA 系列

    前級放大

    心電信號初級放大

    INA126/128、ISL28470

    AD620、AD623

    后級放大

    信號進一步放大

    ISL28248、TL062

    -

    模數轉換

    模擬信號數字化

    ADS1258、ADS8341

    -

    電壓基準

    為 ADC 提供參考電壓

    REF30xx、ISL21009

    -

    電源管理

    系統供電轉換

    TPS5430、ISL8500

    LM2576、LM2676

    程序示例

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

    /* 包含頭文件 */#include "stm32f10x_hal.h"#include "stdio.h"#include "math.h"/* 定義參數 */#define SAMPLE_RATE 1000        // 采樣率1000Hz#define FILTER_ORDER 32         // FIR濾波器階數#define ECG_CHANNEL 8           // 心電通道數#define BUFFER_SIZE 1024        // 數據緩沖區大小/* 全局變量 */ADC_HandleTypeDef hadc;
    DMA_HandleTypeDef hdma_adc;uint16_t adcBuffer[ECG_CHANNEL][BUFFER_SIZE];  // ADC數據緩沖區float ecgData[ECG_CHANNEL][BUFFER_SIZE];       // 心電數據數組float firCoeff[FILTER_ORDER] = {0};            // FIR濾波器系數uint32_t sampleCount = 0;                      // 采樣計數/* 函數聲明 */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);/* 主函數 */int main(void){  /* 系統初始化 */
     HAL_Init();
     SystemInit();  
     /* 外設初始化 */
     MX_GPIO_Init();
     MX_ADC_Init();
     MX_DMA_Init();
     FIRFilter_Init();  // 初始化FIR濾波器
     
     /* 啟動ADC_DMA傳輸 */
     HAL_ADC_Start_DMA(&hadc, (uint32_t*)adcBuffer, BUFFER_SIZE * ECG_CHANNEL);  
     /* 主循環 */
     while (1)
     {    /* 心電數據處理 */
       if (sampleCount >= BUFFER_SIZE)
       {
         ECG_Process();  // 處理采集到的心電數據
         LCD_DisplayECG(ecgData[0], BUFFER_SIZE);  // 顯示第一通道心電波形
         sampleCount = 0;
       }    
       /* 其他系統任務 */
       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;  // 假設通道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濾波器系數(截止頻率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));    
       /* 漢明窗加權 */
       firCoeff[i] *= 0.54f - 0.46f * cosf(2.0f * PI * i / (FILTER_ORDER - 1));
     }  
     /* 系數歸一化 */
     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};  // 濾波器緩沖區
     
     for (uint32_t i = 0; i < length; i++)
     {    /* 移存輸入數據 */
       for (int j = FILTER_ORDER - 1; j > 0; j--)
         buffer[j] = buffer[j - 1];
       buffer[0] = input[i];    
       /* 卷積計算 */
       output[i] = 0;    for (int j = 0; j < FILTER_ORDER; j++)
         output[i] += buffer[j] * firCoeff[j];
     }
    }/* 心電數據處理 */void ECG_Process(void){  /* ADC數據轉換為電壓值(假設參考電壓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;
       }    
       /* 應用FIR濾波器去除噪聲 */
       FIRFilter_Process(ecgData[ch], ecgData[ch], BUFFER_SIZE);    
       /* 基線漂移校正(簡單直流分量去除) */
       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;
    }

    方案特點與優勢

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

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

    3. 多導聯支持:可同時采集 12 導聯心電信號,滿足臨床診斷需求。

    4. 實時處理:STM32 的高速運算能力實現數據的實時采集、處理與顯示。

    5. 低功耗設計:采用 LDO 和 DC/DC 電源管理芯片,適合便攜式設備應用。



    關鍵詞: STM32

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 普兰店市| 宁陕县| 景泰县| 茌平县| 滨海县| 岑溪市| 黑山县| 那曲县| 右玉县| 多伦县| 秭归县| 雷州市| 伊金霍洛旗| 利津县| 颍上县| 洪洞县| 固始县| 台山市| 墨竹工卡县| 石首市| 镶黄旗| 古交市| 桃源县| 无为县| 田林县| 易门县| 天祝| 永福县| 从化市| 凉山| 唐河县| 勃利县| 安顺市| 盖州市| 南江县| 日喀则市| 钟山县| 古田县| 原阳县| 蓬莱市| 金川县|