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.h 및 F2837xD_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 설정 절차
- 시스템 초기화:
- InitSysCtrl() 호출로 시스템 클럭 및 PLL 초기화
- DAC 클럭 활성화:
- CpuSysRegs.PCLKCR13.bit.DACx = 1로 DAC 모듈(x=A, B, C) 클럭 활성화
- EALLOW와 EDIS로 보호된 레지스터 접근
- DAC 설정:
- DACCTL.bit.DACREFSEL로 기준 전압 선택
- DACCTL.bit.LOADMODE로 섀도우 로드 타이밍 설정
- DACVAL.bit.DACVALS로 출력 값 설정 (0~4095)
- DACOUTEN.bit.DACx로 출력 활성화
- 동기화 (옵션):
- DACCTL.bit.SYNCSEL로 ePWM 동기화 설정
- 출력 시작:
- DACVAL.bit.DACVALS 업데이트로 아날로그 출력 생성
3.2 Fault Trip Zones 설정 절차
- ePWM 클럭 활성화:
- CpuSysRegs.PCLKCR2.bit.EPWMx = 1로 ePWM 모듈 클럭 활성화
- 트립 존 소스 설정:
- TZSEL.bit.CBCn 또는 TZSEL.bit.OSHTn으로 트립 소스 선택
- 트립 동작 설정:
- TZCTL.bit.TZA/B로 트립 시 PWM 출력 동작 정의
- 인터럽트 설정 (옵션):
- TZEINT.bit.CBC/OST로 인터럽트 활성화
- 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
'MCU > C2000' 카테고리의 다른 글
[TMS320F28377D] DC-DC 변환 토포롤로지별 ePWM 생성 방법: Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
---|---|
[TI C2000]TMS320F28377D, TMS320F28379D, TMS320F28388D 비교 (1) | 2025.08.18 |
[TI C2000]CMD 파일: 상세 설명, 구조, 작성 방법 및 예제(C2000 CMD File: Detailed Explanation, Structure, Writing Methods, and Examples) (2) | 2025.08.18 |
[TMS320F28377D] FPU, TMU, VCU-II 사용법 : 예제 코드 및 활용 가이드 (1) | 2025.08.18 |
[TMS320F28377D] USB, I2C, McBSP, uPP 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] SDFM 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
[TMS320F28377D] ePWM CMPASS 사용법: Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] SPI 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |