1. AVR128DB48 ADC 모듈 개요
Microchip의 AVR128DB48 마이크로컨트롤러는 12비트 ADC(Analog-to-Digital Converter)를 내장하고 있으며, 차동모드(Differential Mode)를 지원하여 두 입력 간의 전압 차이를 고정밀으로 측정할 수 있습니다. 차동모드에서는 고정밀 측정이 필요한 애플리케이션(예: 센서 인터페이스, 오디오 처리)에 적합합니다. 이 문서는 ADC 차동모드를 설명하고, Bitfield 구조를 활용한 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.
주요 사양
- 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, 아날로그, 레퍼런스 전압, 샘플링
'MCU > AVR' 카테고리의 다른 글
AVR128DA 시리즈 UART 드라이버 설계 및 구현 (0) | 2025.09.03 |
---|---|
AVR128DA 시리즈 GPIO 드라이버 설계 및 구현 (0) | 2025.09.03 |
AVR128DB48 클럭 설정 상세 가이드 (0) | 2025.08.20 |
AVR128DB48 ZCD 사용 방법 및 예제 코드 (3) | 2025.08.20 |
AVR128DB48 RTC 사용 방법 및 예제 코드 (0) | 2025.08.20 |
AVR128DB48 LIN, IrDA, RS485, MPCM, 스타트 프레임 감지, 동기 모드 사용 방법 및 예제 코드 (1) | 2025.08.20 |
AVR128DB48 Event System 사용 방법 및 예제 코드(수정) (0) | 2025.08.20 |
AVR128DB48 Watchdog 사용 방법 및 예제 코드 (0) | 2025.08.19 |