임베디드 개발/TMS320F2838x (C28x)

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

eteo 2023. 8. 14. 14:56

특정 주파수, 듀티사이클의 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%