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.

TMS320F280039C: Noise on AIOs

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!