차량용 전자 제어기(ECU) 회로를 설계하고 펌웨어를 작성할 때 가장 빈번하게 마주치는 아날로그 인터페이스가 바로 ADC(Analog-to-Digital Converter)입니다. 모터 상전류, 배터리 전압, 가속 페달 위치, 냉각수 온도에 이르기까지 거의 모든 센서 신호가 ADC를 거쳐 디지털 제어 알고리즘으로 들어옵니다.

하지만 실제 프로젝트에서 ADC 채널을 단순히 핀 번호 순서나 회로 배선 편의성만 보고 할당하면 다음과 같은 치명적인 문제들이 발생합니다.

  • 모터 3상 전류 측정값 사이에 미세한 시간차가 생겨 고속 회전 시 심각한 토크 맥동(Ripple)과 진동이 발생함.
  • 온도 센서처럼 저항이 큰 신호를 읽은 직후 다른 센서를 읽었을 때 전하가 덜 빠져서 전압이 튀는 고스팅(Ghosting) 현상이 일어남.
  • 100ms 주기의 느린 신호 때문에 1ms 고속 제어 루프의 ADC 변환 시간이 지연되어 데드라인을 놓침.
  • 수많은 센서 변환 완료 인터럽트로 인해 CPU 점유율이 폭증함.

이 글에서는 마이크로컨트롤러(MCU) 내부의 하드웨어 특성부터 시작하여 채널 할당 기준, 물리 코어 분산 원리, 그리고 AUTOSAR MCAL(Adc Driver)의 AdcGroup 구성 방법까지 체계적으로 정리합니다.


1. SAR ADC의 기본 동작과 핵심 파라미터

차량용 MCU(인피니언 AURIX, NXP S32K, ST Stellar 등)에 내장된 ADC는 대부분 연속 근사 레지스터(SAR, Successive Approximation Register) 방식을 사용합니다.

[ 아날로그 핀 ] ──> [ MUX (채널 선택) ] ──> [ 샘플 & 홀드 (S&H) 스위치 ]
                                                      │
                                                      ▼
                                            [ 내부 샘플링 커패시터 C_sample ]
                                                      │
                                                      ▼
                                            [ 비교기 & SAR DAC 변환 코어 ]

SAR ADC의 1회 변환 시간(Conversion Time)은 두 단계로 나뉩니다.

  1. 샘플링 시간 (Sampling Phase, t_sample): 스위치가 닫혀 센서로부터 들어온 전압으로 내부 커패시터(C_sample)를 완전히 충전하는 시간입니다.
  2. 변환 시간 (Conversion Phase, t_conv): 스위치가 열리고 충전된 전하를 바탕으로 이진 탐색을 통해 12비트(또는 10비트) 디지털 값으로 양자화하는 시간입니다.

전체 변환 시간(t_total)은 t_sample + t_conv가 되며, 회로 임피던스가 높을수록 커패시터를 채우는 데 필요한 t_sample을 길게 확보해야 정확한 측정이 가능합니다.


2. ADC 그루핑(Grouping)이란 무엇인가: 기초 개념

일반적인 아두이노나 소형 MCU 환경을 처음 접한 개발자는 보통 다음과 같이 생각하기 쉽습니다.

"MCU에 ADC 핀이 16개 있으니, 센서 값을 읽고 싶을 때마다 read_adc(CH3)처럼 채널 번호를 넘겨서 바로 값을 읽어오면 되지 않을까?"

하지만 수십 개의 고속 센서가 밀리초(ms) 단위로 상호작용하는 차량용 제어기에서는 이러한 채널 개별 온디맨드(On-Demand) 방식이 불가능합니다.

2.1 왜 채널 단위가 아니라 그룹 단위로 다루는가

  1. CPU 오버헤드와 블로킹 방지: 제어기에 센서가 30개 연결되어 있을 때, CPU가 채널을 하나씩 선택하고 변환이 끝날 때까지 기다리는(Busy-waiting) 방식을 쓰면 CPU가 다른 제어 알고리즘을 수행할 시간이 전혀 남지 않습니다.
  2. 시간 동기화(Simultaneous Timing) 보장: 가속 페달 센서 1과 2, 또는 모터 상전류처럼 밀접하게 연관된 센서들은 정확히 동일한 시점이나 약속된 순서대로 측정되어야 합니다. 채널 단위로 임의의 시점에 읽으면 센서 간 타이밍이 어긋납니다.
  3. 하드웨어 스캔 엔진(Scan Engine) 활용: 차량용 MCU 내부의 ADC 하드웨어는 여러 채널을 등록해 두고 단 한 번의 트리거 신호로 연달아 변환(Auto-Scan)하는 하드웨어 시퀀서를 내장하고 있습니다.

이 때문에 AUTOSAR를 비롯한 모든 차량용 시스템에서는 채널 개별 제어를 하지 않고, 함께 묶여 동작해야 하는 채널들의 집합인 'ADC 그룹(AdcGroup)'을 변환의 기본 단위로 사용합니다.

2.2 ADC 그룹(AdcGroup)의 4가지 핵심 구성 요소

하나의 ADC 그룹은 다음 4가지를 공유하는 논리적 채널 묶음입니다.

[ 단일 트리거 이벤트 (HW 타이머 펄스 또는 1회 SW API 호출) ]
                            │
                            ▼
                ┌───────────────────────┐
                │ AdcGroup (채널 리스트)  │
                │ 1. CH0 (모터 U상 전류) │
                │ 2. CH1 (모터 V상 전류) │
                │ 3. CH2 (DC-Link 전압) │
                └───────────┬───────────┘
                            │  (하드웨어 연속 스캔 변환)
                            ▼
          [ 결과 버퍼 배열: buffer[0], buffer[1], buffer[2] ]
                            │
                            ▼
          [ 그룹 변환 완료 인터럽트 (1회만 발생) ]
  1. 채널 리스트와 변환 순서 (Scan Sequence): 해당 그룹에 어떤 물리 채널들이 포함되며, 1번 채널부터 N번 채널까지 어떤 순서로 변환할지 정적으로 결정합니다.
  2. 공통 트리거 소스 (Common Trigger): 그룹 내 모든 채널은 단 하나의 공통 트리거(타이머 하드웨어 신호 또는 1회 소프트웨어 함수 호출)에 의해 일괄 기동됩니다.
  3. 결과 버퍼 배열 (Result Buffer): 변환된 결과들은 낱개 변수가 아니라, 메모리 상의 연속된 배열(ResultBuffer[N])에 순서대로 자동 저장됩니다.
  4. 그룹 완료 통지 (Group Notification): 채널 하나 끝날 때마다 인터럽트를 걸면 CPU가 마비되므로, 그룹 내의 마지막 채널까지 변환이 완전히 끝났을 때 딱 한 번의 완료 인터럽트(또는 콜백 함수)가 발생합니다.

2.3 AUTOSAR MCAL에서의 기본 원칙

AUTOSAR 사양서(SWS_Adc)에는 개별 채널을 시작하는 API가 아예 존재하지 않습니다. 오직 Adc_StartGroupConversion(GroupId)처럼 그룹 ID를 인자로 넘기는 API만 제공됩니다.

즉, 단 하나의 센서만 읽고 싶더라도 최소 1개의 채널을 포함하는 AdcGroup을 먼저 생성해야만 ADC 변환을 수행할 수 있습니다.


3. 차량용 ECU ADC 할당 및 그루핑 전체 아키텍처

아래 도식은 센서 특성에 따라 MCU 내부 물리 ADC 코어에 채널을 분산하고, 이를 다시 AUTOSAR MCAL의 논리 그룹(AdcGroup)으로 묶는 전체 설계 흐름을 보여줍니다.

차량용 제어기 ADC 채널 할당 및 그루핑 아키텍처


4. 기준 1: 샘플링 주기 및 트리거 소스 분리

ADC 그루핑의 가장 기본이자 절대적인 원칙은 주기가 다른 신호를 같은 그룹에 섞지 않는 것입니다.

3.1 왜 주기가 다른 채널을 한 그룹으로 묶으면 안 되는가

하나의 그룹(Group) 안에 속한 채널들은 트리거가 발생했을 때 순차적으로 연달아 변환(Scan Conversion)됩니다.

만약 100ms 주기로 읽어도 충분한 냉각수 온도 센서를 1ms 주기로 돌아야 하는 스로틀 위치 센서와 같은 그룹에 묶으면, 1ms마다 불필요하게 온도 센서까지 변환하느라 전체 변환 시간이 낭비됩니다. 반대로 100ms 그룹에 스로틀 센서를 넣으면 제어 응답이 100배 느려져 제어기가 급가속을 감지하지 못합니다.

3.2 트리거 방식별 3대 분류

  1. 하드웨어 타이머 동기 트리거 (PWM Sync HW Trigger):

    • PWM 스위칭 노이즈를 피하기 위해 특정 타이머 시점(PWM Center 또는 Valley)에 0.1마이크로초의 오차도 없이 시작해야 하는 초고속 채널.
    • 대표 신호: 모터 3상 상전류(Phase Current U/V/W), 인버터 DC-Link 전압, 인젝터 구동 전류.
    • 변환 빈도: 10kHz ~ 20kHz (PWM 주기와 1:1 동기화).
  2. 고속 소프트웨어 주기 트리거 (1ms ~ 10ms SW Trigger):

    • 차량의 주행 성능과 직결되는 핵심 제어 루프.
    • 대표 신호: 가속 페달 센서 1/2(APS), 스로틀 밸브 위치(TPS), 브레이크 마스터 실린더 유압.
    • 변환 빈도: 1ms 또는 5ms, 10ms 주기 OS Task에서 소프트웨어로 기동.
  3. 저속 모니터링 트리거 (50ms ~ 100ms SW Trigger):

    • 물리적 변화 속도가 느린 시스템 상태 감시 채널.
    • 대표 신호: 엔진 오일 온도, 배터리 셀 온도(NTC), 보조 배터리 전원 전압(KL30, KL15 전압).
    • 변환 빈도: 50ms 또는 100ms 주기 Task에서 저속 기동.

5. 기준 2: 동시 샘플링(Simultaneous Sampling)과 물리 코어 분산

모터 제어(FOC, 자속 기준 제어)와 기능 안전(Functional Safety) 회로에서는 동시 샘플링 요구조건이 채널 할당을 결정합니다.

4.1 모터 3상 전류 위상차 문제

모터 고속 회전 시 3상 교류 전류는 사인파 형태로 급격히 변합니다.

만약 MCU의 단일 ADC 코어에서 U상, V상, W상을 차례대로 변환하면, U상을 측정한 시점과 W상을 측정한 시점 사이에 수 마이크로초(µs)의 시간차(Phase Shift)가 발생합니다. 이 시간차로 인해 제어 알고리즘이 계산하는 전류 벡터가 왜곡되어 모터 토크 리플(진동)과 제어 발진이 유발됩니다.

4.2 물리 ADC 코어 분산 할당 원리

최신 전장용 MCU는 내부에 2개에서 최대 8개 이상의 독립된 물리 ADC 컨버터 코어(ADC Core 0, 1, 2...)를 탑재하고 있습니다.

  • 할당 규칙: 동시에 측정되어야 하는 3상 전류는 반드시 서로 다른 물리 ADC 코어에 하나씩 찢어서 배치해야 합니다.
    • Phase U 전류: ADC Core 0의 채널에 할당
    • Phase V 전류: ADC Core 1의 채널에 할당
    • Phase W 전류: ADC Core 2의 채널에 할당
  • 동작: 하드웨어 트리거 신호가 들어오는 순간, 3개의 독립된 ADC 코어가 각각의 S&H 스위치를 동시에 닫아 정확히 동일한 시점의 전하를 캡처합니다.

이 규칙은 ISO 26262 ASIL-D 요구조건인 가속 페달 센서(APS 1, APS 2)의 이중화 크로스 체크에도 동일하게 적용됩니다. 두 센서를 다른 물리 코어에 분산해야 공통 원인 고장(Common Cause Failure)을 방지할 수 있습니다.


6. 기준 3: 신호 임피던스와 샘플링 시간(Sample Time) 분리

아날로그 회로의 출력 임피던스(센서 측의 등가 저항)는 ADC 측정 정밀도에 결정적인 영향을 줍니다.

[ 센서 출력 저항 R_source ] ───┬─── [ ADC 스위치 저항 R_on ] ─── [ C_sample ]
                                │
                        [ 기생 커패시터 C_pin ]

5.1 고임피던스 신호의 한계와 고스팅(Ghosting) 현상

  1. 저임피던스 신호 (1kΩ 이하):

    • OP-Amp 버퍼 출력을 거친 전압 신호나 션트 저항 증폭기 출력.
    • RC 시정수가 작아서 수십~수백 나노초(ns)의 짧은 샘플링 시간(t_sample)으로도 C_sample을 99.9% 이상 완충할 수 있습니다.
  2. 고임피던스 신호 (10kΩ ~ 100kΩ 이상):

    • NTC 서미스터 온도 센서 회로(분압 저항 10kΩ 사용), 12V 배터리 전압 분압 회로(100kΩ 저항 사용).
    • RC 시정수가 커서 C_sample을 충전하는 데 최소 수 마이크로초(µs) 이상의 긴 샘플링 시간이 필요합니다.
  3. 채널 간 전하 잔류(Ghosting / Cross-Talk): 빠른 샘플링 시간으로 설정된 고속 그룹 안에 고임피던스 신호가 섞여 있으면, 직전에 측정했던 채널의 전하가 C_sample에 일부 남아 다음 채널의 측정값을 오염시키는 고스팅 현상이 일어납니다.

따라서 임피던스가 높은 센서들은 반드시 별도의 저속 모니터링 그룹으로 격리하고, 해당 그룹의 샘플링 클럭 사이클(Sample Clock Cycles)을 충분히 길게 설정해야 합니다.


7. 기준 4: CPU 인터럽트 부하와 DMA 스트리밍 버퍼링

센서 신호의 노이즈를 잡기 위해 필터링을 수행할 때 변환 결과를 CPU로 넘기는 방식도 그루핑의 기준이 됩니다.

구분 항목 소프트웨어 인터럽트 방식 (One-Shot) DMA 스트리밍 방식 (Circular Stream)
동작 방식 그룹 변환 완료 시마다 CPU 인터럽트 발생 변환 결과가 DMA를 통해 RAM 버퍼에 자동 기록
CPU 개입도 매 변환마다 인터럽트 컨텍스트 스위칭 발생 버퍼가 가득 찼을 때만 1회 인터럽트 또는 폴링
CPU 부하 고속 주기 변환 시 인터럽트 폭주(Storm) 위험 CPU 개입 없이 백그라운드에서 고속 누적
추천 용도 50ms, 100ms 단위의 저속 진단/상태 확인 1ms 제어 센서의 16회 오버샘플링 및 이동 평균 필터

노이즈가 심한 차량 환경에서는 센서 값을 1회만 읽지 않고 짧은 간격으로 8회~16회 연속 변환하여 평균을 내는 오버샘플링(Oversampling)을 자주 씁니다. 이런 채널들은 CPU 인터럽트를 끄고, DMA 기반의 연속 스트리밍 그룹으로 묶어 RAM 버퍼로 직결해야 CPU 사용률을 낮출 수 있습니다.


8. AUTOSAR MCAL AdcGroup 설정 체크리스트

AUTOSAR MCAL 설정 도구(EB tresos, DaVinci Configurator 등)에서 AdcGroup 컨테이너를 구성할 때 위 기준들을 실제 파라미터로 매핑하는 방법입니다.

7.1 AdcGroupConversionMode

  • ADC_CONV_MODE_ONESHOT: 트리거가 들어왔을 때 그룹 내 채널들을 딱 한 번 변환하고 멈춥니다. 주기적 OS Task에서 직접 기동할 때 사용합니다.
  • ADC_CONV_MODE_CONTINUOUS: 한 번 시작하면 정지 명령이 있을 때까지 쉬지 않고 계속 변환을 반복합니다. DMA 링 버퍼와 결합하여 최신 센서 값을 상시 갱신할 때 사용합니다.

7.2 AdcGroupTriggSrc

  • ADC_TRIGG_SRC_SW: 소프트웨어 API(Adc_StartGroupConversion) 호출에 의해 시작됩니다.
  • ADC_TRIGG_SRC_HW: 타이머 캡처/컴페어 유닛(GTM, eTimer) 등의 외부 핀/이벤트로 시작됩니다.

7.3 AdcGroupPriority 및 Preemption (우선순위와 선점)

MCU가 100ms 저속 그룹(온도, 전압 등 10개 채널)을 한참 변환하고 있는 도중에, 20kHz 모터 상전류 HW 트리거가 갑자기 발생할 수 있습니다.

  • ADC_ABOLISH_AT_PREEMPTION: 진행 중이던 저속 그룹의 변환을 즉시 강제 폐기(Abolish)하고, 최우선순위인 모터 전류 변환을 즉각 시작합니다. 저속 그룹의 데이터는 버려지며 다음 주기에 다시 수행됩니다.
  • ADC_RESTART_AT_PREEMPTION: 고우선순위 그룹 변환이 끝나면, 중단되었던 저속 그룹의 첫 채널부터 다시 변환을 재개합니다.

모터 제어, 엔진 제어처럼 데드라인이 극도로 엄격한 고속 채널은 최상위 우선순위를 부여하고 선점(Preemption)을 허용해야 안전성을 보장할 수 있습니다.


9. 실무 채널 할당 매트릭스 예제

전형적인 차량용 모터 제어기(Inverter ECU)의 ADC 채널 할당 표입니다.

그룹 명칭 소속 센서 신호 할당 물리 코어 트리거 소스 변환 모드 샘플링 시간
AdcGroup_MotorCurrent Phase U, V, W 전류, DC-Link 전압 ADC Core 0, 1, 2 분산 PWM Center HW 트리거 One-Shot (20kHz) 초단시간 (100ns)
AdcGroup_FastSensors 가속페달 1/2, 스로틀 위치, 브레이크 압력 ADC Core 0, 1 분산 (이중화) 1ms Task SW 트리거 One-Shot (1ms) 단시간 (200ns)
AdcGroup_SlowMonitoring 모터 권선 온도, 인버터 온도, KL30 전압 ADC Core 2 단독 100ms Task SW 트리거 One-Shot (100ms) 장시간 (2µs 이상)

요약

차량용 ADC 채널 할당과 그루핑은 단순한 핀 맵 작업이 아닌 시스템 아키텍처 설계입니다.

  1. 주기가 다른 신호는 그룹을 완벽히 분리하여 불필요한 스캔 변환 지연을 차단합니다.
  2. 위상 동기화가 필요한 신호(모터 3상 전류)는 복수의 물리 ADC 코어로 분산하여 동시 샘플링합니다.
  3. 고임피던스 센서(NTC 등)는 긴 샘플링 시간을 갖는 저속 그룹으로 격리하여 채널 간 고스팅을 방지합니다.
  4. 고속 오버샘플링 신호는 DMA 스트리밍 버퍼를 연동하여 CPU 인터럽트 폭주를 방지합니다.