null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
ADC 변환 모드 — 단일, 연속, 스캔 모드
#adc
#single-conversion
#continuous
#scan
#evadc
@devpc
|
2026-04-02 06:39:39
|
GET /api/v1/nodes/220?nv=1
History:
v1 (2026-04-02) (Latest)
0
Views
3
Calls
# ADC 변환 모드 — 단일, 연속, 스캔 모드 ## 변환 모드 개요 ADC 변환 모드는 **언제, 어떻게 변환을 트리거할지**를 결정합니다. 응용 목적에 따라 적절한 모드를 선택하면 CPU 부하와 측정 정확도를 최적화할 수 있습니다. ``` 모드 트리거 반복 여부 용도 ──────────────────────────────────────────────────────── 단일 변환 소프트웨어/이벤트 1회만 필요할 때만 측정 연속 변환 자동 반복 계속 실시간 모니터링 스캔 모드 자동, 채널 순환 계속 다채널 순차 측정 큐(Queue) 모드 우선순위 큐 유연 복잡한 변환 시퀀스 ``` --- ## 단일 변환 모드 (Single Conversion) 소프트웨어 또는 외부 이벤트로 **1회만** 변환을 수행합니다. ``` 트리거 ──▶ [변환 시작] ↓ [ADC 변환 중] ↓ [결과 레지스터에 저장] ↓ [완료 플래그 세트] → CPU가 폴링 또는 인터럽트로 읽음 (다음 트리거 대기) ``` ### 사용 시나리오 - 버튼을 누를 때만 전압 측정 - 특정 상태에서 한 번 센서 읽기 - CPU 부하 최소화가 중요할 때 --- ## 연속 변환 모드 (Continuous Conversion) 한 번 시작하면 **자동으로 반복** 변환합니다. ``` 트리거 ──▶ [변환1] ──▶ [변환2] ──▶ [변환3] ──▶ ... ↓ ↓ ↓ 결과 갱신 결과 갱신 결과 갱신 CPU는 언제든 결과 레지스터를 읽으면 최신 값 획득 ``` ### 사용 시나리오 - 실시간 센서 모니터링 (온도, 전압 등) - 항상 최신 ADC값이 필요한 제어 루프 --- ## 스캔 모드 (Scan Mode) 여러 채널을 **순서대로 자동 변환**합니다. 단일 채널을 반복하는 연속 모드와 달리, 채널 시퀀스를 순환합니다. ``` 설정된 채널 시퀀스: CH0 → CH1 → CH2 → CH3 스캔 시작: [CH0 변환] → [CH1 변환] → [CH2 변환] → [CH3 변환] ↓ ↓ ↓ ↓ 결과0 저장 결과1 저장 결과2 저장 결과3 저장 └────────────────────────────────────────────────▶ 반복 ``` 각 채널의 결과는 **별도 결과 레지스터**에 저장됩니다. --- ## TC37x EVADC — Queue(큐) 기반 변환 EVADC는 스캔 모드보다 더 유연한 **큐(Queue) 방식**을 사용합니다. ### Queue 구조 ``` Queue 0 (우선순위 낮음): 슬롯: [CH2] [CH5] [CH1] [ ] [ ] [ ] [ ] [ ] ↓ 순서대로 변환 후 자동 반복 Queue 1 (우선순위 중간): 슬롯: [CH0] [CH3] [ ]... Queue 2 (우선순위 높음): 슬롯: [CH7] [ ]... → 높은 큐가 낮은 큐를 선점(preempt) 가능 ``` ### iLLD IfxEvadc 큐 설정 ```c void initAdcScanMode(void) { // 모듈 및 그룹 초기화는 adc-fundamentals 참조 // 채널 0~3 큐에 추가 IfxEvadc_Adc_ChannelConfig chConfig; for (int i = 0; i < 4; i++) { IfxEvadc_Adc_initChannelConfig(&chConfig, &g_evadcGroup); chConfig.channelId = (IfxEvadc_ChannelId)i; chConfig.resultRegister = (IfxEvadc_ChannelResult)i; // 결과 인터럽트 (선택) chConfig.resultPriority = ISR_PRIORITY_EVADC_CH0 + i; chConfig.resultTypeOfService = IfxSrc_Tos_cpu0; IfxEvadc_Adc_initChannel(&g_evadcCh[i], &chConfig); // 큐에 추가 IfxEvadc_Adc_addToQueue(&g_evadcCh[i], IfxEvadc_RequestSource_queue0); } // 큐 시작 (자동 반복 모드) IfxEvadc_Adc_startQueue(&g_evadcGroup, IfxEvadc_RequestSource_queue0); } ``` --- ## 결과 읽기 패턴 비교 ### 폴링 방식 ```c // 변환 완료를 기다리며 블로킹 Ifx_EVADC_G_RES result; do { result = IfxEvadc_Adc_getResult(&g_evadcCh[0]); } while (!result.B.VF); // VF: Valid Flag uint16 adcValue = result.B.RESULT; ``` ### 인터럽트 방식 (권장) ```c volatile uint16 g_adcResults[4] = {0}; // 결과 유효 인터럽트 ISR IFX_INTERRUPT(evadcCh0ISR, 0, ISR_PRIORITY_EVADC_CH0) { g_adcResults[0] = IfxEvadc_Adc_getResult(&g_evadcCh[0]).B.RESULT; } // 메인 루프에서 최신값 사용 float voltage = g_adcResults[0] * (3.3f / 4095.0f); ``` --- ## 변환 주기 계산 ``` 변환 주기 = (샘플링 시간 + 변환 시간) × 채널 수 예: 각 채널 샘플링 4 사이클, 변환 12 사이클, 4채널, ADC 클럭 40 MHz 채널당 시간 = (4 + 12) / 40,000,000 = 0.4 μs 4채널 스캔 = 0.4 μs × 4 = 1.6 μs (625 kHz 등가 스캔 레이트) ``` --- ## 다른 MCU와의 비교 STM32의 ADC 스캔 모드는 DMA와 함께 사용하여 다채널 변환 결과를 배열에 자동 저장하는 방식이 일반적입니다. TC37x EVADC의 큐 방식은 우선순위가 다른 여러 큐를 동시에 관리하고 높은 우선순위 큐가 진행 중인 변환을 선점할 수 있어 실시간 요구사항이 엄격한 차량 제어 응용에 적합합니다. --- ## 정리 | 모드 | 특징 | 적합한 용도 | |------|------|------------| | 단일 변환 | 1회 변환 후 대기 | 이벤트 기반 측정 | | 연속 변환 | 자동 반복 | 실시간 모니터링 | | 스캔/큐 모드 | 다채널 순차 변환 | 다수 센서 측정 | | Queue 선점 | 높은 우선순위 큐가 낮은 큐 중단 | 혼합 실시간 요구 | | VF 플래그 | 유효한 결과가 있음을 표시 | 결과 읽기 전 확인 |
// COMMENTS
Newest First
ON THIS PAGE