The TI E2E™ design support forums will undergo maintenance from July 11 to July 13. If you need design support during this time, open a new support request with our customer support center.

This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28069M: MotorWare TZ interrupt trigger only once!

Part Number: TMS320F28069M
Other Parts Discussed in Thread: C2000WARE

Tool/software:

Can someone help me figure out an issue with interrupts? According to the task, the interrupt is supposed to trigger only once. I don't think I missed anything, but it's not working.

in hal.c

void HAL_enablePwmTzInt(HAL_Handle handle, const PWM_Number_e pwmNumber) {
    HAL_Obj *obj = (HAL_Obj *)handle;

    // Enable Trip Zone interrupt
    PWM_enableTripZoneInt(obj->pwmHandle[pwmNumber], PWM_TripZoneFlag_CBC | PWM_TripZoneFlag_OST);
    PIE_enablePwmTzInt(obj->pieHandle, pwmNumber);
    // CPU_enableInt(obj->cpuHandle, CPU_IntNumber_2);

    return;
}

in hal.h

extern __interrupt void TripZoneISR(void);

static inline void HAL_initIntVectorTable(HAL_Handle handle) {
    HAL_Obj *obj = (HAL_Obj *)handle;
    PIE_Obj *pie = (PIE_Obj *)obj->pieHandle;
.....

    pie->EPWM1_TZINT = &TripZoneISR;    // Interrupt for EPWM1 Trip Zone
    pie->EPWM2_TZINT = &TripZoneISR;    // Interrupt for EPWM2 Trip Zone
    pie->EPWM3_TZINT = &TripZoneISR;    // Interrupt for EPWM3 Trip Zone
....    
static inline void HAL_enablePwm(HAL_Handle handle) {
    HAL_Obj *obj = (HAL_Obj *)handle;

    PWM_clearOneShotTrip(obj->pwmHandle[PWM_Number_1]);
    PWM_clearOneShotTrip(obj->pwmHandle[PWM_Number_2]);
    PWM_clearOneShotTrip(obj->pwmHandle[PWM_Number_3]);

// #ifndef TZ_DISABLE
    PWM_clearTripZone(obj->pwmHandle[PWM_Number_1], PWM_TripZoneFlag_Global);
    PWM_clearTripZone(obj->pwmHandle[PWM_Number_2], PWM_TripZoneFlag_Global);
    PWM_clearTripZone(obj->pwmHandle[PWM_Number_3], PWM_TripZoneFlag_Global);

    PIE_enablePwmTzInt(obj->pieHandle, PWM_Number_1);
    PIE_enablePwmTzInt(obj->pieHandle, PWM_Number_2);
    PIE_enablePwmTzInt(obj->pieHandle, PWM_Number_3); //6
// #endif

    return;
}    // end of HAL_enablePwm() function

in main

    HAL_enablePwmTzInt(halHandle, PWM_Number_1);
    HAL_enablePwmTzInt(halHandle, PWM_Number_2);
    HAL_enablePwmTzInt(halHandle, PWM_Number_3);
    CPU_enableInt(halHandle->cpuHandle, CPU_IntNumber_2); // Added to enable global CPU interrupt for Trip Zone

__interrupt void TripZoneISR(void) {
    // Get a pointer to the global HAL structure
    HAL_Obj *obj = (HAL_Obj *)halHandle;

    // Iterate through all PWM channels (EPWM1, EPWM2, EPWM3)
    for (int cnt = 0; cnt < 3; cnt++) {
        PWM_Obj *pwm = (PWM_Obj *)obj->pwmHandle[cnt];

        // Clear INT, CBC and OST flags directly. 
        pwm->TZCLR |= (PWM_TripZoneFlag_Global | PWM_TripZoneFlag_CBC | PWM_TripZoneFlag_OST);

        // Increment fault counters for logging or diagnostics
        TzCnt[cnt].CBC++;
        TzCnt[cnt].OST++;

        // Optionally, set a global fault flag or perform further actions
        gMotorVars.Flag_nFault = true;
    }

    // Clear PIE interrupt flag
    PIE_clearInt(obj->pieHandle, PIE_GroupNumber_2);

    // End ISR
    return;
}

Thanks for your help.

Andrew.