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.

[参考译文] TMS320F28.0021万:ADC的PIE中断和ADCINT1/ADCINT2问题

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1093211/tms320f280021-the-pie-interrupt-of-adc-and-adcint1-adcint2-issue

部件号:TMS320F28.0021万

大家好,

以下是客户提出的一些问题可能需要您的帮助:

使用2800X系列的ADC中断时:

2800x系列有四个中断:ADCINT1,ADCINT2,ADCINT3,ADCINT4。

1.使用ADCINT1中断时,执行了以下3项测试:

a.使用 PIE中断向量表的ADCA1作为中断项时,中断程序工作正常, LED_FLASH引脚翻转时间:17.2us,80次。  

PieVectTable.ADCA1_INT  = &adc_A1ISR;     // Function for ADCA interrupt 1

IER |= M_INT1;//T0 ADCINT1

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// ADCINT1


EPwm1Regs.ETSEL.bit.SOCAEN = 0;     // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3;    // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1;     // Generate pulse on 1st event

EPwm1Regs.CMPA.bit.CMPA = 430;   // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862;           // Set period to 4096 counts

EPwm1Regs.TBCTL.bit.CTRMODE = 3;    // Freeze counter

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7;     // SOC0 will convert pin A1
                                           // 0:A0  1:A1  2:A2  3:A3
                                           // 4:A4   5:A5   6:A6   7:A7
                                           // 8:A8   9:A9   A:A10  B:A11
                                           // C:A12  D:A13  E:A14  F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9;     // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;   // Trigger on ePWM1 SOCA

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // End of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0;       //Discontinuous 
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared

The timer function starts the ePWM conversion for 25 ms 
EPwm1Regs.ETSEL.bit.SOCAEN  = 1;        // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0;   // Unfreeze, and enter up count mode

ADC1 interrupt function
__interrupt void adc_A1ISR(void)
{
    LED_FLASH=1;

    Current.Sum+=AdcaResultRegs.ADCRESULT1;
    if(++Current.ConversionCount==80)
    {
        Current.ConversionCount=0;
        Current.Data=(Current.Sum/80);
        Current.Sum=0;

        EALLOW;
        EPwm1Regs.ETSEL.bit.SOCAEN  = 0;        // Enable SOC on A group
        EPwm1Regs.TBCTL.bit.CTRMODE = 3;   // Unfreeze, and enter up count mode
        EDIS;
    }
    //
    // Clear the interrupt flag
    //
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    //
    // Check if overflow has occurred
    //
    if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
    {
        AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
    }

    //
    // Acknowledge the interrupt
    //
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

b. 使用PIE中断向量表的ADCC1作为中断项时,中断程序不运行,并且不能输入中断。

PieVectTable.ADCC1_INT  = &adc_C1ISR;     // Function for ADCC interrupt 1

IER |= M_INT1;//T0 ADCINT1

PieCtrlRegs.PIEIER1.bit.INTx3 = 1;// ADCINT1

EPwm1Regs.ETSEL.bit.SOCAEN = 0;     // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3;    // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1;     // Generate pulse on 1st event

EPwm1Regs.CMPA.bit.CMPA = 430;   // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862;           // Set period to 4096 counts

EPwm1Regs.TBCTL.bit.CTRMODE = 3;    // Freeze counter

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7;     // SOC0 will convert pin A1
                                           // 0:A0  1:A1  2:A2  3:A3
                                           // 4:A4   5:A5   6:A6   7:A7
                                           // 8:A8   9:A9   A:A10  B:A11
                                           // C:A12  D:A13  E:A14  F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9;     // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;   // Trigger on ePWM1 SOCA

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // End of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0;       //discontinous
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared

The timer function starts the ePWM conversion for 25 ms 
EPwm1Regs.ETSEL.bit.SOCAEN  = 1;        // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0;   // Unfreeze, and enter up count mode

ADC1 interrupt function
__interrupt void adc_C1ISR(void)
{
    LED_FLASH=1;

    Current.Sum+=AdcaResultRegs.ADCRESULT1;
    if(++Current.ConversionCount==80)
    {
        Current.ConversionCount=0;
        Current.Data=(Current.Sum/80);
        Current.Sum=0;

        EALLOW;
        EPwm1Regs.ETSEL.bit.SOCAEN  = 0;        // Enable SOC on A group
        EPwm1Regs.TBCTL.bit.CTRMODE = 3;   // Unfreeze, and enter up count mode
        EDIS;
    }
    //
    // Clear the interrupt flag
    //
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    //
    // Check if overflow has occurred
    //
    if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
    {
        AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
    }

    //
    // Acknowledge the interrupt
    //
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

c. 使用PIE中断向量表的ADCA2作为中断项时,中断程序不运行,并且不能输入中断。

PieVectTable.ADCA2_INT  = &adc_A2ISR;     // Function for ADCA interrupt 1

IER |= M_INT10; //ADCINT1

PieCtrlRegs.PIEIER10.bit.INTx2 = 1;// ADCINT1

EPwm1Regs.ETSEL.bit.SOCAEN = 0;     // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3;    // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1;     // Generate pulse on 1st event

EPwm1Regs.CMPA.bit.CMPA = 430;   // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862;           // Set period to 4096 counts

EPwm1Regs.TBCTL.bit.CTRMODE = 3;    // Freeze counter

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7;     // SOC0 will convert pin A1
                                           // 0:A0  1:A1  2:A2  3:A3
                                           // 4:A4   5:A5   6:A6   7:A7
                                           // 8:A8   9:A9   A:A10  B:A11
                                           // C:A12  D:A13  E:A14  F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9;     // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;   // Trigger on ePWM1 SOCA

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // End of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0;       //discontinous
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared

The timer function starts the ePWM conversion for 25 ms 
EPwm1Regs.ETSEL.bit.SOCAEN  = 1;        // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0;   // Unfreeze, and enter up count mode

ADC1 interrupt function
__interrupt void adc_A2ISR(void)
{
    LED_FLASH=1;

    Current.Sum+=AdcaResultRegs.ADCRESULT1;
    if(++Current.ConversionCount==80)
    {
        Current.ConversionCount=0;
        Current.Data=(Current.Sum/80);
        Current.Sum=0;

        EALLOW;
        EPwm1Regs.ETSEL.bit.SOCAEN  = 0;        // Enable SOC on A group
        EPwm1Regs.TBCTL.bit.CTRMODE = 3;   // Unfreeze, and enter up count mode
        EDIS;
    }
    //
    // Clear the interrupt flag
    //
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    //
    // Check if overflow has occurred
    //
    if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
    {
        AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
    }

    //
    // Acknowledge the interrupt
    //
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

2.使用 ADCINT2中断时,执行了以下两项测试:

答  当使用PIE中断向量表的ADCA1作为中断项时,中断程序不运行,并且不能输入中断。

PieVectTable.ADCA1_INT  = &adc_A1ISR;     // Function for ADCA interrupt 1

IER |= M_INT1;//T0 ADCINT1

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// ADCINT1


EPwm1Regs.ETSEL.bit.SOCAEN = 0;     // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3;    // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1;     // Generate pulse on 1st event

EPwm1Regs.CMPA.bit.CMPA = 430;   // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862;           // Set period to 4096 counts

EPwm1Regs.TBCTL.bit.CTRMODE = 3;    // Freeze counter

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7;     // SOC0 will convert pin A1
                                           // 0:A0  1:A1  2:A2  3:A3
                                           // 4:A4   5:A5   6:A6   7:A7
                                           // 8:A8   9:A9   A:A10  B:A11
                                           // C:A12  D:A13  E:A14  F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9;     // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;   // Trigger on ePWM1 SOCA

AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 0; // End of SOC1 will set INT2 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1;   // Enable INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0;       //discontinous
AdcaRegs.ADCINTFLGCLR.bit.ADC2NT1 = 1; // Make sure INT2 flag is cleared

The timer function starts the ePWM conversion for 25 ms 
EPwm1Regs.ETSEL.bit.SOCAEN  = 1;        // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0;   // Unfreeze, and enter up count mode

ADC1 interrupt function
__interrupt void adc_A1ISR(void)
{
    LED_FLASH=1;

    Current.Sum+=AdcaResultRegs.ADCRESULT1;
    if(++Current.ConversionCount==80)
    {
        Current.ConversionCount=0;
        Current.Data=(Current.Sum/80);
        Current.Sum=0;

        EALLOW;
        EPwm1Regs.ETSEL.bit.SOCAEN  = 0;        // Enable SOC on A group
        EPwm1Regs.TBCTL.bit.CTRMODE = 3;   // Unfreeze, and enter up count mode
        EDIS;
    }
    //
    // Clear the interrupt flag
    //
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;

    //
    // Check if overflow has occurred
    //
    if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT2)
    {
        AdcaRegs.ADCINTOVFCLR.bit.ADCINT2 = 1; //clear INT2 overflow flag
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //clear INT2 flag
    }

    //
    // Acknowledge the interrupt
    //
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

B. 使用PIE中断向量表的ADCA2作为中断项时,中断程序可以运行,但结果不正确:LED_FLASH引脚翻转20毫秒(设置了17.2us):

PieVectTable.ADCA2_INT  = &adc_A2ISR;     // Function for ADCA interrupt 1

IER |= M_INT10; //ADCINT1

PieCtrlRegs.PIEIER10.bit.INTx2 = 1;// ADCINT1

EPwm1Regs.ETSEL.bit.SOCAEN = 0;     // Disable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 3;    // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1;     // Generate pulse on 1st event

EPwm1Regs.CMPA.bit.CMPA = 430;   // Set compare A value to 2048 counts
EPwm1Regs.TBPRD = 862;           // Set period to 4096 counts

EPwm1Regs.TBCTL.bit.CTRMODE = 3;    // Freeze counter

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 7;     // SOC0 will convert pin A1
                                           // 0:A0  1:A1  2:A2  3:A3
                                           // 4:A4   5:A5   6:A6   7:A7
                                           // 8:A8   9:A9   A:A10  B:A11
                                           // C:A12  D:A13  E:A14  F:A15
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 9;     // Sample window is 10 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;   // Trigger on ePWM1 SOCA

AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 0; // End of SOC1 will set INT2 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1;   // Enable INT2 flag
AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0;       //discontinous
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; // Make sure INT1 flag is cleared

The timer function starts the ePWM conversion for 25 ms 
EPwm1Regs.ETSEL.bit.SOCAEN  = 1;        // Enable SOC on A group
EPwm1Regs.TBCTL.bit.CTRMODE = 0;   // Unfreeze, and enter up count mode

ADC1 interrupt function
__interrupt void adc_A2ISR(void)
{
    LED_FLASH=1;

    Current.Sum+=AdcaResultRegs.ADCRESULT1;
    if(++Current.ConversionCount==80)
    {
        Current.ConversionCount=0;
        Current.Data=(Current.Sum/80);
        Current.Sum=0;

        EALLOW;
        EPwm1Regs.ETSEL.bit.SOCAEN  = 0;        // Enable SOC on A group
        EPwm1Regs.TBCTL.bit.CTRMODE = 3;   // Unfreeze, and enter up count mode
        EDIS;
    }
    //
    // Clear the interrupt flag
    //
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;

    //
    // Check if overflow has occurred
    //
    if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT2)
    {
        AdcaRegs.ADCINTOVFCLR.bit.ADCINT2 = 1; //clear INT1 overflow flag
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //clear INT1 flag
    }

    //
    // Acknowledge the interrupt
    //
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

问题:

1) 如何将中断程序配置为与上述测试1C正常工作?

2)如何将中断程序配置为与上面的测试2a一样正常运行?  

3)如何将中断程序配置为与上面的测试2b一样正常运行?  中断当前可用,但无法正常工作。

您可以帮助检查此问题吗? 谢谢。

此致,

樱桃

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

    您好,

    在1B中,尽管已配置ADCC1是中断,但未配置ADCC,因此不会生成ADCC1中断。  

    在1 C中,未设置ADCINT2的EOC触发器

    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC1结束时将设置INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0;//失禁
    AdcaRegs.ADCINTFLGCLL.bit.ADCINT1 =1;//确保INT1标志已清除

    谢谢
    Vasudha

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

     你好,Vasudha,

    感谢你的帮助。

    使用ADCINT3的PIE中断为ADCA3,ADCINT4的PIE中断为ADCA4测试。 但是与ADCINT2对应的PIE中断是ADCA2,中断转换时间异常:总是20毫秒,但使用ADCINT1的PIE中断是ADCA1,这是正常的。

    EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 3;//在加电计数时选择SOC
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第一个事件上生成脉冲

    EPwm1Regs.CMPA.bit.CMPA = 430;// set将值与2048个计数进行比较
    EPwm1Regs.TBPRD = 862;//将周期设置为4096个计数

    剂量ePWM触发器需要专门配置?

    谢谢,此致,

    樱桃

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

    樱桃,

    Tomm第十五届是美国和印度C2000团队的假期。  请在星期一结束前收到下一封邮件。

    最佳,

    Matthew

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

    Matthew,您好!  

    感谢您的消息,此问题已由客户解决。 再次感谢您的帮助!

    谢谢,此致,

    樱桃