Part Number: TMS320F280039C
Hello,
I have 3 AIOs I have set up to trigger interrupts XINT1, XINT2, XINT3 when I see an overcurrent on phase A, B, C. A triggers XINT1, B triggers XINT2, C triggers XINT3. Sometimes when I open my motor contactor I see XINT3 getting triggered meaning I have an overcurrent on phase C. However, looking at the oscilloscope there is no high current so it seems XINT3 should not be triggering. Is there a way to better protect the GPIO interrupts from noise.
Do I have the AIO configured correctly?
This is my AIO configuration:
#define AIO240_LEGCOC 240
#define AIO227_LEGBOC 227
#define AIO236_LEGAOC 236
Interrupt_register(INT_XINT1, &xint1ISR);
Interrupt_register(INT_XINT2, &xint2ISR);
Interrupt_register(INT_XINT3, &xint3ISR);
Interrupt_enable(INT_XINT1);
Interrupt_enable(INT_XINT2);
Interrupt_enable(INT_XINT3);
// AIO240 -> Leg C over current, 0 = over current
GPIO_setPinConfig(GPIO_240_GPIO240);
GPIO_setAnalogMode(AIO240_LEGCOC, GPIO_ANALOG_DISABLED);
GPIO_setDirectionMode(AIO240_LEGCOC, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(AIO240_LEGCOC, GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(AIO240_LEGCOC, GPIO_CORE_CPU1);
GPIO_setQualificationMode(AIO240_LEGCOC, GPIO_QUAL_SYNC);
// AIO227 -> Leg B over current, 0 = over current
GPIO_setPinConfig(GPIO_227_GPIO227);
GPIO_setAnalogMode(AIO227_LEGBOC, GPIO_ANALOG_DISABLED);
GPIO_setDirectionMode(AIO227_LEGBOC, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(AIO227_LEGBOC, GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(AIO227_LEGBOC, GPIO_CORE_CPU1);
GPIO_setQualificationMode(AIO227_LEGBOC, GPIO_QUAL_SYNC);
// AIO236 -> Leg A over current, 0 = over current
GPIO_setPinConfig(GPIO_236_GPIO236);
GPIO_setAnalogMode(AIO236_LEGAOC, GPIO_ANALOG_DISABLED);
GPIO_setDirectionMode(AIO236_LEGAOC, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(AIO236_LEGAOC, GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(AIO236_LEGAOC, GPIO_CORE_CPU1);
GPIO_setQualificationMode(AIO236_LEGAOC, GPIO_QUAL_SYNC);
// Only setting up interrupts for LEG ABC for now - total of 5 interrupts we can use
GPIO_setInterruptPin(AIO236_LEGAOC, GPIO_INT_XINT1);
GPIO_setInterruptPin(AIO227_LEGBOC, GPIO_INT_XINT2);
GPIO_setInterruptPin(AIO240_LEGCOC, GPIO_INT_XINT3);
GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_FALLING_EDGE);
GPIO_setInterruptType(GPIO_INT_XINT2, GPIO_INT_TYPE_FALLING_EDGE);
GPIO_setInterruptType(GPIO_INT_XINT3, GPIO_INT_TYPE_FALLING_EDGE);
GPIO_enableInterrupt(GPIO_INT_XINT1);
GPIO_enableInterrupt(GPIO_INT_XINT2);
GPIO_enableInterrupt(GPIO_INT_XINT3);
These are my ISRs:
void XInt1_ISRHandler(GE_Secondary_Container_t *pContainer)
{
// Set Fault State
GE_Fault_Set(pContainer, GE_FAULT_MOTOR_OVER_CURRENT_PROTECTION_TRIP_PHASE_A);
// Shut gate driver off - we've seen IOC
GE_DIO_WriteGPIO_GateDriverReset(0);
}
void XInt2_ISRHandler(GE_Secondary_Container_t *pContainer)
{
// Set Fault State
GE_Fault_Set(pContainer, GE_FAULT_MOTOR_OVER_CURRENT_PROTECTION_TRIP_PHASE_B);
// Shut gate driver off - we've seen IOC
GE_DIO_WriteGPIO_GateDriverReset(0);
}
void XInt3_ISRHandler(GE_Secondary_Container_t *pContainer)
{
// Set Fault State
GE_Fault_Set(pContainer, GE_FAULT_MOTOR_OVER_CURRENT_PROTECTION_TRIP_PHASE_C);
// Shut gate driver off - we've seen IOC
GE_DIO_WriteGPIO_GateDriverReset(0);
}
// GPIO ISRs
// xint1ISR - XINT1 ISR
__interrupt void xint1ISR(void)
{
// Run ISR Handler
XInt1_ISRHandler(&gContainer);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
// xint2ISR - XINT2 ISR
__interrupt void xint2ISR(void)
{
// Run ISR Handler
XInt2_ISRHandler(&gContainer);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
// xint3ISR - XINT3 ISR
__interrupt void xint3ISR(void)
{
// Run ISR Handler
XInt3_ISRHandler(&gContainer);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP12);
}
Thanks for the help!

