본문 바로가기
MCU/AVR

[AVR128DB48] ZCD 사용 방법 및 예제 코드

by linuxgo 2025. 8. 20.
반응형

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 설정 절차

  1. 시스템 초기화 :
    •   set_system_clock()로 시스템 클럭 설정 (24MHz, XOSC32K 오토튜닝)
    •   인터럽트 비활성화 (cli())
  2. ZCD 모듈 활성화 :
    •   ZCDx.CTRLA.bit.ENABLE을 설정하여 ZCD 활성화
  3. 입력 필터 및 출력 설정 :
    •   ZCDx.CTRLB.bit.FILTEN으로 입력 필터 활성화
    •   ZCDx.CTRLB.bit.OUTEN으로 출력 핀 활성화 (필요 시)
  4. 인터럽트 설정 (필요 시) :
    •   ZCDx.CTRLA.bit.INTEN과 ZCDx.STATUS.bit.ZC로 인터럽트 설정
    •   글로벌 인터럽트 활성화 (sei())
  5. 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 제어

반응형