TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 고속 PWM 애플리케이션에 최적화된 ePWM(Enhanced Pulse Width Modulation) 모듈과 CMPASS(Comparator Subsystem)를 제공합니다. CMPASS는 아날로그 신호를 디지털 트립 신호로 변환하여 ePWM의 트립 존(Trip Zone) 또는 디지털 비교기(Digital Compare, DC) 모듈과 연동, 과전류 보호 및 정밀 제어를 가능하게 합니다. 이 문서에서는 CMPASS 설정 방법과 Bitfield 구조를 활용한 세 가지 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두가 쉽게 활용할 수 있도록 설명합니다.
1. CMPASS 개요
CMPASS는 ePWM 모듈과 결합된 아날로그 비교기 서브시스템으로, 외부 아날로그 신호(예: 전류 센서 출력)를 디지털 신호로 변환하여 트립 이벤트 또는 ADC 트리거를 생성합니다. 주요 특징은 다음과 같습니다:
- 입력: 아날로그 비교기(CMP1~CMP8)로 외부 신호 입력.
- 출력: 디지털 트립 신호(TZ1~TZ6) 또는 디지털 비교(DC) 이벤트.
- 기능:
- 과전류/과전압 보호를 위한 트립 존 트리거.
- ePWM 출력 제어(예: 출력 차단).
- ADC 트리거 또는 인터럽트 발생.
- 설정 레지스터:
- COMPCTL: 비교기 제어(활성화, 입력 선택 등).
- TZDCSEL: 트립 존 디지털 비교 선택.
- DCTRIPSEL: 디지털 비교기 입력 선택.
- TZSEL: 트립 존 소스 선택.
2. CMPASS Bitfield 설정 상세
CMPASS 관련 레지스터는 F2837xD_epwm.h 및 F2837xD_cmpss.h 헤더 파일을 통해 Bitfield 구조로 접근합니다. 주요 레지스터는 다음과 같습니다:
2.1 COMPCTL (비교기 제어 레지스터)
- bit.COMPSEL: 비교기 입력 선택 (0: 양극 입력, 1: 음극 입력).
- bit.COMPEN: 비교기 활성화 (1: 활성화).
- bit.COMPHSOURCE: 하이 임피던스 소스 선택.
- bit.COMPOE: 비교기 출력 활성화.
2.2 TZDCSEL (트립 존 디지털 비교 선택)
- bit.DCAEVT1: 디지털 비교기 A 이벤트 1 선택.
- bit.DCAEVT2: 디지털 비교기 A 이벤트 2 선택.
- bit.DCBEVT1: 디지털 비교기 B 이벤트 1 선택.
- bit.DCBEVT2: 디지털 비교기 B 이벤트 2 선택.
2.3 DCTRIPSEL (디지털 비교기 트립 입력 선택)
- bit.DCAHSEL: 디지털 비교기 A High 입력 선택.
- bit.DCALSEL: 디지털 비교기 A Low 입력 선택.
- bit.DCBHSEL: 디지털 비교기 B High 입력 선택.
- bit.DCBLSEL: 디지털 비교기 B Low 입력 선택.
2.4 TZSEL (트립 존 선택)
- bit.CBCx: Cycle-by-Cycle 트립 소스.
- bit.OSHTx: One-Shot 트립 소스.
3. CMPASS 설정 절차
CMPASS를 ePWM과 연동하여 설정하는 단계는 다음과 같습니다:
- 시스템 초기화:
- InitSysCtrl()로 시스템 클럭 및 PLL 초기화.
- 인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable).
- CMPASS 클럭 활성화:
- CpuSysRegs.PCLKCR8.bit.CMPSSx로 CMPSS 모듈 클럭 활성화.
- EALLOW와 EDIS로 보호된 레지스터 접근.
- 비교기 설정:
- COMPCTL.bit.COMPEN으로 비교기 활성화.
- COMPCTL.bit.COMPSEL으로 입력 소스 선택.
- DACVAL로 기준 전압 설정.
- 디지털 비교기 설정:
- DCTRIPSEL.bit.DCAHSEL로 비교기 출력 선택.
- TZDCSEL.bit.DCAEVT1로 디지털 비교 이벤트 설정.
- 트립 존 연동:
- TZSEL.bit.CBCx로 CMPSS 출력을 트립 존 소스로 선택.
- TZCTL.bit.TZA로 트립 이벤트 동작 설정.
- ePWM 설정:
- TBCTL, CMPA, AQCTLA로 PWM 신호 설정.
- TBCTL.bit.FREE_SOFT = 2로 Free Run 모드 활성화.
- 인터럽트 설정(선택 사항):
- TZEINT.bit.CBC로 트립 존 인터럽트 활성화.
- PIE 및 CPU 인터럽트 벡터 설정.
4. CMPASS 설정 고려사항
- 입력 신호: CMPSS 입력 핀(예: CMP1A)에 전류 센서 또는 전압 분배기 연결.
- DAC 기준 전압: 내부 DAC(10비트, 0~3.3V)로 기준 전압 설정.
- 트립 조건: 과전류 시 CMPSS 출력이 High일 때 트립 이벤트 발생.
- 필터링: COMPDACCTL.bit.DCFILTEN으로 입력 노이즈 감소.
- 동기화: 다중 CMPSS 모듈 사용 시 동기화 고려.
5. CMPASS 예제 코드 (Bitfield 구조)
아래는 TMS320F28377D에서 CMPASS와 ePWM을 연동한 세 가지 예제 코드입니다. 각 코드는 Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.
5.1 예제 1: CMPASS를 이용한 과전류 보호
// File: epwm_cmpss_trip.c
// Description: TMS320F28377D ePWM CMPASS 기반 과전류 보호 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
// 인터럽트 서비스 루틴 (트립 존 이벤트)
__interrupt void tz1_isr(void)
{
// 트립 이벤트 처리 (LED 토글)
GpioDataRegs.GPBTOGGLE.bit.GPIO31 = 1;
// 트립 플래그 클리어
EPwm1Regs.TZCLR.bit.CBC = 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.TZ1_INT = &tz1_isr; // 트립 존 인터럽트 벡터 설정
EDIS;
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // GPIO12를 CMP1A 입력으로 설정
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0; // GPIO12 입력 설정
EDIS;
// ePWM1 및 CMPSS1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
CpuSysRegs.PCLKCR8.bit.CMPSS1 = 1; // CMPSS1 모듈 클럭 활성화
EDIS;
// CMPSS1 설정 (Bitfield 사용)
EALLOW;
Cmpss1Regs.COMPCTL.bit.COMPEN = 1; // 비교기 활성화
Cmpss1Regs.COMPCTL.bit.COMPSEL = 0; // 양극 입력 선택 (CMP1A)
Cmpss1Regs.DACVAL.bit.DACVAL = 512; // 기준 전압 설정 (1.65V, 3.3V 기준 10비트 중간값)
Cmpss1Regs.COMPCTL.bit.COMPOE = 1; // 비교기 출력 활성화
EDIS;
// 디지털 비교기 설정
EALLOW;
Cmpss1Regs.DCTRIPSEL.bit.DCAHSEL = 1; // CMP1_OUT을 DCAH로 선택
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 1; // DCAEVT1 활성화 (CMP1_OUT High)
EDIS;
// ePWM1 트립 존 설정
EALLOW;
EPwm1Regs.TZSEL.bit.DCAEVT1 = 1; // DCAEVT1을 Cycle-by-Cycle 트립 소스로 선택
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // 트립 시 PWM_A를 Low로 강제
EPwm1Regs.TZEINT.bit.CBC = 1; // Cycle-by-Cycle 인터럽트 활성화
PieCtrlRegs.PIEIER2.bit.INTx1 = 1; // PIE 그룹 2, TZ1 인터럽트 활성화
IER |= M_INT2; // CPU 인터럽트 2 활성화
EDIS;
// 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
EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
EINT; // 글로벌 인터럽트 활성화
for(;;); // 무한 루프
}
설명:
- 기능: CMPSS1을 사용하여 GPIO12(CMP1A)에 입력된 아날로그 신호를 기준 전압(1.65V)과 비교, 과전류 발생 시 ePWM1A 출력을 차단하고 트립 존 인터럽트를 통해 LED를 토글.
- 설정:
- CMPSS1: 비교기 활성화, CMP1A 입력, DAC 기준 전압 1.65V.
- 트립 존: CMP1_OUT을 DCAEVT1로 연결, 트립 시 PWM_A Low.
- ePWM1: 100kHz, 50% 듀티, 업 카운트 모드.
- 인터럽트: 트립 존 이벤트(CBC)에서 인터럽트 발생.
- GPIO: GPIO0(ePWM1A), GPIO12(CMP1A 입력), GPIO31(LED).
- 출력: 정상 동작 시 GPIO0에 PWM 신호 출력, CMP1A 입력이 1.65V 초과 시 PWM 출력 차단 및 LED 토글.
5.2 예제 2: CMPASS와 ADC 트리거 연동
// File: epwm_cmpss_adc_trigger.c
// Description: TMS320F28377D ePWM CMPASS 기반 ADC 트리거 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
// 인터럽트 서비스 루틴 (ADC 트리거)
__interrupt void adc1_isr(void)
{
// ADC 결과 읽기 및 LED 토글
Uint16 adc_result = AdcARegs.ADCRESULT0;
GpioDataRegs.GPBTOGGLE.bit.GPIO31 = 1;
// ADC 인터럽트 플래그 클리어
AdcARegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void main(void)
{
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
InitAdc(); // ADC 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// 인터럽트 벡터 설정
EALLOW;
PieVectTable.ADCINT1_1 = &adc1_isr; // ADC 인터럽트 벡터 설정
EDIS;
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // GPIO12를 CMP1A 입력으로 설정
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0; // GPIO12 입력 설정
GpioCtrlRegs.ADCCTL1.bit.INTPULSEPOS = 1; // ADC 인터럽트 펄스 위치
EDIS;
// ePWM1 및 CMPSS1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
CpuSysRegs.PCLKCR8.bit.CMPSS1 = 1; // CMPSS1 모듈 클럭 활성화
CpuSysRegs.PCLKCR0.bit.ADC_A = 1; // ADC_A 모듈 클럭 활성화
EDIS;
// ADC 설정
EALLOW;
AdcARegs.ADCCTL2.bit.PRESCALE = 6; // ADC 클럭 분주비 설정
AdcARegs.ADCINTSEL1N2.bit.INT1SEL = 0; // ADCINT1 소스 선택 (SOC0)
AdcARegs.ADCINTSEL1N2.bit.INT1E = 1; // ADCINT1 활성화
AdcARegs.ADCSOC0CTL.bit.CHSEL = 0; // ADC 채널 A0 선택
AdcARegs.ADCSOC0CTL.bit.ACQPS = 15; // 샘플링 윈도우
AdcARegs.ADCSOC0CTL.bit.TRIGSEL = 5; // ePWM1 SOCA 트리거
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // PIE 그룹 1, ADCINT1 활성화
IER |= M_INT1; // CPU 인터럽트 1 활성화
EDIS;
// CMPSS1 설정 (Bitfield 사용)
EALLOW;
Cmpss1Regs.COMPCTL.bit.COMPEN = 1; // 비교기 활성화
Cmpss1Regs.COMPCTL.bit.COMPSEL = 0; // 양극 입력 선택 (CMP1A)
Cmpss1Regs.DACVAL.bit.DACVAL = 512; // 기준 전압 설정 (1.65V)
Cmpss1Regs.COMPCTL.bit.COMPOE = 1; // 비교기 출력 활성화
Cmpss1Regs.COMPDACCTL.bit.DCFILTEN = 1; // 디지털 필터 활성화
EDIS;
// 디지털 비교기 설정
EALLOW;
Cmpss1Regs.DCTRIPSEL.bit.DCAHSEL = 1; // CMP1_OUT을 DCAH로 선택
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 1; // DCAEVT1 활성화
EDIS;
// 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
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // SOCA 활성화
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // TBCTR=0일 때 SOCA 발생
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 첫 번째 이벤트에서 SOCA 발생
EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
EINT; // 글로벌 인터럽트 활성화
for(;;); // 무한 루프
}
설명:
- 기능: CMPSS1을 사용하여 GPIO12(CMP1A)에 입력된 아날로그 신호를 기준 전압(1.65V)과 비교, ePWM1의 SOCA 트리거를 통해 ADC 변환을 시작하고, ADC 인터럽트를 통해 결과를 읽어 LED를 토글.
- 설정:
- CMPSS1: 비교기 활성화, CMP1A 입력, DAC 기준 전압 1.65V, 디지털 필터 활성화.
- ePWM1: 100kHz, 50% 듀티, SOCA 트리거 활성화.
- ADC: 채널 A0, ePWM1 SOCA 트리거로 변환 시작.
- 인터럽트: ADCINT1 활성화.
- GPIO: GPIO0(ePWM1A), GPIO12(CMP1A 입력), GPIO31(LED).
- 출력: GPIO0에 PWM 신호 출력, CMP1A 입력에 따라 ADC 변환 후 LED 토글.
5.3 예제 3: CMPASS 기반 듀티 사이클 조정
// File: epwm_cmpss_duty_adjust.c
// Description: TMS320F28377D ePWM CMPASS 기반 듀티 사이클 조정 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
volatile Uint16 duty = 1000; // 초기 듀티 50%
// 인터럽트 서비스 루틴 (CMPSS 이벤트)
__interrupt void tz1_isr(void)
{
// CMPSS 출력에 따라 듀티 사이클 조정
if (Cmpss1Regs.COMPSTS.bit.COMPSTS == 1) // 입력 > 기준 전압
{
duty = 500; // 25% 듀티
}
else
{
duty = 1500; // 75% 듀티
}
EPwm1Regs.CMPA.bit.CMPA = duty;
// 트립 플래그 클리어
EPwm1Regs.TZCLR.bit.CBC = 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.TZ1_INT = &tz1_isr; // 트립 존 인터럽트 벡터 설정
EDIS;
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // GPIO12를 CMP1A 입력으로 설정
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0; // GPIO12 입력 설정
EDIS;
// ePWM1 및 CMPSS1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
CpuSysRegs.PCLKCR8.bit.CMPSS1 = 1; // CMPSS1 모듈 클럭 활성화
EDIS;
// CMPSS1 설정 (Bitfield 사용)
EALLOW;
Cmpss1Regs.COMPCTL.bit.COMPEN = 1; // 비교기 활성화
Cmpss1Regs.COMPCTL.bit.COMPSEL = 0; // 양극 입력 선택 (CMP1A)
Cmpss1Regs.DACVAL.bit.DACVAL = 512; // 기준 전압 설정 (1.65V)
Cmpss1Regs.COMPCTL.bit.COMPOE = 1; // 비교기 출력 활성화
Cmpss1Regs.COMPDACCTL.bit.DCFILTEN = 1; // 디지털 필터 활성화
EDIS;
// 디지털 비교기 설정
EALLOW;
Cmpss1Regs.DCTRIPSEL.bit.DCAHSEL = 1; // CMP1_OUT을 DCAH로 선택
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 1; // DCAEVT1 활성화
EDIS;
// ePWM1 트립 존 설정
EALLOW;
EPwm1Regs.TZSEL.bit.DCAEVT1 = 1; // DCAEVT1을 Cycle-by-Cycle 트립 소스로 선택
EPwm1Regs.TZEINT.bit.CBC = 1; // Cycle-by-Cycle 인터럽트 활성화
PieCtrlRegs.PIEIER2.bit.INTx1 = 1; // PIE 그룹 2, TZ1 인터럽트 활성화
IER |= M_INT2; // CPU 인터럽트 2 활성화
EDIS;
// 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 = duty; // 초기 50% 듀티
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
EINT; // 글로벌 인터럽트 활성화
for(;;); // 무한 루프
}
설명:
- 기능: CMPSS1을 사용하여 GPIO12(CMP1A)에 입력된 아날로그 신호를 기준 전압(1.65V)과 비교, 입력 전압에 따라 ePWM1A의 듀티 사이클을 25% 또는 75%로 동적 조정.
- 설정:
- CMPSS1: 비교기 활성화, CMP1A 입력, DAC 기준 전압 1.65V, 디지털 필터 활성화.
- ePWM1: 100kHz, 초기 50% 듀티, 업 카운트 모드.
- 인터럽트: CMPSS 출력에 따라 듀티 사이클 조정.
- GPIO: GPIO0(ePWM1A), GPIO12(CMP1A 입력), GPIO31(LED).
- 출력: GPIO0에 PWM 신호 출력, CMP1A 입력에 따라 듀티 사이클 25% 또는 75%로 전환, 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 하드웨어 준비
- PWM 출력: GPIO0(ePWM1A)에 오실로스코프 연결.
- CMPSS 입력: GPIO12(CMP1A)에 전류 센서 또는 아날로그 신호(0~3.3V) 연결.
- LED: GPIO31에 LED 연결.
- 테스트:
- 예제 1: CMP1A에 1.65V 초과 신호 입력 시 PWM 출력 차단 확인.
- 예제 2: ADC 변환 결과 및 LED 토글 확인.
- 예제 3: CMP1A 입력 변화에 따른 듀티 사이클 변화 확인.
6.4 디버깅
- CCS Expressions 창: EPwm1Regs.TBCTR, EPwm1Regs.CMPA, Cmpss1Regs.COMPSTS 확인.
- 트립 상태: EPwm1Regs.TZFLG로 트립 이벤트 점검.
- 레지스터 모니터링: Cmpss1Regs.COMPCTL, EPwm1Regs.TZCTL, AdcARegs.ADCRESULT0 확인.
7. 추가 팁
- DAC 기준 전압 조정: DACVAL 값을 변경하여 트립 임계값 조정.
- 필터링: COMPDACCTL.bit.DCFILTEN 활성화로 입력 노이즈 감소.
- C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\cmpss.
- 문제 해결:
- PWM 출력 문제: TBCTL, AQCTLA, TZSEL 설정 확인.
- 트립 이벤트 미발생: Cmpss1Regs.COMPSTS, DCTRIPSEL 확인.
- ADC/인터럽트 실패: ETSEL, PIEIER, IER 설정 확인.
- TI 리소스: TI E2E 포럼, C2000Ware CMPSS 예제.
8. 결론
이 문서는 TMS320F28377D의 CMPASS와 ePWM을 연동하여 과전류 보호, ADC 트리거, 듀티 사이클 조정을 구현하는 방법을 Bitfield 구조 기반 예제 코드로 설명했습니다. 이 코드는 모터 제어, 전력 변환 등 다양한 애플리케이션에 활용 가능합니다.
키워드: TMS320F28377D, ePWM, CMPASS, C2000, 과전류 보호, ADC 트리거, 듀티 사이클 조정, Bitfield, Code Composer Studio, 아날로그 비교기, 디지털 비교기
'MCU > C2000' 카테고리의 다른 글
[TMS320F28377D] FPU, TMU, VCU-II 사용법 : 예제 코드 및 활용 가이드 (1) | 2025.08.18 |
---|---|
[TMS320F28377D] DAC 및 Fault Trip Zones 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] USB, I2C, McBSP, uPP 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] SDFM 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
[TMS320F28377D] SPI 사용법 : Bitfield 구조 활용 예제 코드 (2) | 2025.08.18 |
[TMS320F28377D] DMA 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] CLA 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
[TMS320F28377D] CPU1, CPU2 멀티코어 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |