[TMS320F28027 EVM] eCAP 테스트 - 펄스폭 측정
C28xx 시리즈(TMS320F2808, TMS320F28027, TMS320F28335.. 등)는 eCAP(Enhanced Capture) 모듈이 있어 입력 신호의 펄스폭을 정밀하게, 그리고 쉽게 측정 할수 있다.
TMS210F28027에는 한포트의 eCAP핀이 있고 아래와 같다. GPIO5, GPIO19 중 하나를 선택해서 설정가능하다.)
GPIO5/EPWM3B/ECAP1
GPIO19/XCLKIN/ /SCIRXDA/ECAP1SPISTEA
eCAP의 Capture모드 구조는 아래와 같고 4개의 32비트 캡쳐 레지스터로 이벤트(폴링, 라이징 에지)의 시간을 캡쳐 할 수 있다.
좀더 자세하게 들여다 보면 아래 구조와 같고 입력신호의 분주도 가능하다.
eCAP Delta Mode 예제 - 펄스폭 측정
초기화 코드
절대 시간 측정 예제
TMS320F28027 eCAP 테스트 결과
TMS320F28027의 eCAP 모듈을 테스트 하기 위해 LED2(GPIO1)을 타이머를 이용하여 일정 주기로 펄스를 출력하고 그 주기를 측정하여 LCD에 출력하는 예제로 작성해 보았다. 출력은 [Serial LCD Module] 를 이용하여 시리얼 출력으로 표시 할 수 있도록 했다.
TMS320F28027 eCAP테스트 예제 소스 코드
UART출력
280x eCAP Test
DutyOnTime(9000) = 150.0us
DutyOnTime(9000) = 150.0us
DutyOnTime(9000) = 150.0us
DutyOnTime(9000) = 150.0us
DutyOnTime(9000) = 150.0us
C28xx 시리즈(TMS320F2808, TMS320F28027, TMS320F28335.. 등)는 eCAP(Enhanced Capture) 모듈이 있어 입력 신호의 펄스폭을 정밀하게, 그리고 쉽게 측정 할수 있다.
TMS210F28027에는 한포트의 eCAP핀이 있고 아래와 같다. GPIO5, GPIO19 중 하나를 선택해서 설정가능하다.)
GPIO5/EPWM3B/ECAP1
GPIO19/XCLKIN/ /SCIRXDA/ECAP1SPISTEA
eCAP의 Capture모드 구조는 아래와 같고 4개의 32비트 캡쳐 레지스터로 이벤트(폴링, 라이징 에지)의 시간을 캡쳐 할 수 있다.
좀더 자세하게 들여다 보면 아래 구조와 같고 입력신호의 분주도 가능하다.
eCAP Delta Mode 예제 - 펄스폭 측정
초기화 코드
// Code snippet for CAP mode Delta Time, Rising and Falling edge triggers
//=======================
// ECAP 초기화
ECap1Regs.ECEINT.all = 0x0000; // Disable all capture interrupts
ECap1Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags
ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // Allow TSCTR to run
// Run Time ( e.g. CEVT1 triggered ISR call)
//==========================================
// Note: here Time-stamp directly represents the Duty cycle values.
DutyOnTime1 = ECap1Regs.CAP2; // Fetch Time-Stamp captured at T2
DutyOffTime1= ECap1Regs.CAP3; // Fetch Time-Stamp captured at T3
DutyOnTime2 = ECap1Regs.CAP4; // Fetch Time-Stamp captured at T4
DutyOffTime2 = ECap1Regs.CAP1; // Fetch Time-Stamp captured at T1
Period1 =DutyOnTime1 + DutyOffTime1;
Period2 = DutyOnTime2 + DutyOffTime2;
//=======================
// ECAP 초기화
ECap1Regs.ECEINT.all = 0x0000; // Disable all capture interrupts
ECap1Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags
ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // Allow TSCTR to run
// Run Time ( e.g. CEVT1 triggered ISR call)
//==========================================
// Note: here Time-stamp directly represents the Duty cycle values.
DutyOnTime1 = ECap1Regs.CAP2; // Fetch Time-Stamp captured at T2
DutyOffTime1= ECap1Regs.CAP3; // Fetch Time-Stamp captured at T3
DutyOnTime2 = ECap1Regs.CAP4; // Fetch Time-Stamp captured at T4
DutyOffTime2 = ECap1Regs.CAP1; // Fetch Time-Stamp captured at T1
Period1 =DutyOnTime1 + DutyOffTime1;
Period2 = DutyOnTime2 + DutyOffTime2;
절대 시간 측정 예제
// Code snippet for CAP mode Absolute Time, Rising edge trigger
// Initialization Time
//=======================
// ECAP module 1 config
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // Allow TSCTR to run
// Run Time ( e.g. CEVT4 triggered ISR call)
//==========================================
TSt1 = ECap1Regs.CAP1; // Fetch Time-Stamp captured at t1
TSt2 = ECap1Regs.CAP2; // Fetch Time-Stamp captured at t2
TSt3 = ECap1Regs.CAP3; // Fetch Time-Stamp captured at t3
TSt4 = ECap1Regs.CAP4; // Fetch Time-Stamp captured at t4
Period1 = TSt2-TSt1; // Calculate 1st period
Period2 = TSt3-TSt2; // Calculate 2nd period
Period3 = TSt4-TSt3; // Calculate 3rd period
// Initialization Time
//=======================
// ECAP module 1 config
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // Allow TSCTR to run
// Run Time ( e.g. CEVT4 triggered ISR call)
//==========================================
TSt1 = ECap1Regs.CAP1; // Fetch Time-Stamp captured at t1
TSt2 = ECap1Regs.CAP2; // Fetch Time-Stamp captured at t2
TSt3 = ECap1Regs.CAP3; // Fetch Time-Stamp captured at t3
TSt4 = ECap1Regs.CAP4; // Fetch Time-Stamp captured at t4
Period1 = TSt2-TSt1; // Calculate 1st period
Period2 = TSt3-TSt2; // Calculate 2nd period
Period3 = TSt4-TSt3; // Calculate 3rd period
TMS320F28027 eCAP 테스트 결과
TMS320F28027의 eCAP 모듈을 테스트 하기 위해 LED2(GPIO1)을 타이머를 이용하여 일정 주기로 펄스를 출력하고 그 주기를 측정하여 LCD에 출력하는 예제로 작성해 보았다. 출력은 [Serial LCD Module] 를 이용하여 시리얼 출력으로 표시 할 수 있도록 했다.
TMS320F28027 eCAP테스트 예제 소스 코드
void main(void)
{
unsigned int cnt = 0;
//DSP System Initialize
SystemInit();
DebugInit(BAUD_9600);
DebugPrint("280x eCAP Test\r");
//LED Initialize
Led1Init();
Led1Off();
Led2Init();
Led2Off();
//eCAP초기화
InitECapture();
//타이 인터럽트 초기화
Timer0Init();
// Enable global Interrupts
enalbe()
while(1)
{
DebugPrint("D=%ldus\r", DutyOnTime1/TIME_TICK_PERIOD);
Delay(30);
}
}
//eCAP Interrupt handler
interrupt void ecap1_isr(void)
{
Led1Toggle();
DutyOnTime1 = ECap1Regs.CAP2; // Fetch Time-Stamp captured at T2
DutyOffTime1= ECap1Regs.CAP3; // Fetch Time-Stamp captured at T3
DutyOnTime2 = ECap1Regs.CAP4; // Fetch Time-Stamp captured at T4
DutyOffTime2 = ECap1Regs.CAP1; // Fetch Time-Stamp captured at T1
Period1 =DutyOnTime1 + DutyOffTime1;
Period2 = DutyOnTime2 + DutyOffTime2;
ECap1Regs.ECCLR.bit.CEVT4 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
ECap1Regs.ECCTL2.bit.REARM = 1;
// Acknowledge this interrupt to receive more interrupts from group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}
{
unsigned int cnt = 0;
//DSP System Initialize
SystemInit();
DebugInit(BAUD_9600);
DebugPrint("280x eCAP Test\r");
//LED Initialize
Led1Init();
Led1Off();
Led2Init();
Led2Off();
//eCAP초기화
InitECapture();
//타이 인터럽트 초기화
Timer0Init();
// Enable global Interrupts
enalbe()
while(1)
{
DebugPrint("D=%ldus\r", DutyOnTime1/TIME_TICK_PERIOD);
Delay(30);
}
}
//eCAP Interrupt handler
interrupt void ecap1_isr(void)
{
Led1Toggle();
DutyOnTime1 = ECap1Regs.CAP2; // Fetch Time-Stamp captured at T2
DutyOffTime1= ECap1Regs.CAP3; // Fetch Time-Stamp captured at T3
DutyOnTime2 = ECap1Regs.CAP4; // Fetch Time-Stamp captured at T4
DutyOffTime2 = ECap1Regs.CAP1; // Fetch Time-Stamp captured at T1
Period1 =DutyOnTime1 + DutyOffTime1;
Period2 = DutyOnTime2 + DutyOffTime2;
ECap1Regs.ECCLR.bit.CEVT4 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
ECap1Regs.ECCTL2.bit.REARM = 1;
// Acknowledge this interrupt to receive more interrupts from group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}
UART출력
280x eCAP Test
DutyOnTime(9000) = 150.0us
DutyOnTime(9000) = 150.0us
DutyOnTime(9000) = 150.0us
DutyOnTime(9000) = 150.0us
DutyOnTime(9000) = 150.0us
반응형