그라운드 임베디드 EN 유튜브 구독

노트 / MCU 펌웨어

ADC: 단일, 연속, 타이머 동기 샘플링

STM32 ADC의 변환 모드, 샘플링 시간, 여러 채널 스캔, 타이머 트리거로 정확한 주기 샘플링을 하는 방법.

GROUND EMBEDDED · 정리 노트펌웨어 08ADC 1TIM1 PWM 중앙 → TRGO → ADC 인젝티드 변환 → 완료 인…

변환 모드

모드 동작 용도
단일 변환 명령할 때 한 번 가끔 읽는 배터리 전압
연속 변환 끝나면 바로 다시 빠르게 계속 감시
스캔 여러 채널을 차례로 센서 여러 개
외부 트리거 타이머 이벤트마다 제어용 정주기 샘플링
인젝티드 채널 정규 변환 중에 끼어들어 우선 변환 모터 상전류

샘플링 시간

채널마다 샘플링 사이클 수(3, 15, 28, 56 … 480)를 정합니다. 소스 임피던스가 크면 길게 잡습니다. 변환 시간 = 샘플링 사이클 + 12사이클(12비트).

타이머 트리거

타이머정확한 주기트리거ADC변환DMA결과 옮기기버퍼
샘플링 주기를 코드가 아니라 타이머가 정합니다. CPU는 버퍼가 찼을 때만 일합니다.
TIM1 PWM 중앙 → TRGO → ADC 인젝티드 변환 → 완료 인터럽트에서 FOC 계산

모터 제어에서는 스위칭 노이즈를 피해 PWM 주기의 정해진 순간(로우사이드가 켜져 있는 중앙)에 상전류를 샘플링해야 합니다. 이 동기화를 하드웨어로 하는 것이 핵심입니다.

정확도 높이기

  • 내부 기준 전압 채널(VREFINT)을 읽어 실제 VDDA를 계산하고 보정
  • 칩별 보정값(캘리브레이션)을 시작 시 실행
  • 여러 번 읽어 평균, 또는 하드웨어 오버샘플링

숫자를 전압으로 바꾸기

12비트 ADC는 0부터 4095까지의 숫자를 냅니다.

전압 = ADC 값 × Vref / 4095
1 LSB = 3.3 V / 4096 ≈ 0.8 mV
uint32_t mv = (uint32_t)adc * 3300u / 4095u;   // 정수로 mV 계산

adc / 4095 * 3300처럼 나눗셈을 먼저 쓰면 정수 나눗셈 때문에 거의 항상 0이 됩니다. 곱셈을 먼저 합니다.

샘플링 시간이 짧으면 값이 틀린다

ADC 안에는 작은 커패시터가 있고, 샘플링 시간 동안 입력 전압으로 충전됩니다. 신호원의 저항이 크면 충전이 덜 된 채로 변환이 시작되어 값이 낮게 나옵니다.

신호원 대처
OP 앰프 출력, 낮은 저항 짧은 샘플링 시간으로 충분
수십 kΩ 분배 저항 샘플링 시간을 길게, 입력에 100 nF 추가
여러 채널을 번갈아 읽기 채널을 바꾼 직후 값이 이전 채널에 끌려감. 샘플링 시간을 늘림
3D 실험실여기까지 읽은 내용을 직접 돌려 볼 수 있습니다→

세 가지 읽는 방법

  • 폴링: 변환을 시작하고 끝날 때까지 기다립니다. 가끔 읽는 온도, 배터리 전압.
  • 인터럽트: 변환이 끝나면 핸들러에서 값을 가져옵니다.
  • 타이머 트리거 + DMA: 타이머가 정확한 주기로 변환을 시작하고 결과를 DMA가 버퍼에 쌓습니다. 주기가 일정해야 하는 신호 처리와 모터 제어.

모터 전류는 PWM 주기의 가운데에서 재야 스위칭 노이즈를 피할 수 있어서, PWM 타이머가 ADC를 직접 트리거하도록 설정합니다.

그림으로 보기: PWM 가운데에서 샘플링

PWMADC 트리거켜짐샘플꺼짐켜짐샘플
스위치가 바뀌는 순간에는 전류에 노이즈가 섞입니다. PWM이 켜진 구간 한가운데에서 ADC를 트리거합니다.

노이즈 줄이기

  • 평균: 16번 더해 4비트 밀면 간단한 평균이 됩니다. 반응은 느려집니다.
  • 입력 필터: 신호 대역보다 조금 높은 차단 주파수의 RC 필터.
  • 기준 전압: 전원 3.3 V를 그대로 기준으로 쓰면 전원 흔들림이 그대로 오차가 됩니다. 정밀 측정에는 별도 기준 전압을 씁니다.
  • 아날로그 그라운드: 큰 전류가 흐르는 길과 ADC 신호의 길을 분리합니다.

현업에서 자주 터지는 문제

  • 전원 켠 뒤 보정(캘리브레이션)을 하지 않아 오프셋이 남음
  • 입력이 Vref를 넘어 값이 4095에 붙어 있음(분배비 확인)
  • 내부 온도 센서나 기준 전압 채널은 긴 샘플링 시간이 필요한데 기본값으로 읽음
3D 실험실에서 직접 돌려 보기값을 바꾸며 이 노트의 원리를 확인합니다→영상으로 이어 보기회로와 하드웨어 시리즈 8편전자제품 속 회로 소자는 어떻게 동작할까? · 저항 · 커패시터 · 인덕터 완벽 정리PROJECT COURSE레지스터 설정을 실제 보드에서 해 보고 싶다면밸런싱 로봇 하나를 요구사항, 회로와 PCB, 펌웨어, 앱까지 실무 순서대로 만드는 강의입니다. 10파트 165강.강의 살펴보기 →FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →