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.

TMS320F280049C: TMS320F280049C

Part Number: TMS320F280049C
Other Parts Discussed in Thread: C2000WARE, TMDSHVMTRINSPIN

Hello,

I'm using "C2000Ware_MotorControl_SDK_2_01_00_00_setup" for my project and in that i'm using the "\ti\c2000\C2000Ware_MotorControl_SDK_2_01_00_00\solutions\tmdshvmtrinspin/is13_fwc_mtpa" folder as a reference.

I have created "TIMER0 ISR" and the "MAIN ISR" function which is already available is been interrupted by the ADC-C1 interrupt.

When i make the change in the "HAL_setupADCs(HAL_Handle handle)" function as per my requirement, then the  "MAIN ISR" interrupt is not generated but the "TIMER0 ISR" is genrated.

But when i don't make any change in the  "HAL_setupADCs(HAL_Handle handle)"  then i able to generate both the interrupt "MAIN ISR and TIMER0 ISR".

For more information, PFD below.

==================================================================================================================

CODE WITH MY CHANGE: [In this only TIMER0 ISR is generated].

void HAL_setupADCs(HAL_Handle handle)
{
  HAL_Obj *obj = (HAL_Obj *)handle;
  SysCtl_delay(100U);
  ADC_setVREF(obj->adcHandle[2], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
  ADC_setVREF(obj->adcHandle[1], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
  ADC_setVREF(obj->adcHandle[0], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
  SysCtl_delay(100U);
  // Configure internal reference as 1.65*2 = 3.3
  ASysCtl_setAnalogReference1P65(ASYSCTL_VREFHIA |
                                 ASYSCTL_VREFHIB |
                                 ASYSCTL_VREFHIC);
  // Enable internal voltage reference
  ASysCtl_setAnalogReferenceInternal(ASYSCTL_VREFHIA |
                                     ASYSCTL_VREFHIB |
                                     ASYSCTL_VREFHIC);
  // Set main clock scaling factor (50MHz max clock for the ADC module)
  ADC_setPrescaler(obj->adcHandle[0], ADC_CLK_DIV_2_0);
  ADC_setPrescaler(obj->adcHandle[1], ADC_CLK_DIV_2_0);
  ADC_setPrescaler(obj->adcHandle[2], ADC_CLK_DIV_2_0);
  // set the ADC interrupt pulse generation to end of conversion
  ADC_setInterruptPulseMode(obj->adcHandle[0], ADC_PULSE_END_OF_CONV);
  ADC_setInterruptPulseMode(obj->adcHandle[1], ADC_PULSE_END_OF_CONV);
  ADC_setInterruptPulseMode(obj->adcHandle[2], ADC_PULSE_END_OF_CONV);
  // enable the ADCs
  ADC_enableConverter(obj->adcHandle[0]);
  ADC_enableConverter(obj->adcHandle[1]);
  ADC_enableConverter(obj->adcHandle[2]);
  // set priority of SOCs
  ADC_setSOCPriority(obj->adcHandle[0], ADC_PRI_ALL_HIPRI);
  ADC_setSOCPriority(obj->adcHandle[1], ADC_PRI_ALL_HIPRI);
  ADC_setSOCPriority(obj->adcHandle[2], ADC_PRI_ALL_HIPRI);
  // delay to allow ADCs to power up
  SysCtl_delay(1000U);
  // configure the interrupt sources
  // configure the ample window to 15 system clock cycle wide by assigning 14
  // to the ACQPS of ADCSOCxCTL Register.
  // RC2/C1
  ADC_setInterruptSource(obj->adcHandle[2], ADC_INT_NUMBER1, ADC_SOC_NUMBER2);
#ifdef MYCHANGE
  // configure the SOCs for hvkit_rev1p1
  // ISENSE1-FB - B2->RB0
  ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN2, HAL_ADC_SAMPLE_WINDOW);
  // ISENSE2-FB - B3->RB1
  ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN3, HAL_ADC_SAMPLE_WINDOW);
  // ISENSE3-FB - B6->RB2
  ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN6, HAL_ADC_SAMPLE_WINDOW);
  // ADC-Vhb1 - B1->RB3
  ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN1, HAL_ADC_SAMPLE_WINDOW);
  // ADC-Vhb2 - B4->RB4
  ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN4, HAL_ADC_SAMPLE_WINDOW);
  // ADC-Vhb3 - B8->RB5
  ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER5, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN8, HAL_ADC_SAMPLE_WINDOW);
  // VDCBUS - A0->RA0. hvkit board has capacitor on Vbus feedback, so
  // the sampling doesn't need to be very long to get an accurate value
  ADC_setupSOC(obj->adcHandle[0], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN0, HAL_ADC_SAMPLE_WINDOW);
  //A1->RA1
  ADC_setupSOC(obj->adcHandle[0], ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN1, HAL_ADC_SAMPLE_WINDOW);
  // C0->RC0
  ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN0, HAL_ADC_SAMPLE_WINDOW);
  // C4->RC4
  ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN4, HAL_ADC_SAMPLE_WINDOW);
  //C3->RC3
  ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN3, HAL_ADC_SAMPLE_WINDOW);
#else
  // configure the SOCs for hvkit_rev1p1
  // IA-FB - B3->RB0
  ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN3, HAL_ADC_SAMPLE_WINDOW);
  // IB-FB - C0->RC0
  ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN0, HAL_ADC_SAMPLE_WINDOW);
  // IC-FB - A3->RA0
  ADC_setupSOC(obj->adcHandle[0], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN3, HAL_ADC_SAMPLE_WINDOW);
  // ADC-Vhb1 - C2->RC1
  ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN2, HAL_ADC_SAMPLE_WINDOW);
  // ADC-Vhb2 - C1->RC2
  ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN1, HAL_ADC_SAMPLE_WINDOW);
  // ADC-Vhb3 - B4->RB1
  ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN4, HAL_ADC_SAMPLE_WINDOW);
  // VDCBUS - A9->RA1. hvkit board has capacitor on Vbus feedback, so
  // the sampling doesn't need to be very long to get an accurate value
  ADC_setupSOC(obj->adcHandle[0], ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
               ADC_CH_ADCIN9, HAL_ADC_SAMPLE_WINDOW);
#endif
  return;
} // end of HAL_setupADCs() function

================================================================================================================

CODE WITH NO CHANGE: [BOTH ISR are generated].

void HAL_setupADCs(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;

SysCtl_delay(100U);
ADC_setVREF(obj->adcHandle[2], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
ADC_setVREF(obj->adcHandle[1], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
ADC_setVREF(obj->adcHandle[0], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
SysCtl_delay(100U);

// Configure internal reference as 1.65*2 = 3.3
ASysCtl_setAnalogReference1P65(ASYSCTL_VREFHIA |
ASYSCTL_VREFHIB |
ASYSCTL_VREFHIC);

// Enable internal voltage reference
ASysCtl_setAnalogReferenceInternal(ASYSCTL_VREFHIA |
ASYSCTL_VREFHIB |
ASYSCTL_VREFHIC);

// Set main clock scaling factor (50MHz max clock for the ADC module)
ADC_setPrescaler(obj->adcHandle[0], ADC_CLK_DIV_2_0);
ADC_setPrescaler(obj->adcHandle[1], ADC_CLK_DIV_2_0);
ADC_setPrescaler(obj->adcHandle[2], ADC_CLK_DIV_2_0);

// set the ADC interrupt pulse generation to end of conversion
ADC_setInterruptPulseMode(obj->adcHandle[0], ADC_PULSE_END_OF_CONV);
ADC_setInterruptPulseMode(obj->adcHandle[1], ADC_PULSE_END_OF_CONV);
ADC_setInterruptPulseMode(obj->adcHandle[2], ADC_PULSE_END_OF_CONV);

// enable the ADCs
ADC_enableConverter(obj->adcHandle[0]);
ADC_enableConverter(obj->adcHandle[1]);
ADC_enableConverter(obj->adcHandle[2]);

// set priority of SOCs
ADC_setSOCPriority(obj->adcHandle[0], ADC_PRI_ALL_HIPRI);
ADC_setSOCPriority(obj->adcHandle[1], ADC_PRI_ALL_HIPRI);
ADC_setSOCPriority(obj->adcHandle[2], ADC_PRI_ALL_HIPRI);

// delay to allow ADCs to power up
SysCtl_delay(1000U);

// configure the interrupt sources
// configure the sample window to 15 system clock cycle wide by assigning 14
// to the ACQPS of ADCSOCxCTL Register.
// RC2/C1
ADC_setInterruptSource(obj->adcHandle[2], ADC_INT_NUMBER1, ADC_SOC_NUMBER2);

// configure the SOCs for hvkit_rev1p1
// IA-FB - B3->RB0
ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN3, HAL_ADC_SAMPLE_WINDOW);

// IB-FB - C0->RC0
ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN0, HAL_ADC_SAMPLE_WINDOW);

// IC-FB - A3->RA0
ADC_setupSOC(obj->adcHandle[0], ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN3, HAL_ADC_SAMPLE_WINDOW);

// ADC-Vhb1 - C2->RC1
ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN2, HAL_ADC_SAMPLE_WINDOW);

// ADC-Vhb2 - C1->RC2
ADC_setupSOC(obj->adcHandle[2], ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN1, HAL_ADC_SAMPLE_WINDOW);

// ADC-Vhb3 - B4->RB1
ADC_setupSOC(obj->adcHandle[1], ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN4, HAL_ADC_SAMPLE_WINDOW);

// VDCBUS - A9->RA1. hvkit board has capacitor on Vbus feedback, so
// the sampling doesn't need to be very long to get an accurate value
ADC_setupSOC(obj->adcHandle[0], ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN9, HAL_ADC_SAMPLE_WINDOW);

return;
} // end of HAL_setupADCs() function

================================================================================================================

// cpuTimer0ISR - 1ms interrupt
__interrupt void cpuTimer0ISR(void)
{
    CPUCOUNT++;
    //
    // Acknowledge this interrupt to receive more interrupts from group 1
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
=================================================================================================================

Regards,

Karthikeyan Ramachandran

 

  • I don't think you just changed the cod you mentioned above. Please only post what changes you did in the original lab, not listed all codes, and how many code or CPU bandwidth is taken by the ISR you added. 

  • Hello,

    1.In addition to "main ISR"  which is invoked by the ADC-C1, I have created the "cpuTimer0ISR" which was invoked by the Timer0 as mentioned below.

    Interrupt_register(INT_TIMER0, &cpuTimer0ISR).

    2. When I execute the code without any change in the "void HAL_setupADCs(HAL_Handle handle)" both the ISR "cpuTimer0ISR and mainISR" is generated.

    3. But when i change the "configure the SOCs for hvkit_rev1p1"  which is inside the "HAL_setupADCs" function  as per my requirement , then at the time of execution only "cpuTimer0ISR " is generated.

    4.But when I revert back the code with the old changes at that time both ISR are generated.

    As mentioned in the above thread comment in "cpuTimer0ISR " i'm just incrementing the count.

    // cpuTimer0ISR - 1ms interrupt
    __interrupt void cpuTimer0ISR(void)
    {

    CPUCOUNT++;
    //
    // Acknowledge this interrupt to receive more interrupts from group 1
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }
    #endif

    Regards,

    Karthikeyan Ramachandran

     

  • Hello,

    The issue got resolved with the below change.

    Existing  code: ADC_setInterruptSource(obj->adcHandle[2], ADC_INT_NUMBER1, ADC_SOC_NUMBER2);


    Mychange: ADC_setInterruptSource(obj->adcHandle[2], ADC_INT_NUMBER1, ADC_SOC_NUMBER0);

    I have changed the SOC number from Two to Zero, as i was using the ADC-C and ADC_SOC_NUMBER0 for my requirement.

    Thank you for the response.

    May i know how to know the CPU bandwidth is taken by the ISR .


    Regards,

    Karthikeyan Ramachandran