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