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.

[参考译文] TMS320F2.8377万D:如何选择中断?

Guru**** 2586865 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/655428/tms320f28377d-how-to-choose-the-interrupts

部件号:TMS320F2.8377万D

您好,

也许这是基本问题。 我在网上寻找一些答案,但我没有找到答案。

有多种类型的中断,ADC,ePWM和ePWM_TZ中断。  它们之间有何区别? 我应该选择哪一种?

我用过一次ADCA1和一次EPWM1_TZ,现在我回头看,我感到困惑。  有人能帮我理解吗?

例如,我需要从下面的列表中选择一个。 我为什么要选择它?

ADCA1中断

EPWM1_TZ中断

EPWM1中断

谢谢!

Emily

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

    您好,Emily:

    [报价用户="hongmei Wan "]

    ADCA1中断

    EPWM1_TZ中断

    EPWM1中断

    [/引述]

    以上3个中断用于3个不同的目的,即:

    ADCA1中断-基于转换的ADC中断。

    EPWM1_TZ中断- ePWM tripzone中断

    EPWM1中断-基于设置频率的ePWM中断。

    [引用user="hongmei Wan ]例如,我需要从以下列表中选择一个。 我为什么要选择它?[/QUOT]

    要求是什么?

    此致,

    Gautam

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

    谢谢,Gautam。

    我知道这个名字,但我不知道何时使用它。

    现在我正在使用ADCA1中断。 我问我为什么使用它,我不得不说我不知道。 请问您能在什么条件下使用它吗?

    我的PWM频率为300kHz。 三个板交错。 共感应3个电流,共2个电压,每个温度2个(共6个)。

    我只会为每个板写入一个中断函数。  在 __interrupt void ADC_ISR(void)函数中,主要是用于降压-升压转换器的闭环计算。

    在以下代码中,

    我认为是:EPwm10Regs.ETSEL.bit.SOCASEL = 1;->   设置何时(EPWM10的连接=0)采样和开始转换, ADCARegs.ADCINTSEL1N2.bit.INT1SEL = 5;->  EOC5触发ADCINT1。 我认为它将转到  SOC5末尾的__interrupt void ADC_ISR(void)的中断函数 ,因为我给出了AdcdRegs.ADCSOC5CTL.bit的设置。  但是 ,当AdcaRegs.ADCINTSEL1N2.bit.INT1SEL的值高于2时,它不会进入__interrupt void ADC_ISR(void)。

    我理解的是,如果我需要SOC15,它将 进入 __interrupt void ADC_ISR(void)以在SOC15的末尾运行代码,因此AdcaRegs.ADCINTSEL1N2.bit.INT1SEL将被设置为15。 否则,它不会完成转换。 不管 AdcaRegs.ADCINTSEL1N2.bit.INT1SEL的值是什么,似乎所有SOC都将完成。 为什么? 我需要提供什么价值?

    __interrupt void ADC_ISR(void)

       I= AdcaResultRegs.ADCRESULT0;
       J= AdcbResultRegs.ADCRESULT0;
       k= AdccResultRegs.ADCRESULT0;

       M= AdcaResultRegs.ADCRESULT1;
       N= AdcbResultRegs.ADCRESULT1;

       t0= AdcdResultRegs.ADCRESULT0;
       t0= AdcdResultRegs.ADCRESULT1;
       t0= AdcdResultRegs.ADCRESULT2;
       t0= AdcdResultRegs.ADCRESULT3;
       t0= AdcdResultRegs.ADCRESULT4;
       t0= AdcdResultRegs.ADCRESULT5;

    }

    void配置ADC(void)

       EALLOW;
       // ADC-A
       AdcaRegs.ADCCTL2.bit.prescale =6;         //将ADCCLK分配器设置为/4;0110 ADCCLK =输入时钟/ 4.0
       AdcaRegs.ADCCTL2.bit.resolution = 0;      // 12位分辨率
       AdcaRegs.ADCCTL2.bit.SIGNALMODE = 0;      //单端通道转换(仅限12位模式)
       AdcaRegs.ADCCTL1.bit.INTPULSEPOS =1;      //将脉冲位置设置为晚期
       ADcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;         //打开ADC电源

     // ADC-B ADC-C ADC-D的设置,与ADC-A相同

       DELAY _US (1000);
    }

    void SetupADCEpwm (void)

       EALLOW;
       //SOC0,电感器电流IL
       AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4;          // SOC0将转换引脚A4,BIUA的电感器电流
       AdcaRegs.ADCSOC0CTL.bit.ACQPS =14;      //样例窗口是...?
       AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器

       AdcbRegs.ADCSOC0CTL.bit.CHSEL = 4;          // SOC0将转换引脚B4,BIU2的电感器电流
       AdcbRegs.ADCSOC0CTL.bit.ACQPS =14;      //示例窗口
       AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器


       ADccRegs.ADCSOC0CTL.bit.CHSEL = 4;          // SOC0将转换引脚C4,BIU3的电感器电流
       ADccRegs.ADCSOC0CTL.bit.ACQPS =14;//      示例窗口
       ADccRegs.ADCSOC0CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器

       //SOC1,蓄电池电压
       ADcaRegs.ADCSO1CTL.bit.CHSEL = 14;         //SOC1将转换引脚ADCIN14,VB1
       AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14;      //示例窗口
       AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器

       ADcbRegs.ADCSOC1CTL.bit.CHSEL = 15;         //SOC1将转换引脚ADCIN15,VB2
       AdcbRegs.ADCSOC1CTL.bit.ACQPS = SAH_TIME;      //示例窗口
       AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器


       //温度感应
       AdcdRegs.ADCSOC0CTL.bit.CHSEL = 0;       // SOC0将转换引脚D0,BIU1的温度
       AdcdRegs.ADCSOC0CTL.bit.ACQPS =14;//      样例窗口
       AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器
       AdcdRegs.ADCSOC1CTL.bit.CHSEL = 1;       // SOC1将转换引脚D1,BIU1的温度
       AdcdRegs.ADCSOC1CTL.bit.ACQPS = 14;      //示例窗口
       AdcdRegs.ADCSOC1CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器

       AdcdRegs.ADCSOC2CTL.bit.CHSEL = 2;//       SOC2将转换引脚D2,即BIU2的温度
       AdcdRegs.ADCSOC2CTL.bit.ACQPS = 14;      //示例窗口
       AdcdRegs.ADCSOC2CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器
       AdcdRegs.ADCSOC3CTL.bit.CHSEL = 3;       // SOC3将转换引脚D3,即BIU2的温度
       AdcdRegs.ADCSOC3CTL.bit.ACQPS = 14;      //示例窗口
       AdcdRegs.ADCSOC3CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器

       AdcdRegs.ADCSOC4CTL.bit.CHSEL = 4;       // SOC4将转换引脚D4,即BIU3的温度
       AdcdRegs.ADCSOC4CTL.bit.ACQPS = 14;      //示例窗口
       AdcdRegs.ADCSOC4CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器
       AdcdRegs.ADCSOC5CTL.bit.CHSEL = 5;       // SOC5将转换引脚D5,BIU3的温度
       AdcdRegs.ADCSOC5CTL.bit.ACQPS = 14;      //示例窗口
       AdcdRegs.ADCSOC5CTL.bit.TRIGSEL = 0x17;      // ePWM10 SOCA上的触发器

       // SOC结束触发中断标志
       ADcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;      // EOC5是ADCINT1的触发器
       AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;        //启用INT1标志
       AdcaRegs.ADCINTFLGCLL.bit.ADCINT1 =1;      //确保INT1标志已清除
       EDIS;

       DELAY _US (1万);
    }

    void InitEPwm10 (void)

       EALLOW;
       EPwm10Regs.TBCTL.bit.CTRMODE = 3;          //现在冻结计数器
       EPwm10Regs.TBPRD = SW_PRD;                 //与PWM1相同的期间
       EPwm10Regs.TBCTL.bit.PHSEN = 1;            //启用相位加载
       EPwm10Regs.TBPHS.bit.TBPHS = 0;             //相位
       EPwm10Regs.TBCTR = 0x0000;                 //清除计数器
       EPwm10Regs.TBCTL.bit.HSPCLKDIV = 0;        //最大速度100MHz;设置1/2 SYSCLK的比率
       EPwm10Regs.TBCTL.bit.CLKDIV = 0;         //与HSPCLKDIV相同???
       EPwm10Regs.TBCTL.bit.SYNCOSEL = 0;//sync         in clock signal ??

       EPwm10Regs.ETSEL.bit.SOCAEN   = 0;          //禁用组上的SOC
       EPwm10Regs.ETSEL.bit.SOCASEL = 1;//2;      //选择SOCA开- 1:零,2:句点,3:零或句点
       //EPwm10Regs.ETSEL.Bit.SOCAEN = 1;         //启用ADC开始转换A (EPWMxSOCA)脉冲
       EPwm10Regs.ETPS.bit.SOCAPRD = 1;         //在第一个事件上生成脉冲
       EDIS;

       //启动ePWM 10以开始ADC采样和中断
       EPwm10Regs.ETSEL.bit.SOCAEN = 1;                //启用ADC开始转换A (EPWMxSOCA)脉冲
       EPwm10Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;      //启用上/下模式
    }

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

    您好,Hongmei,

    由于ADCA只进行2次转换(SOC0和SOC1),因此从不触发ADCA-SOC2到ADCA-SOC5。 因此,如果将AdcaRegs.ADCINTSEL1N2.bit.INT1SEL设置为2到5 (或更高),则不会发生任何情况。

    您可以触发:

    使用 AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 5中断ADCD1

    如果通过ADCA SOC5将虚拟样本添加到ADCA SOC2,则中断ADCA1

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

    非常感谢,Devin。

    真有意思。 我从来不知道。

    1.从哪里 可以获得此信息“ADCA只进行2个转换(SOC0和SOC1)”?   Interrupt ADCD1进行了多少次转换?

    2. 使用 AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 5中断ADCD1 ,或者 如果通过ADCA SOC5向ADCA SOC2添加虚拟样本,中断ADCA1, 哪一个更好?

    3. 当AdcaRegs.ADCINTSEL1N2.bit.INT1SEL=0时,这是否意味着在SOC0的末尾,我们只能得到结果0并且 程序进入中断?

    如果 AdcdRegs.ADCINTSEL1N2.bit.INT1SEL =5,则可以通过result5获得result0?

    谢谢!

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

    1)这基于您的代码。 因为对于ADCA,只有SOC0和SOC1被配置为使用trigsel = 0x17,所以当发生此触发时,只有SOC0和SOC1将转换。

    2)使用中断ADCD1需要对PIE/Interrupt配置进行某些配置。 在ADCA上填写虚拟转换将需要对ADC设置进行更多更改。 我不知道一个人本身是否更好。 您是否有0x17以外的其他触发源? 如果是这样,则填充所有ADC上的虚拟转换槽可能会稍微好一点,以确保多个ADC之间的同步操作。

    3)是的,如果中断在SOC0结束时触发,SOC1 (以及任何后续配置的SOC)仍可进行转换。 如果尝试读取ISR中的Result1寄存器,则可以获得旧值。

    但是的,如果使用INT1SEL =5,结果0到5应该准备就绪。 问题是,如果未将SOC5配置为转换,SOC5将永远不会发生,因此ISR也永远不会发生。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢你,Devin。