STM32 · Embedded · 05
ADC1·TIM1 250 Hz 동기 샘플링
ECG 코드 변형을 비교해 보니 핵심은 TIM1 update interrupt를 sample clock으로 쓰고 ADC1을 한 번 읽는 구조였다. 250 Hz 버전은 sample_index와 timestamp_us를 함께 보내며, 5-sample moving average 뒤에 filter를 적용한다.

먼저 확인한 것
ECG 코드 변형을 비교해 보니 핵심은 TIM1 update interrupt를 sample clock으로 쓰고 ADC1을 한 번 읽는 구조였다. 250 Hz 버전은 sample_index와 timestamp_us를 함께 보내며, 5-sample moving average 뒤에 filter를 적용한다.
원본 구성
- ADC는 12-bit 값으로 읽고 3.3/4095를 곱해 voltage로 바꾼다.
- polling timeout과 UART 전송 시간이 sampling period를 넘지 않는지 따로 확인해야 한다.
- 저장된 코드는 구조를 보여 주지만 timing jitter 측정 로그는 남아 있지 않다.
코드 흐름
#define ECG_FS_HZ 250U
sample_index++;
HAL_ADC_Start(&hadc1);
ADCValue = HAL_ADC_GetValue(&hadc1);
Smooth_ECG = total / numReadings;
timestamp_us = sample_index * 1000000ULL / ECG_FS_HZ;
핵심 용어
- TIM1 interrupt
- ADC1
- 250 Hz
- sample index
다시 볼 때의 순서
- TIM1 interrupt
- ADC1 → 250 Hz
- sample index
공식 문서
- STM32CubeF4 Getting Started (UM1730)
- STM32 DSP with CMSIS (AN4841)
- Arm CMSIS-DSP
- STM32CubeF4 repository
새로 확인한 원본은 실험 사진 22장, STM 사용법 40장, 3쪽 KiCad 회로도, ADC·UART 메모, HRV 모듈, PPG 코드 2종, ECG C 코드 변형 12개와 CubeIDE 프로젝트 압축본이다. 같은 SHA-256의 중복 코드와 ST·Arm vendor 파일은 별도 결과처럼 세지 않았다. 사진과 코드로 확인되는 구성까지만 적고 측정 성능은 새로 만들지 않았다.