본문 바로가기
MCU/AVR

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

by linuxgo 2025. 8. 20.

1. AVR128DB48 ADC 모듈 개요

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

AVR128DB48 ADC block diagram

주요 사양

  • ADC 해상도: 12비트 (최대 4096 레벨)
  • 차동 입력 쌍: AINP (Positive Input)와 AINN (Negative Input)
  • 지원 핀: 최대 18채널 (PORTA, PORTB, PORTC 일부 핀 – 데이터시트 참조)
  • 샘플링 속도: 최대 약 130 ksps (클럭 의존)
  • 레퍼런스 전압:
    • 내부: 1.024V, 2.048V, 2.5V, 4.096V
    • 외부: VREF pin
    • VDD
  • 주요 레지스터:
    • 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.FREERUN: 프리런 모드
  • bit.RESSEL: 해상도 선택 (0: 12비트, 1: 10비트)

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

    •  bit.SAMPNUM: 샘플 누적 수
    • 0: 1샘플
    • 1: 2샘플
    • 2: 4샘플
    • 8: 256샘플

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

  •   bit.PRESC: 프리스케일러 설정 (예: CLK_PER/2 ~ CLK_PER/256)

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

  • bit.INITDLY: 초기 샘플 지연
  • bit.SAMDLY 추가 아날로그 사이클 설정 (샘플링 시간 확장)

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로 프리스케일러 설정

4.입력 설정

  • ADCn.MUXPOS/MUXNEG로 양극/음극 입력 핀 선택

5.샘플링 설정

  • ADCn.CTRLB.SAMPNUM으로 샘플 수 및 누적 설정

6.인터럽트 설정 (필요 시)

  • ADCn.INTCTRL로 인터럽트 활성화

7.ADC 시작

  • ADCn.COMMAND로 변환 시작

결과 읽기

  • ADCn.RES에서 변환 결과 읽기

 

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

  • 레퍼런스 전압: 입력 전압 범위는 레퍼런스 전압을 초과하지 않도록 주의
  • 입력 핀: 차동 입력 쌍은 동일 포트 내에서 선택 권장
  • 노이즈: 외부 신호 노이즈 감소를 위해 샘플링 수 증가 또는 샘플링 커패시터 감소 설정
  • 인터럽트: 다중 변환 시 인터럽트 활용 권장
  • 기능 안전: IEC 60730, IEC 61508, ISO 26262 표준 준수를 위해 Clock Failure Detection 및 Voltage Level Monitor 활용 가능

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

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

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

// File: adc_differential_avr128db48.c
// Description: AVR128DB48 ADC 차동모드 예제 (PA2와 PA3 전압 차이 측정)
// Compiler: AVR-GCC
// Target: AVR128DB48
#define F_CPU 24000000UL  // 시스템 클록 주파수를 24 MHz로 정의

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

void set_system_clock(void) {
	_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
	uint16_t timeout = 10000; // 타임아웃 추가
	while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm) && timeout--) {
		;
	}
	if (timeout == 0) {
		PORTB.OUTSET = PIN3_bm; // 에러 표시 (LED 켬)
		while (1); // 에러 상태 유지
	}
	_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, CLKCTRL_FRQSEL_24M_gc | CLKCTRL_AUTOTUNE_bm);
	_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSCHF_gc);
	_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00);
}

void adc_init(void) {
	// ADC0 초기화: 차동모드, 12비트, 내부 2.5V 레퍼런스
	VREF.ADC0REF = VREF_REFSEL_2V500_gc;          // 2.5V 참조 전압 설정
	ADC0.CTRLA = ADC_ENABLE_bm | ADC_CONVMODE_bm | ADC_RESSEL_12BIT_gc; // 활성화, 차동모드, 12비트
	ADC0.CTRLB = ADC_SAMPNUM_ACC4_gc;        // 4 샘플 누적
	ADC0.CTRLC = ADC_PRESC_DIV16_gc;         // 프리스케일러 (CLK_PER/16)
	ADC0.MUXPOS = ADC_MUXPOS_AIN2_gc;        // 양극: PA2
	ADC0.MUXNEG = ADC_MUXNEG_AIN3_gc;        // 음극: PA3
}

int16_t adc_read(void) {  // 부호 있는 값으로 차동 전압 반환
	ADC0.COMMAND = ADC_STCONV_bm;
	while (!(ADC0.INTFLAGS & ADC_RESRDY_bm));
	int16_t result = (int16_t)ADC0.RES - 2048; // 12비트 중간값(2048) 보정
	ADC0.INTFLAGS = ADC_RESRDY_bm;
	return result;
}

void gpio_init(void) {
	PORTB.DIRSET = PIN3_bm; // PB3 출력 설정 (LED0)
}

int main(void) {
	set_system_clock();
	gpio_init();
	adc_init();

	while (1) {
		int16_t adc_value = adc_read(); // 차동 전압 차이
		if (adc_value > 0) {  // 양의 전압 차이 시 LED 켬
			PORTB.OUTSET = PIN3_bm;
			} else {
			PORTB.OUTCLR = PIN3_bm;
		}
		_delay_ms(1000);
	}
	return 0;
}

설명:

  • 기능: PA2와 PA3 간의 전압 차이를 측정하고, 결과가 양수(2048 초과)일 때 PB3 LED를 켬.
  • 설정: ADC0 차동모드, 12비트 해상도, 내부 2.5V 레퍼런스, 4 샘플 누적, PA2(양극), PA3(음극)
  • 출력: 전압 차이 양수 시 LED ON, 음수 또는 0일 때 LED OFF.

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에 아날로그 신호 연결 (예: 가변저항, 센서)
  • 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. 결론

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

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