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 中断触发一次!

Guru**** 2484615 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1442459/tms320f28069m-motorware-tz-interrupt-trigger-only-once

器件型号:TMS320F28069M
Thread 中讨论的其他器件:C2000WARE

工具与软件:

有人能帮我解决中断问题吗? 根据任务、中断应该只触发一次。 我不认为我漏掉了任何东西、但它无法正常工作。

显示于 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;
}

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

结束

    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;
}

感谢您的帮助。

Andrew。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请看一下 C2000Ware 中的 TZ 示例。 您可能需要在其 ISR 中清除 TZ 标志和 TZ 中断标志。