Designing an ECG Acquisition System with STM32

System Overview

An ECG acquisision system captures human electrocardiogram (ECG) signals through electrode arrays. The signals undergo signal conditioning (amplification and filtering) before being processed by an STM32 microcontroller for analog-to-digital conversion (ADC), digital filtering, and feature extraction (e.g., heart rate, QRS complex). The system suppports real-time display, data storage, and wireless transmission. Key requirements include high gain (over 1000x), low noise (<1μV), and noise immunity (e.g., power-line and EMG interference). Applications include portable monitors, telemedicine, and fitness tracking.

Architecture and Hardware Design

System Architecture

The system consists of ECG electrodes feeding into a front-end conditioning circuit, which outputs to the STM32 ADC. The microcontroller processes the data for display, storage, or transmission via Bluetooth/Wi-Fi. A power management module supplies 3.3V to all components.

Key Hardware Components

Module Model/Parameters Function
Main Controller STM32F103C8T6 (72MHz, 12-bit ADC) Signal acquisition, filtering, heart rate calculation
Front-End Conditioning AD8232 (instrumentation amplifier, gain 1000) ECG amplification, bandpass filtering (0.5-40Hz)
ADC STM32 built-in 12-bit ADC (1μs conversion time) Analog-to-digital conversion (250Hz sampling)
Display 0.96-inch OLED (128×64, I2C) Real-time ECG waveform and heart rate display
Storage MicroSD card (SPI, 8GB) ECG data storage in CSV format
Communication HC-05 Bluetooth (UART, 2.4GHz) Wireless data transfer to mobile app
Power Li-ion battery (3.7V/500mAh) with TP4056 charger System power with low-power management

Core Circuit Design

Front-End Conditioning (AD8232)

Amplifies 0.5-5mV ECG signals to 0-3.3V (STM32 ADC range) and filters out 50Hz power-line noise and high-frequency EMG interference. Uses a three-electrode configuration (RA, LA, RL). Output connects to STM32 PA0 (ADC1 channel 0).

STM32 ADC Circuit

Operates at 250Hz sampling rate (Nyquist compliant for ECG signals). Uses 12-bit resolution and timer-triggered conversions with DMA for efficient data transfer.

Software Implementation (C Language)

Main Program Flow

#include "stm32f10x.h"
#include "ad8232.h"
#include "adc_dma.h"
#include "filter.h"
#include "hr_calc.h"
#include "oled.h"
#include "sd_card.h"
#include "bluetooth.h"

typedef struct {
  uint8_t sampling_active;
  uint16_t adc_data[250];
  float filtered_ecg[250];
  uint8_t bpm;
} SysStatus;

int main(void) {
  hardware_init();
  ad8232_init();
  adc_dma_setup(250);
  oled_init();
  sd_init();
  bt_init();
  
  SysStatus status = {0};
  status.sampling_active = 1;
  
  while (1) {
    if (status.sampling_active) {
      adc_start_conversion();
      while (!dma_transfer_complete());
      dma_clear_flag();
      
      for (int i=0; i<250; i++) {
        status.filtered_ecg[i] = filter_data((float)status.adc_data[i]);
      }
      
      status.bpm = compute_heart_rate(status.filtered_ecg, 250);
      
      show_ecg_waveform(status.filtered_ecg, 250);
      display_heart_rate(status.bpm);
      save_to_sd(status.filtered_ecg, 250);
      transmit_via_bt(status.filtered_ecg, 250);
      
      if (idle_detected()) {
        enter_low_power(1000);
      }
    }
  }
}

Key Modules

ADC and DMA Configuraton

void adc_dma_setup(uint16_t sample_rate) {
  // Enable clocks, configure GPIO and ADC
  // Set up DMA for automatic transfer to memory
  // Configure timer for 250Hz triggering
}

Digital Filtering

float notch_50hz(float input) {
  // IIR notch filter implementation
}

float moving_avg(float input) {
  // 5-point moving average filter
}

float filter_data(float raw_adc) {
  float voltage = (raw_adc / 4095.0f) * 3.3f;
  voltage -= 0.5f; // Remove DC offset
  float notched = notch_50hz(voltage);
  return moving_avg(notched);
}

Heart Rate Calculation

uint8_t compute_heart_rate(float* signal, uint16_t len) {
  // Detect QRS peaks using thresholding
  // Calculate RR intervals and convert to BPM
}

Testing and Optimization

Performance Metrics

Parameter Target Test Method
Input Range 0.5-5mV Signal generator simulation
Gain 1000x Measure output for 1mV input
Sampling Rate 250Hz Oscilloscope timer check
Heart Rate Accuracy ±5 BPM Comparison with medical ECG
Noise Rejection >40dB at 50Hz Interference signal attenuation test

Optimization Strategies

  • Use shielded cables and grounded enclosures for noise reduction
  • Implement adaptive filtering (e.g., LMS algorithm)
  • Enable low-power modes during idle periods
  • Use advanced QRS detection algorithms (e.g., Pan-Tompkins)
  • Apply data compression for extended storage

Tags: STM32 ECG AD8232 Signal Processing Embedded Systems

Posted on Fri, 04 Sep 2026 16:23:27 +0000 by beselabios