본문 바로가기
임베디드 개발/TMS320F2838x (C28x)

TMS320F28388D ] eCAP으로 ePWM 신호 Period와 Duty Cycle 측정

by eteo 2023. 8. 14.

특정 주파수, 듀티사이클의 PWM신호를 생성하고 eCAP으로 PWM신호 측정

 

 

 

 

PWM 설정

 

ePWM의 TBCLK(Time Base Clock)은 아래 공식으로 설정하는데 prescale 값은 둘 다 1로 한다.

 

TBCLK = EPWMCLK/(HSPCLKDIV * CLKDIV)

 

Period를 25000으로 설정하고, Counter Mode는 up-down으로 한다.

 

카운터가 up-dwon 모드일 때 PWM 파형의 주파수는 TBCLK/(2*period)인데 EPWMCLK는 따로 클락설정이 없으면 디폴트가 SYSCLK/2여서 100MHz니까 100,000,000 / 50,000 = 2kHz가 된다.

 

 

 

 

 

Counter Compare 값은 18750으로 설정.

 

 

 

카운터 업 시 COMPA와 일치할 때 output pin High 출력, 카운터 다운 시 COMPA와 일치할 때 output pin Low 출력으로 설정

 

 

출력핀 GPIO0 설정

 

 

이렇게하면 GPIO0 핀으로 25% duty cycle의 2kHz PWM 파형이 출력된다.

 

 

 

 

 

 

eCAP & INPUTXBAR 설정

 

GPIO0핀의 출력파형을 INPUTXBAR 설정을 통해 eCAP으로 측정한다.

 

 

 

 

 

 

 

#include "driverlib.h"
#include "device.h"
#include "board.h"

uint32_t ePwm_TimeBase;
uint32_t ePwm_curDuty;

int32_t eCapPwmDuty;
int32_t eCapPwmPeriod;

__interrupt void ecap1ISR(void)
{
    Interrupt_clearACKGroup(INT_myECAP0_INTERRUPT_ACK_GROUP);
    ECAP_clearGlobalInterrupt(myECAP0_BASE);
    ECAP_clearInterrupt(myECAP0_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_3);
    eCapPwmDuty = (int32_t)ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_2) -
                  (int32_t)ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_1);
    eCapPwmPeriod = (int32_t)ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_3) -
                    (int32_t)ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_1);
}

void main(void)
{
    Device_init();
    Interrupt_initModule();
    Interrupt_initVectorTable();

    Board_init();

    ePwm_TimeBase = EPWM_getTimeBasePeriod(myEPWM0_BASE);
    ePwm_curDuty = EPWM_getCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_A);

    EINT;
    ERTM;

    for (;;) {
    }
}

 

 

 

eCAP의 base 클락은 EPWMCLK와 달리 200MHz이니 아래의 공식으로 측정한 PWM 파형의 Frequency와 DutyCycle을 구할 수 있다.

 

Frequency = DEVICE_SYSCLK_FREQ/eCapPwmPeriod = 200,000,000 / 100,000 = 2kHz

 

Duty Percent = (eCapPwmDuty/eCapPwmPeriod)*100 = 25,000 / 100,000 * 100 = 25%