본문 바로가기
MCU/C2000

[TMS320F28377D] DAC 및 Fault Trip Zones 사용법 : Bitfield 구조 활용 예제 코드

by linuxgo 2025. 8. 18.
반응형

1. TMS320F28377D DAC 및 Fault Trip Zones 개요

TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 고성능 아날로그-디지털 변환 및 보호 기능이 필요한 애플리케이션(예: 모터 제어, 전력 변환)에 적합합니다. 이 문서에서는 TMS320F28377D의 DAC(디지털-아날로그 변환기) 모듈과 Fault Trip Zones 기능을 설정하는 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공합니다. 초보자와 숙련된 개발자 모두가 쉽게 활용할 수 있도록 구성했습니다.

1.1 DAC 모듈 개요

TMS320F28377D는 최대 3개의 DAC 모듈(DACA, DACB, DACC)을 포함하며, 각 모듈은 12비트 해상도로 아날로그 신호를 생성합니다. 주요 사양은 다음과 같습니다:

  • 해상도: 12비트 (0~4095 레벨)
  • 출력 범위: 0~3.3V (외부 기준 전압 사용 가능)
  • 클럭 소스: 시스템 클럭(SYSCLK, 최대 200MHz)
  • 주요 기능:
    • DAC 출력 값 설정 (DACA, DACB, DACC 각각 독립적)
    • 섀도우 레지스터 지원 (즉시 또는 동기화된 업데이트)
    • 외부 기준 전압 설정 가능
    • ePWM 트리거와 연동 가능
  • 용도: 모터 제어, 신호 생성, 센서 캘리브레이션 등

1.2 Fault Trip Zones 개요

Fault Trip Zones는 ePWM 모듈의 하위 기능으로, 과전류, 과전압, 외부 오류 등의 이벤트 발생 시 PWM 출력을 즉시 차단하거나 제어하여 시스템을 보호합니다. 주요 사양은 다음과 같습니다:

  • 트립 소스: TZ1~TZ6 (GPIO 핀 또는 내부 신호)
  • 동작 모드:
    • Cycle-by-Cycle (CBC): 단일 주기에서 트립 이벤트 처리 후 복구
    • One-Shot (OSHT): 트립 이벤트 발생 시 출력 차단 후 복구 없음
  • 주요 기능:
    • 출력 강제 설정 (High, Low, High-Z)
    • 인터럽트 생성
    • 다중 트립 소스 논리 연산 (AND/OR)
  • 용도: 모터 드라이버 보호, 전력 변환기 안전 제어

2. DAC 및 Fault Trip Zones Bitfield 설정 상세

TMS320F28377D의 DAC 및 Fault Trip Zones 레지스터는 Bitfield 구조로 정의되어 있으며, F2837xD_dac.hF2837xD_epwm.h 헤더 파일을 통해 접근합니다. 주요 레지스터는 다음과 같습니다:

2.1 DAC 관련 레지스터

  • DACCTL (DAC 제어 레지스터):
    • bit.DACREFSEL: 기준 전압 선택 (0: 내부 1.65V, 1: 외부 ADCVREF)
    • bit.LOADMODE: 섀도우 레지스터 로드 타이밍 (0: 즉시, 1: 동기화)
    • bit.SYNCSEL: 동기화 소스 선택 (ePWMxSYNCI)
  • DACVAL (DAC 값 레지스터):
    • bit.DACVALS: 섀도우 값 (0~4095, 12비트)
    • bit.DACVALA: 실제 출력 값
  • DACOUTEN: DAC 출력 활성화 (1: 활성화)

2.2 Fault Trip Zones 관련 레지스터

  • TZSEL (트립 존 선택 레지스터):
    • bit.CBCn: Cycle-by-Cycle 트립 소스 n 활성화 (n=1~6)
    • bit.OSHTn: One-Shot 트립 소스 n 활성화
  • TZCTL (트립 존 제어 레지스터):
    • bit.TZA: PWM_A 트립 시 동작 (0: High-Z, 1: High, 2: Low, 3: 무시)
    • bit.TZB: PWM_B 트립 시 동작
  • TZEINT (트립 존 인터럽트 활성화 레지스터):
    • bit.CBC: Cycle-by-Cycle 인터럽트 활성화
    • bit.OST: One-Shot 인터럽트 활성화
  • TZFLG (트립 존 플래그 레지스터):
    • 트립 이벤트 상태 확인

3. DAC 및 Fault Trip Zones 설정 절차

3.1 DAC 설정 절차

  1. 시스템 초기화:
    •    InitSysCtrl() 호출로 시스템 클럭 및 PLL 초기화
  2. DAC 클럭 활성화:
    •    CpuSysRegs.PCLKCR13.bit.DACx = 1로 DAC 모듈(x=A, B, C) 클럭 활성화
    •    EALLOW와 EDIS로 보호된 레지스터 접근
  3. DAC 설정:
    •    DACCTL.bit.DACREFSEL로 기준 전압 선택
    •    DACCTL.bit.LOADMODE로 섀도우 로드 타이밍 설정
    •    DACVAL.bit.DACVALS로 출력 값 설정 (0~4095)
    •    DACOUTEN.bit.DACx로 출력 활성화
  4. 동기화 (옵션):
    •    DACCTL.bit.SYNCSEL로 ePWM 동기화 설정
  5. 출력 시작:
    •    DACVAL.bit.DACVALS 업데이트로 아날로그 출력 생성

3.2 Fault Trip Zones 설정 절차

  1. ePWM 클럭 활성화:
    •    CpuSysRegs.PCLKCR2.bit.EPWMx = 1로 ePWM 모듈 클럭 활성화
  2. 트립 존 소스 설정:
    •    TZSEL.bit.CBCn 또는 TZSEL.bit.OSHTn으로 트립 소스 선택
  3. 트립 동작 설정:
    •    TZCTL.bit.TZA/B로 트립 시 PWM 출력 동작 정의
  4. 인터럽트 설정 (옵션):
    •    TZEINT.bit.CBC/OST로 인터럽트 활성화
  5. ePWM 실행:
    •    TBCTL.bit.FREE_SOFT = 2로 PWM Free Run 모드 활성화

4. DAC 및 Fault Trip Zones 설정 고려사항

  • DAC:
    •    출력 범위: 내부 기준 전압(1.65V) 사용 시 출력 스케일링 주의
    •    노이즈: 외부 필터 추가로 출력 신호 안정화
    •    동기화: ePWM과 연동 시 정확한 SYNCSEL 설정 필요
  • Fault Trip Zones:
    •    트립 소스: GPIO 핀(TZ1~TZ6) 또는 내부 신호(CMPSS) 사용
    •    복구 시간: CBC 모드 사용 시 트립 이벤트 후 복구 타이밍 확인
    •    인터럽트: 트립 이벤트 디버깅을 위해 TZEINT 활성화 권장

5. 실용적인 DAC 및 Fault Trip Zones 예제 코드 (Bitfield 구조)

아래는 TMS320F28377D의 DAC와 Fault Trip Zones 기능을 Bitfield 구조로 설정한 5개의 실용적인 예제 코드입니다. Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.

5.1 예제 1: 기본 DAC 출력 (정적 신호)

// File: dac_basic_output.c
// Description: TMS320F28377D DAC 기본 출력 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // DAC-A 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.DACA = 1; // DAC-A 클럭 활성화
    EDIS;

    // DAC-A 설정 (Bitfield 사용)
    DacaRegs.DACCTL.bit.DACREFSEL = 0; // 내부 기준 전압 (1.65V)
    DacaRegs.DACCTL.bit.LOADMODE = 0; // 즉시 로드
    DacaRegs.DACOUTEN.bit.DACA = 1; // DAC-A 출력 활성화
    DacaRegs.DACVAL.bit.DACVALS = 2048; // 50% 출력 (1.65V)

    for(;;); // 무한 루프
}

설명:

  • 기능: DACA로 1.65V 정적 아날로그 신호 출력
  • 설정: 내부 기준 전압(1.65V), DACVALS=2048(50% 출력)
  • GPIO: GPIO31(LED)
  • 출력: DAC-A 핀에 1.65V 출력, 정상 동작 시 LED ON

5.2 예제 2: DAC와 ePWM 동기화 (사인파 출력)

// File: dac_epwm_sine.c
// Description: TMS320F28377D DAC와 ePWM 동기화로 사인파 출력 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"
#include <math.h>

volatile Uint16 sine_index = 0;
const Uint16 sine_table[100] = {
    // 100개의 사인파 데이터 (0~4095 스케일, 12비트)
    2048, 2248, 2447, 2643, 2835, 3020, 3196, 3363, 3519, 3663,
    // ... (사인파 테이블 나머지 부분은 생략, 실제 구현 시 전체 테이블 필요)
};

__interrupt void epwm1_isr(void)
{
    // 사인파 테이블에서 다음 값으로 DAC 업데이트
    DacaRegs.DACVAL.bit.DACVALS = sine_table[sine_index];
    sine_index = (sine_index + 1) % 100;

    // 인터럽트 플래그 클리어
    EPwm1Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // 인터럽트 벡터 설정
    EALLOW;
    PieVectTable.EPWM1_INT = &epwm1_isr; // ePWM1 인터럽트 벡터 설정
    EDIS;

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // DAC-A 및 ePWM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.DACA = 1; // DAC-A 클럭 활성화
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 클럭 활성화
    EDIS;

    // DAC-A 설정 (Bitfield 사용)
    DacaRegs.DACCTL.bit.DACREFSEL = 0; // 내부 기준 전압 (1.65V)
    DacaRegs.DACCTL.bit.LOADMODE = 1; // 동기화 로드
    DacaRegs.DACCTL.bit.SYNCSEL = 0; // ePWM1 동기화
    DacaRegs.DACOUTEN.bit.DACA = 1; // DAC-A 출력 활성화
    DacaRegs.DACVAL.bit.DACVALS = 2048; // 초기 값 (1.65V)

    // ePWM1 설정 (Bitfield 사용)
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.ETSEL.bit.INTEN = 1; // 인터럽트 활성화
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // TBCTR=0일 때 인터럽트 발생
    EPwm1Regs.ETPS.bit.INTPRD = 1; // 첫 번째 이벤트에서 인터럽트 발생
    EPwm1Regs.ETCLR.bit.INT = 1; // 인터럽트 플래그 클리어
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1; // PIE 그룹 3, ePWM1 인터럽트 활성화
    IER |= M_INT3; // CPU 인터럽트 3 활성화

    EINT; // 글로벌 인터럽트 활성화
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

    for(;;); // 무한 루프
}

설명:

  • 기능: DACA로 사인파 출력, ePWM1 인터럽트로 동기화
  • 설정: 내부 기준 전압(1.65V), ePWM1 동기화, 100kHz 주기, 사인파 테이블 기반 출력
  • GPIO: GPIO31(LED)
  • 출력: DAC-A 핀에 사인파 출력, 정상 동작 시 LED ON

5.3 예제 3: Fault Trip Zones로 PWM 보호

// File: epwm_dac_trip_zone.c
// Description: TMS320F28377D ePWM과 DAC, Fault Trip Zones 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO2를 입력(Trip Zone 입력)으로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 0; // GPIO2 입력 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // DAC-A 및 ePWM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.DACA = 1; // DAC-A 클럭 활성화
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 클럭 활성화
    EDIS;

    // DAC-A 설정 (Bitfield 사용)
    DacaRegs.DACCTL.bit.DACREFSEL = 0; // 내부 기준 전압 (1.65V)
    DacaRegs.DACCTL.bit.LOADMODE = 0; // 즉시 로드
    DacaRegs.DACOUTEN.bit.DACA = 1; // DAC-A 출력 활성화
    DacaRegs.DACVAL.bit.DACVALS = 2048; // 50% 출력 (1.65V)

    // ePWM1 설정 (Bitfield 사용)
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low

    // Fault Trip Zones 설정
    EPwm1Regs.TZSEL.bit.CBC1 = 1; // TZ1 (GPIO2)에서 Cycle-by-Cycle 트립 활성화
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // 트립 시 PWM_A를 Low로 강제
    EPwm1Regs.TZEINT.bit.CBC = 1; // Cycle-by-Cycle 인터럽트 활성화

    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

    for(;;); // 무한 루프
}

설명:

  • 기능: DACA로 1.65V 정적 출력, ePWM1로 100kHz PWM 출력, GPIO2(TZ1)에서 트립 이벤트 발생 시 PWM 차단
  • 설정: DACVALS=2048(1.65V), Up 카운터, 주기 2000(100kHz), CMPA=1000(50% 듀티), TZ1 CBC 트립
  • GPIO: GPIO0(ePWM1A), GPIO2(TZ1 입력), GPIO31(LED)
  • 출력: DAC-A에 1.65V 출력, GPIO0에 PWM 신호, 트립 이벤트 시 PWM Low, 정상 동작 시 LED ON

5.4 예제 4: One-Shot Trip Zone with Multiple Trip Sources

// File: epwm_oneshot_trip.c
// Description: TMS320F28377D ePWM One-Shot 트립 존 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

__interrupt void trip_zone_isr(void)
{
    // 트립 이벤트 처리 (예: LED 끄기)
    GpioDataRegs.GPBCLEAR.bit.GPIO31 = 1; // LED 끄기

    // 트립 존 인터럽트 플래그 클리어
    EPwm1Regs.TZCLR.bit.OST = 1;
    EPwm1Regs.TZCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
}

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // 인터럽트 벡터 설정
    EALLOW;
    PieVectTable.TZ_INT = &trip_zone_isr; // 트립 존 인터럽트 벡터 설정
    EDIS;

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO2를 TZ1 입력으로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO3를 TZ2 입력으로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 0; // GPIO2 입력 설정
    GpioCtrlRegs.GPADIR.bit.GPIO3 = 0; // GPIO3 입력 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // DAC-A 및 ePWM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.DACA = 1; // DAC-A 클럭 활성화
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 클럭 활성화
    EDIS;

    // DAC-A 설정 (Bitfield 사용)
    DacaRegs.DACCTL.bit.DACREFSEL = 0; // 내부 기준 전압 (1.65V)
    DacaRegs.DACCTL.bit.LOADMODE = 0; // 즉시 로드
    DacaRegs.DACOUTEN.bit.DACA = 1; // DAC-A 출력 활성화
    DacaRegs.DACVAL.bit.DACVALS = 2048; // 50% 출력 (1.65V)

    // ePWM1 설정 (Bitfield 사용)
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low

    // One-Shot 트립 존 설정
    EPwm1Regs.TZSEL.bit.OSHT1 = 1; // TZ1 (GPIO2)에서 One-Shot 트립 활성화
    EPwm1Regs.TZSEL.bit.OSHT2 = 1; // TZ2 (GPIO3)에서 One-Shot 트립 활성화
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // 트립 시 PWM_A를 Low로 강제
    EPwm1Regs.TZEINT.bit.OST = 1; // One-Shot 인터럽트 활성화
    PieCtrlRegs.PIEIER2.bit.INTx1 = 1; // PIE 그룹 2, 트립 존 인터럽트 활성화
    IER |= M_INT2; // CPU 인터럽트 2 활성화

    EINT; // 글로벌 인터럽트 활성화
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

    for(;;); // 무한 루프
}

설명:

  • 기능: DACA로 1.65V 정적 출력, ePWM1로 100kHz PWM 출력, GPIO2(TZ1) 또는 GPIO3(TZ2)에서 One-Shot 트립 이벤트 발생 시 PWM 차단 및 인터럽트 처리
  • 설정: DACVALS=2048(1.65V), Up 카운터, 주기 2000(100kHz), CMPA=1000(50% 듀티), TZ1/TZ2 One-Shot 트립, 인터럽트 활성화
  • GPIO: GPIO0(ePWM1A), GPIO2(TZ1 입력), GPIO3(TZ2 입력), GPIO31(LED)
  • 출력: DAC-A에 1.65V 출력, GPIO0에 PWM 신호, 트립 이벤트 시 PWM Low 및 LED OFF, 정상 동작 시 LED ON

5.5 예제 5: Fault Trip Zone with CMPSS (Comparator Subsystem)

// File: epwm_cmpss_trip.c
// Description: TMS320F28377D ePWM과 CMPSS를 이용한 Fault Trip Zones 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // DAC-A, ePWM1, CMPSS1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.DACA = 1; // DAC-A 클럭 활성화
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 클럭 활성화
    CpuSysRegs.PCLKCR8.bit.CMPSS1 = 1; // CMPSS1 클럭 활성화
    EDIS;

    // DAC-A 설정 (Bitfield 사용)
    DacaRegs.DACCTL.bit.DACREFSEL = 0; // 내부 기준 전압 (1.65V)
    DacaRegs.DACCTL.bit.LOADMODE = 0; // 즉시 로드
    DacaRegs.DACOUTEN.bit.DACA = 1; // DAC-A 출력 활성화
    DacaRegs.DACVAL.bit.DACVALS = 2048; // 50% 출력 (1.65V)

    // CMPSS1 설정 (Bitfield 사용)
    Cmpss1Regs.COMPCTL.bit.COMPDACE = 1; // 비교기 DAC 활성화
    Cmpss1Regs.COMPCTL.bit.COMPSEL = 0; // 비교기 입력: CMPIN1P
    Cmpss1Regs.COMPDACCTL.bit.DACSOURCE = 0; // 내부 DAC 사용
    Cmpss1Regs.DACHVALS.bit.DACVAL = 3072; // 비교 기준 전압 (75% of 3.3V)
    Cmpss1Regs.COMPCTL.bit.COMPOUTE = 1; // 비교기 출력 활성화

    // ePWM1 설정 (Bitfield 사용)
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low

    // Fault Trip Zones 설정 (CMPSS1 사용)
    EPwm1Regs.TZSEL.bit.CBC6 = 1; // CMPSS1에서 Cycle-by-Cycle 트립 활성화
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // 트립 시 PWM_A를 Low로 강제
    EPwm1Regs.TZEINT.bit.CBC = 1; // Cycle-by-Cycle 인터럽트 활성화

    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

    for(;;); // 무한 루프
}

설명:

  • 기능: DACA로 1.65V 정적 출력, ePWM1로 100kHz PWM 출력, CMPSS1을 이용한 과전류 감지로 Cycle-by-Cycle 트립 활성화
  • 설정: DACVALS=2048(1.65V), Up 카운터, 주기 2000(100kHz), CMPA=1000(50% 듀티), CMPSS1 내부 DAC 기준 75% (3072), TZ6 CBC 트립
  • GPIO: GPIO0(ePWM1A), GPIO31(LED)
  • 출력: DAC-A에 1.65V 출력, GPIO0에 PWM 신호, CMPSS1 트립 이벤트 시 PWM Low, 정상 동작 시 LED ON

6. 사용 방법

6.1 환경 설정

  • C2000Ware 설치: C:\ti\c2000\C2000Ware_x_xx_xx_xx에서 라이브러리 다운로드
  • CCS 프로젝트: TMS320F28377D 타겟으로 프로젝트 생성, F28x_Project.h 포함
  • 링커 파일: device_support\f2837xd 폴더에서 링커 파일 추가

6.2 코드 실행

  • 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
  • 원하는 예제만 실행되도록 다른 코드 주석 처리

6.3 하드웨어 준비

  • DAC 출력: DAC-A 핀에 오실로스코프 연결
  • PWM 출력: ePWM1A 핀에 오실로스코프 또는 부하 연결
  • 트립 존: GPIO2, GPIO3에 트립 신호 입력(예: 과전류 센서) 또는 CMPSS 입력 핀 연결
  • LED: GPIO31에 LED 연결 (정상 동작 확인용)

6.4 디버깅

  • DAC: DacaRegs.DACVAL.bit.DACVALS 확인
  • ePWM: EPwm1Regs.TBCTR, EPwm1Regs.CMPA 모니터링
  • 트립 존: EPwm1Regs.TZFLG로 트립 이벤트 상태 점검
  • CMPSS: Cmpss1Regs.COMPSTS로 비교기 상태 확인
  • 인터럽트: EPwm1Regs.TZFLG, EPwm1Regs.ETFLG로 상태 확인

7. 추가 팁

  • DAC:
    •    캘리브레이션: Device_cal() 호출로 DAC 출력 보정
    •    노이즈 감소: 저역통과 필터 추가
  • Fault Trip Zones:
    •    트립 소스 테스트: GPIO2, GPIO3에 수동 스위치 또는 CMPSS 입력 연결로 트립 동작 확인
    •    복구 확인: CBC 모드에서 트립 해제 후 PWM 복구 점검
  • C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\dac, C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\epwm
  • 문제 해결:
    •    DAC 출력 없음: DACOUTEN, DACCTL.bit.DACREFSEL 확인
    •    트립 동작 실패: TZSEL, TZCTL, Cmpss1Regs.COMPCTL 설정 점검
  • TI 리소스: TI E2E 포럼, C2000Ware 예제

8. 결론

이 문서는 TMS320F28377D의 DAC와 Fault Trip Zones 기능을 Bitfield 구조를 활용하여 설정하는 방법을 설명하고, 기본 DAC 출력, ePWM 동기화 사인파 출력, Cycle-by-Cycle 트립 존, One-Shot 트립 존, CMPSS 기반 트립 존 예제를 통해 다양한 애플리케이션에 적용 가능합니다.

키워드: TMS320F28377D, DAC, Fault Trip Zones, CMPSS, C2000, PWM, 마이크로컨트롤러, Code Composer Studio, 아날로그 출력, 트립 존, 동기화, Bitfield

반응형