请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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。