1. AVR128DB48 ZCD 모듈 개요
Microchip의 AVR128DB48은 AVR DB 시리즈의 8비트 마이크로컨트롤러로, ZCD(Zero-Cross Detection) 모듈을 통해 AC 신호의 영점 교차를 감지하여 전원 주파수 동기화, 디밍 제어, 또는 전력 관리 애플리케이션에 적합합니다. ZCD 모듈은 AC 신호의 전압이 0V 근처를 통과할 때 이벤트를 감지하며, 인터럽트 또는 출력 신호를 통해 이를 처리할 수 있습니다. 이 문서에서는 AVR128DB48의 ZCD 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.
주요 사양
- ZCD 모듈 수 : 2개 (ZCD0, ZCD1)
- 핀 : PA7(ZCD0), PC7(ZCD1)
- 기능 :
- 영점 교차 감지 (상승/하강 에지)
- 인터럽트 지원
- 출력 신호 생성 (외부 핀 또는 내부 이벤트 시스템 연결)
- 입력 필터링 (노이즈 제거)
- 클럭 소스 : 시스템 클럭 (최대 24MHz, OSCHF 내부 오실레이터)
- 인터럽트 : ZCDx_INT (x=0~1)
- 주요 레지스터 :
- ZCDx.CTRLA: ZCD 제어 레지스터 A
- ZCDx.CTRLB: ZCD 제어 레지스터 B
- ZCDx.STATUS: 상태 레지스터
- 전력 관리 : 저전력 모드에서 ZCD 동작 지원
- 전압 레벨 : 1.8V~5.5V 동작 지원
2. ZCD Bitfield 설정 상세
AVR128DB48의 ZCD 레지스터는 Bitfield 구조로 정의되어 있으며, <avr/io.h> 헤더 파일을 통해 접근합니다. 주요 레지스터는 다음과 같습니다:
2.1 ZCDx.CTRLA (제어 레지스터 A)
- bit.ENABLE : ZCD 활성화 (1: 활성화)
- bit.RUNSTDBY : 스탠바이 모드에서 ZCD 동작 (1: 활성화)
- bit.INVERT : 출력 반전 (1: 반전)
2.2 ZCDx.CTRLB (제어 레지스터 B)
- bit.FILTEN : 입력 필터 활성화 (1: 활성화, 노이즈 제거)
- bit.OUTEN : 출력 핀 활성화 (1: ZCD 출력이 핀에 나타남)
- bit.EVGEN : 이벤트 시스템 출력 활성화 (1: 활성화)
2.3 ZCDx.STATUS (상태 레지스터)
- bit.ZC : 영점 교차 감지 플래그 (1: 감지됨, 쓰기 시 클리어)
- bit.BUSY : ZCD 동작 상태 (1: 동작 중)
3. ZCD 설정 절차
- 시스템 초기화 :
- set_system_clock()로 시스템 클럭 설정 (24MHz, XOSC32K 오토튜닝)
- 인터럽트 비활성화 (cli())
- ZCD 모듈 활성화 :
- ZCDx.CTRLA.bit.ENABLE을 설정하여 ZCD 활성화
- 입력 필터 및 출력 설정 :
- ZCDx.CTRLB.bit.FILTEN으로 입력 필터 활성화
- ZCDx.CTRLB.bit.OUTEN으로 출력 핀 활성화 (필요 시)
- 인터럽트 설정 (필요 시) :
- ZCDx.CTRLA.bit.INTEN과 ZCDx.STATUS.bit.ZC로 인터럽트 설정
- 글로벌 인터럽트 활성화 (sei())
- ZCD 실행 :
- 설정 후 즉시 동작 (별도 활성화 불필요)
4. ZCD 설정 고려사항
- 입력 신호 : ZCD 핀(PA7, PC7)에 AC 신호 입력, 최대 입력 전압은 VDD(1.8V~5.5V) 준수
- 필터링 : 노이즈가 많은 환경에서는 FILTEN 활성화 권장
- 인터럽트 : 다중 ZCD 인터럽트 시 우선순위 주의
- 출력 핀 : OUTEN 활성화 시 ZCD 출력이 해당 핀에 나타남
- 멀티플렉싱 : ZCD 핀은 GPIO 또는 다른 주변 장치와 충돌 가능성 주의
- 저전력 : RUNSTDBY로 스탠바이 모드에서 ZCD 동작 가능
- 외부 회로 : 직렬 저항(RSERIES)으로 전류 제한, 노이즈 완화를 위한 커패시터 권장
5. 실용적인 ZCD 예제 코드 (Bitfield 구조)
아래는 AVR128DB48 ZCD를 Bitfield 구조로 설정한 3개의 예제 코드입니다. 각 예제는 Atmel Studio 또는 MPLAB X IDE와 AVR-GCC 환경에서 실행 가능합니다.
5.1 예제 1: 기본 ZCD 출력 (LED 표시)
// File: zcd_basic_output.c
// Description: AVR128DB48 ZCD 기본 출력 예제 (ZCD0으로 LED 점멸)
// Compiler: AVR-GCC
// Target: AVR128DB48
#include <avr/io.h> // AVR 입출력 관련 헤더 파일
#include <util/delay.h> // 지연 함수 관련 헤더 파일
#define F_CPU 24000000UL // 시스템 클록 주파수를 24 MHz로 정의
void set_system_clock(void) {
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
;
}
_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 zcd_init(void) {
// ZCD0(PA7) 설정
ZCD0.CTRLA = ZCD_ENABLE_bm; // ZCD0 활성화
ZCD0.CTRLB = ZCD_OUTEN_bm | ZCD_FILTEN_bm; // PA7에 ZCD 출력 및 필터 활성화
PORTB.DIRSET = PIN3_bm; // PB3(LED0)를 출력으로 설정
}
int main(void) {
set_system_clock(); // 시스템 클록 설정
zcd_init(); // ZCD 설정
while (1) {
if (ZCD0.STATUS & ZCD_ZC_bm) { // 영점 교차 감지
PORTB.OUTTGL = PIN3_bm; // PB3 LED 토글
ZCD0.STATUS = ZCD_ZC_bm; // ZC 플래그 클리어
}
_delay_ms(10); // 안정적인 동작을 위한 대기
}
return 0;
}
설명 :
- 기능 : ZCD0(PA7)에서 영점 교차 감지 시 PB3 LED를 토글
- 설정 : ZCD0 활성화, 출력 핀(PA7) 및 필터 활성화, PB3 출력
- 출력 : AC 신호의 영점 교차마다 LED 점멸
5.2 예제 2: ZCD 인터럽트 (LED 토글)
// File: zcd_interrupt.c
// Description: AVR128DB48 ZCD 인터럽트 예제 (ZCD0으로 LED 토글)
// Compiler: AVR-GCC
// Target: AVR128DB48
#include <avr/io.h> // AVR 입출력 관련 헤더 파일
#include <avr/interrupt.h> // 인터럽트 처리 관련 헤더 파일
#define F_CPU 24000000UL // 시스템 클록 주파수를 24 MHz로 정의
volatile uint8_t led_state = 0; // LED 상태 저장
void set_system_clock(void) {
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
;
}
_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 zcd_init(void) {
// ZCD0(PA7) 설정
ZCD0.CTRLA = ZCD_ENABLE_bm | ZCD_INTEN_bm; // ZCD0 활성화 및 인터럽트 활성화
ZCD0.CTRLB = ZCD_FILTEN_bm; // 입력 필터 활성화
PORTB.DIRSET = PIN3_bm; // PB3(LED0)를 출력으로 설정
}
ISR(ZCD0_ZCD_vect) {
led_state ^= 1; // LED 상태 토글
if (led_state) {
PORTB.OUTSET = PIN3_bm; // PB3 High (LED 켬)
} else {
PORTB.OUTCLR = PIN3_bm; // PB3 Low (LED 끔)
}
ZCD0.STATUS = ZCD_ZC_bm; // ZC 플래그 클리어
}
int main(void) {
set_system_clock(); // 시스템 클록 설정
zcd_init(); // ZCD 설정
sei(); // 글로벌 인터럽트 활성화
while (1) {
// 무한 루프: 인터럽트로 LED 제어
}
return 0;
}
설명 :
- 기능 : ZCD0(PA7)의 영점 교차 시 인터럽트로 PB3 LED 토글
- 설정 : ZCD0 활성화, 인터럽트 및 필터 활성화, PB3 출력
- 출력 : AC 신호의 영점 교차마다 LED 상태 토글
5.3 예제 3: 다중 ZCD 출력 (LED 패턴)
// File: zcd_multi.c
// Description: AVR128DB48 다중 ZCD 출력 예제 (ZCD0, ZCD1으로 LED 패턴)
// Compiler: AVR-GCC
// Target: AVR128DB48
#include <avr/io.h> // AVR 입출력 관련 헤더 파일
#include <util/delay.h> // 지연 함수 관련 헤더 파일
#define F_CPU 24000000UL // 시스템 클록 주파수를 24 MHz로 정의
void set_system_clock(void) {
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, CLKCTRL_ENABLE_bm | CLKCTRL_RUNSTDBY_bm);
while (!(CLKCTRL.MCLKSTATUS & CLKCTRL_XOSC32KS_bm)) {
;
}
_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 zcd_init(void) {
// ZCD0(PA7), ZCD1(PC7) 설정
ZCD0.CTRLA = ZCD_ENABLE_bm; // ZCD0 활성화
ZCD0.CTRLB = ZCD_FILTEN_bm; // ZCD0 필터 활성화
ZCD1.CTRLA = ZCD_ENABLE_bm; // ZCD1 활성화
ZCD1.CTRLB = ZCD_FILTEN_bm; // ZCD1 필터 활성화
PORTA.DIRSET = PIN0_bm | PIN1_bm; // PA0, PA1를 출력으로 설정 (LED 연결)
}
int main(void) {
set_system_clock(); // 시스템 클록 설정
zcd_init(); // ZCD 설정
while (1) {
if (ZCD0.STATUS & ZCD_ZC_bm) { // ZCD0 영점 교차 감지
PORTA.OUTSET = PIN0_bm; // PA0 LED 켬
PORTA.OUTCLR = PIN1_bm; // PA1 LED 끔
ZCD0.STATUS = ZCD_ZC_bm; // ZC 플래그 클리어
}
if (ZCD1.STATUS & ZCD_ZC_bm) { // ZCD1 영점 교차 감지
PORTA.OUTSET = PIN1_bm; // PA1 LED 켬
PORTA.OUTCLR = PIN0_bm; // PA0 LED 끔
ZCD1.STATUS = ZCD_ZC_bm; // ZC 플래그 클리어
}
_delay_ms(10); // 안정적인 동작을 위한 대기
}
return 0;
}
설명 :
- 기능 : ZCD0(PA7)와 ZCD1(PC7)의 영점 교차 감지에 따라 PA0, PA1 LED 패턴 제어
- 설정 : ZCD0, ZCD1 활성화, 필터 활성화, PA0/PA1 출력
- 출력 : ZCD0 감지 시 PA0 ON/PA1 OFF, ZCD1 감지 시 PA1 ON/PA0 OFF
6. 사용 방법
6.1 환경 설정
- AVR-GCC 설치 : Atmel Studio 또는 MPLAB X IDE에 AVR-GCC 툴체인 설치
- 헤더 파일 : <avr/io.h>, <avr/interrupt.h>, <util/delay.h> 포함
- 프로젝트 설정 : AVR128DB48 타겟으로 프로젝트 생성
- 클럭 정의 : #define F_CPU 24000000UL로 시스템 클록 설정
6.2 코드 실행
- 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
- 다른 예제 코드 주석 처리
- Atmel Studio/MPLAB X IDE에서 빌드 및 플래싱
6.3 하드웨어 준비
- ZCD 입력 : PA7(ZCD0), PC7(ZCD1)에 AC 신호 입력 (예: 50Hz/60Hz AC 신호, 직렬 저항 RSERIES 사용)
- LED 출력 : PB3, PA0, PA1에 LED 및 전류 제한 저항(예: 330Ω) 연결
- 전원 : 1.8V~5.5V 전원 공급
- 안전 : AC 신호 입력 시 절연 회로(옵토커플러 또는 소형 변압기) 권장
6.4 디버깅
- Atmel Studio/MPLAB X IDE의 디버거 사용
- ZCDx.STATUS 레지스터 확인
- 오실로스코프 또는 로직 분석기로 ZCD 핀 및 출력 신호 점검
7. 추가 팁
- 클럭 설정 : set_system_clock()로 XOSC32K 안정화 및 24MHz 설정 확인
- 노이즈 감소 : FILTEN 활성화 및 외부 커패시터 추가 (예: ZCDxIN 핀에 10nF)
- Microchip 리소스 : AVR128DB48 데이터시트, Technical Brief (TB3138), Application Notes (AN)
- 문제 해결 :
- 출력 없음: ZCDx.CTRLA 및 ZCDx.CTRLB 설정 확인
- 인터럽트 실패: ZCDx.STATUS 및 인터럽트 플래그 확인
- 입력 신호 불안정: 직렬 저항 값 조정(예: 1MΩ) 또는 외부 필터 추가
- 커뮤니티 : Microchip Community, AVR Freaks 포럼 참고
8. 결론
이 문서는 AVR128DB48 ZCD 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 AC 신호의 영점 교차 감지 애플리케이션에 적용 가능하도록 구성했습니다. 초보자는 기본 ZCD 출력 예제부터 시작하고, 숙련자는 인터럽트 및 다중 ZCD를 활용하여 복잡한 시스템을 구현할 수 있습니다.
키워드 : AVR128DB48, ZCD, Zero-Cross Detection, AVR, 마이크로컨트롤러, Atmel Studio, MPLAB X IDE, AC 신호, 인터럽트, 입력 필터, LED 제어
'MCU > AVR' 카테고리의 다른 글
[AVR128DB48] 클럭 설정 상세 가이드 (0) | 2025.08.20 |
---|---|
[AVR128DB48] ADC 차동모드 설정 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] RTC 사용 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] LIN, IrDA, RS485, MPCM, 스타트 프레임 감지, 동기 모드 사용 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] OPAMP 및 아날로그 비교기 사용 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] PWM 사용 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] 이벤트 시스템 사용 방법 및 예제 코드 (0) | 2025.08.20 |
[AVR128DB48] ADC 및 DAC 사용 방법 및 예제 코드 (0) | 2025.08.20 |