본문 바로가기
MCU/AVR

[AVR128DB48] ADC 차동모드 설정 방법 및 예제 코드

by linuxgo 2025. 8. 20.
반응형

1. AVR128DB48 ADC 모듈 개요

Microchip의 AVR128DB48 마이크로컨트롤러는 12비트 ADC(Analog-to-Digital Converter)를 내장하고 있으며, 차동모드(Differential Mode)를 지원하여 두 입력 간의 전압 차이를 고정밀으로 측정할 수 있습니다. 차동모드에서는 1x, 4x, 16x 게인 설정을 지원하여 작은 신호를 증폭하거나 고정밀 측정이 필요한 애플리케이션(예: 센서 인터페이스, 오디오 처리)에 적합합니다. 이 문서는 ADC 차동모드와 게인 설정 방법을 설명하고, Bitfield 구조를 활용한 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.

주요 사양

  • ADC 해상도: 12비트 (최대 4096 레벨)
  • 차동 입력 쌍: AINP (Positive Input)와 AINN (Negative Input)
    •   지원 핀: PORTA (PA0PA7), PORTB (PB0PB3)
  • 샘플링 속도: 최대 375 ksps (클럭 의존)
  • 레퍼런스 전압:
    •   내부: 1.024V, 2.048V, 2.5V, 4.096V, VDD
    •   외부: VREF pin
  • 게인: 1x, 4x, 16x (차동모드에서 설정 가능)
  • 주요 레지스터:
    •   ADCn.CTRLA: ADC 활성화 및 모드 설정
    •   ADCn.CTRLB: 샘플 수 설정
    •   ADCn.CTRLC: 레퍼런스 및 클럭 설정
    •   ADCn.CTRLD: 게인 설정
    •   ADCn.MUXPOS/MUXNEG: 입력 핀 선택
    •   ADCn.RES: 변환 결과
    •   ADCn.INTFLAGS: 인터럽트 플래그
  • 전력 관리: 저전력 모드 지원
  • 전압 레벨: 1.8V~5.5V 동작 지원

2. ADC 차동모드 및 게인 설정 Bitfield 상세

AVR128DB48의 ADC 레지스터는 Bitfield 구조로 정의되어 있으며, <avr/io.h> 헤더 파일을 통해 접근합니다. 게인 설정은 ADCn.CTRLD 레지스터를 통해 제어됩니다. 주요 레지스터는 다음과 같습니다:

2.1 ADCn.CTRLA (ADC 제어 레지스터 A)

  •   bit.ENABLE: ADC 활성화 (1: 활성화)
  •   bit.DIFF: 차동모드 활성화 (1: 활성화)
  •   bit.RESSEL: 해상도 선택 (0: 12비트, 1: 10비트)

2.2 ADCn.CTRLB (ADC 제어 레지스터 B)

  •   bit.ACCUM: 누적 샘플링 설정
  •   bit.SAMPNUM: 샘플 누적 수 (0: 1샘플, 1: 2샘플, ..., 7: 128샘플)

2.3 ADCn.CTRLC (ADC 제어 레지스터 C)

  •   bit.PRESC: 프리스케일러 설정 (예: CLK_PER/2 ~ CLK_PER/256)
  •   bit.REFSEL: 레퍼런스 전압 선택
    •   0: 내부 1.024V
    •   1: 내부 2.048V
    •   2: VDD
    •   3: 외부 VREF
    •   4: 내부 2.5V
    •   5: 내부 4.096V
  •   bit.SAMPCAP: 샘플링 커패시터 감소 (1: 저전력 모드)

2.4 ADCn.CTRLD (ADC 제어 레지스터 D)

  •   bit.PGAEN: 프로그래머블 게인 증폭기 활성화 (1: 활성화)
  •   bit.PGAGAIN: 게인 설정
    •   0b00: 1x (기본값)
    •   0b01: 4x
    •   0b10: 16x
    •   0b11: 예약됨 (사용 불가)

2.5 ADCn.MUXPOS/MUXNEG (입력 선택 레지스터)

  • MUXPOS: 양극 입력 선택 (예: AIN0, AIN1, ...)
  • MUXNEG: 음극 입력 선택 (예: AIN0, AIN1, ...)

2.6 ADCn.RES (결과 레지스터)

  • 변환 결과 저장 (12비트 또는 10비트)

3. ADC 차동모드 및 게인 설정 절차

  1. 시스템 초기화:
    •   set_system_clock()로 시스템 클럭 설정 (24MHz, XOSC32K 오토튜닝)
    •   인터럽트 비활성화 (cli())
  2. ADC 클럭 활성화:
    •   ADC 클럭은 시스템 클럭(CLK_PER)에서 분주
  3. ADC 초기화:
    •   ADCn.CTRLA로 ADC 활성화 및 차동모드 설정
    •   ADCn.CTRLC로 레퍼런스 전압 및 프리스케일러 설정
    •   ADCn.CTRLD로 게인 설정
  4. 입력 설정:
    •   ADCn.MUXPOS/MUXNEG로 양극/음극 입력 핀 선택
  5. 샘플링 설정:
    • ADCn.CTRLB로 샘플 수 및 누적 설정
  6. 인터럽트 설정 (필요 시):
    •   ADCn.INTCTRL로 인터럽트 활성화
  7. ADC 시작:
    •   ADCn.COMMAND로 변환 시작
  8. 결과 읽기:
    •   ADCn.RES에서 변환 결과 읽기

4. ADC 차동모드 및 게인 설정 고려사항

  • 레퍼런스 전압: 입력 전압 범위는 레퍼런스 전압을 초과하지 않도록 주의
    •   게인 적용 후: 입력 전압 × 게인 ≤ 레퍼런스 전압
  • 입력 핀: 차동 입력 쌍은 동일 포트 내에서 선택 권장
  • 노이즈: 외부 신호 노이즈 감소를 위해 샘플링 수 증가 또는 샘플링 커패시터 감소 설정
  • 게인 선택:
    •   1x: 일반적인 차동 측정
    •   4x: 작은 신호 증폭 (예: ±1V 범위)
    •   16x: 매우 작은 신호 증폭 (예: ±0.25V 범위)
  • 인터럽트: 다중 변환 시 인터럽트 활용 권장
  • 저전력: SAMPCAP 설정으로 전력 소모 감소
  • 기능 안전: IEC 60730, IEC 61508, ISO 26262 표준 준수를 위해 Clock Failure Detection 및 Voltage Level Monitor 활용 가능

5. 실용적인 ADC 차동모드  설정 예제 코드 (Bitfield 구조)

아래는 AVR128DB48 ADC 차동모드를 Bitfield 구조로 설정하고, 게인(1x, 4x, 16x)을 동적으로 변경하는 예제 코드입니다. Atmel Studio 또는 MPLAB X IDE와 AVR-GCC 환경에서 실행 가능합니다. 코드에는 Microchip AVR128DB48 데이터시트와 웹 리소스를 기반으로 한 정확한 설정이 포함되어 있습니다.

5.1 예제: ADC 차동모드 및 게인 설정 (PA2와 PA3 간 전압 차이 측정)

// File: adc_differential_with_gain.c
// Description: AVR128DB48 ADC 차동모드 및 게인 설정 예제 (PA2와 PA3 전압 차이 측정)
// Compiler: AVR-GCC
// Target: AVR128DB48

#include <avr/io.h>        // AVR 입출력 관련 헤더 파일
#include <util/delay.h>    // 지연 함수 관련 헤더 파일

#define F_CPU 24000000UL  // 시스템 클록 주파수를 24 MHz로 정의 (지연 함수 정확도를 위해 필요)

// 게인 설정 열거형
typedef enum {
    GAIN_1X  = 0b00, // 게인 1x
    GAIN_4X  = 0b01, // 게인 4x
    GAIN_16X = 0b10  // 게인 16x
} adc_gain_t;

void set_system_clock(void) {
    // 32.768 kHz 외부 크리스털 오실레이터(XOSC32K) 활성화
    _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm); 
    // CLKCTRL.XOSC32KCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_ENABLE_bm: XOSC32K 활성화
    // CLKCTRL_RUNSTDBY_bm: 스탠바이 모드에서도 XOSC32K 동작 유지
    
    // XOSC32K가 안정될 때까지 대기
    while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
        ; // CLKCTRL.MCLKSTATUS의 XOSC32KS_bm 비트가 1이 될 때까지 대기 (안정화 확인)
    }
    
    // 내부 OSCHF를 24 MHz로 설정하고 XOSC32K를 참조하여 오토튜닝 활성화
    _PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
    // CLKCTRL.OSCHFCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_FRQSEL_24M_gc: OSCHF를 24 MHz로 설정
    // CLKCTRL_AUTOTUNE_bm: XOSC32K를 참조한 오토튜닝 활성화
    
    // OSCHF를 시스템 클록 소스로 설정
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
    // CLKCTRL.MCLKCTRLA 레지스터에 쓰기 보호를 해제하며 설정
    // CLKCTRL_CLKSEL_OSCHF_gc: 시스템 클록 소스를 OSCHF로 선택
    
    // 클록 프리스케일러 비활성화 (24 MHz 그대로 사용)
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
    // CLKCTRL.MCLKCTRLB 레지스터를 0으로 설정하여 프리스케일러 비활성화
}

void adc_init(adc_gain_t gain) {
    // ADC0 초기화: 차동모드, 12비트, 내부 2.5V 레퍼런스, 지정된 게인
    ADC0.CTRLA = ADC_ENABLE_bm | ADC_DIFF_bm; // ADC 활성화, 차동모드 설정
    ADC0.CTRLB = ADC_SAMPNUM_ACC4_gc;        // 4 샘플 누적 설정 (노이즈 감소)
    ADC0.CTRLC = ADC_REFSEL_2500MV_gc | ADC_PRESC_DIV16_gc; // 2.5V 레퍼런스, CLK_PER/16 프리스케일러
    ADC0.CTRLD = ADC_PGAEN_bm | (gain << ADC_PGAGAIN0_bp); // 게인 활성화 및 설정
    ADC0.MUXPOS = ADC_MUXPOS_AIN2_gc;        // 양극 입력: PA2 (AIN2)
    ADC0.MUXNEG = ADC_MUXNEG_AIN3_gc;        // 음극 입력: PA3 (AIN3)
}

uint16_t adc_read(void) {
    ADC0.COMMAND = ADC_STCONV_bm; // ADC 변환 시작
    while (!(ADC0.INTFLAGS & ADC_RESRDY_bm)); // 변환 완료 대기
    uint16_t result = ADC0.RES; // 변환 결과 읽기
    ADC0.INTFLAGS = ADC_RESRDY_bm; // 인터럽트 플래그 클리어
    return result;
}

void gpio_init(void) {
    // PB3(LED0)를 출력으로 설정
    PORTB.DIRSET = PIN3_bm; // PB3 핀을 출력으로 설정 (Curiosity Nano의 LED0)
}

int main(void) {
    set_system_clock(); // 시스템 클럭 설정 함수 호출
    gpio_init();        // GPIO 초기화 함수 호출

    // 게인 배열 정의
    adc_gain_t gains[] = {GAIN_1X, GAIN_4X, GAIN_16X};
    uint8_t gain_index = 0;
    uint8_t max_gains = 3;

    while (1) {
        // 현재 게인으로 ADC 초기화
        adc_init(gains[gain_index]);
        
        // ADC 값 읽기
        uint16_t adc_value = adc_read();
        
        // 전압 차이 > 0 (12비트 기준 중간값)일 때 LED 제어
        if (adc_value > 2048) {
            PORTB.OUTSET = PIN3_bm; // PB3 High (LED 켬)
        } else {
            PORTB.OUTCLR = PIN3_bm; // PB3 Low (LED 끔)
        }
        
        // 1초 대기 후 다음 게인으로 전환
        _delay_ms(1000);
        gain_index = (gain_index + 1) % max_gains; // 다음 게인 인덱스
    }

    return 0; // 프로그램 종료 (실제로는 도달하지 않음)
}

설명:

  • 기능: PA2와 PA3 간의 전압 차이를 측정하고, 게인(1x, 4x, 16x)을 1초마다 순환하며 적용. 결과가 양수(2048 초과)일 때 PB3 LED를 켬.
  • 설정: ADC0 차동모드, 12비트 해상도, 내부 2.5V 레퍼런스, 4 샘플 누적, PA2(양극), PA3(음극), 동적 게인 변경.
  • 출력: 전압 차이 양수 시 LED ON, 음수 또는 0일 때 LED OFF.
  • 게인 동작:
    • 1x: 입력 범위 ±2.5V (레퍼런스 전압 기준)
    • 4x: 입력 범위 ±0.625V
    • 16x: 입력 범위 ±0.15625V
  • 주의: 입력 전압은 레퍼런스 전압 / 게인 범위를 초과하지 않도록 설정해야 함 (예: 2.5V / 16x = ±0.15625V).

6. 사용 방법

6.1 환경 설정

  • AVR-GCC 설치: Atmel Studio 또는 MPLAB X IDE에 AVR-GCC 툴체인 설치
  • 헤더 파일: <avr/io.h>, <util/delay.h> 포함
  • 프로젝트 설정: AVR128DB48 타겟으로 프로젝트 생성
  • 클럭 정의: #define F_CPU 24000000UL로 시스템 클럭 설정

6.2 코드 실행

  • 예제를 adc_differential_with_gain.c 파일로 저장
  • Atmel Studio/MPLAB X IDE에서 빌드 및 플래싱
  • 빌드 시 AVR-Dx_DFP 패키지 (최소 v2.3.272) 필요

6.3 하드웨어 준비

  • ADC 입력: PA2와 PA3에 아날로그 신호 연결 (예: 가변저항, 센서). 입력 전압은 게인에 따라 조정 (예: 16x 게인 시 ±0.15625V 이내).
  • LED 출력: PB3에 LED 및 전류 제한 저항(예: 330Ω) 연결
  • 전원: 1.8V~5.5V 전원 공급 (Curiosity Nano 기본 3.3V 권장)
  • 하드웨어: AVR128DB48 Curiosity Nano 평가 키트(EV35L43A) 권장

6.4 디버깅

  • Atmel Studio/MPLAB X IDE의 디버거 사용
  • ADC0.RES, ADC0.INTFLAGS, ADC0.CTRLD 레지스터 확인
  • 오실로스코프 또는 로직 분석기로 아날로그 입력 신호 및 출력 확인
  • MPLAB Data Visualizer로 ADC 결과 시각화 가능

7. 추가 팁

  • 클럭 설정: set_system_clock()로 XOSC32K 안정화 및 24MHz 설정 확인
  • 노이즈 감소: 입력에 저역통과 필터 회로 추가, 샘플링 수 증가(SAMPNUM)
  • 게인 선택 가이드:
    • 작은 신호(예: ±0.1V): 16x 게인
    • 중간 신호(예: ±0.5V): 4x 게인
    • 큰 신호(예: ±2V): 1x 게인
  • Microchip 리소스: AVR128DB48 데이터시트, Application Note AN3633, TB3209
  • 문제 해결:
    • 출력 없음: ADC0.CTRLA, MUXPOS/MUXNEG, CTRLD 설정 확인
    • 부정확한 결과: 입력 전압이 레퍼런스 전압 / 게인 범위를 초과하는지 확인
    • 노이즈 문제: SAMPNUM 증가 또는 외부 필터 추가
  • 커뮤니티: Microchip Community, AVR Freaks 포럼 참고

8. 결론

이 문서는 AVR128DB48 ADC 차동모드와 게인 설정(1x, 4x, 16x)을 Bitfield 구조로 구현한 예제 코드를 제공하여 고정밀 아날로그 애플리케이션에 적용 가능하도록 구성했습니다. 초보자는 기본 예제를 따라 시작하고, 숙련자는 게인과 인터럽트를 조합하여 고급 시스템을 구현할 수 있습니다.

키워드: AVR128DB48, ADC, 차동모드, 게인 설정, 12비트, 마이크로컨트롤러, Atmel Studio, MPLAB X IDE, 아날로그, 레퍼런스 전압, 샘플링

반응형