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.

[参考译文] 编译器/TMS320F28035:随后生成递增计数器和递减计数器

Guru**** 2618835 points

Other Parts Discussed in Thread: TMS320F28035

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/697973/compiler-tms320f28035-generating-up-counter-and-down-counter-subsequently

器件型号:TMS320F28035

工具/软件:TI C/C++编译器

您好!

 我正在使用“TMS320F28035”处理器。 我有一个与计数器相关的问题(向上、向下、向上-向下)。 我想为连续中断使用递增计数器和递减计数器、而不是直接使用递增/递减计数器。 我正在使用 EPwm1中断。   为此、我编写了如下代码。  对于该代码、我没有获得预期结果。  

//

void main (void)

           InitSysCtrl();  // DSP2803x_sysctrl.c 中的基本内核初始化

 

           EALLOW;

          SysCtrlRegs.WDCR= 0x00AF;        //重新启用看门狗

          EDIS;                                                  

       DINT;                                    //禁用所有中断

       GPIO_SELECT();

       InitPieCtrl();               // PIE 表的基本设置;来自 DSP2803x_PIECTRL.c

       InitPieVectTable();    // PIE 中的默认 ISR

       EALLOW;

           PieVectTable.EPWM1_INT =&ePWM1A_COMPARE_ISR;

           EDIS;

 

           PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//在 PIE 中启用 EPWM1A INT:组3中断1

 

           IER |= 0x4;//启用中断内核线路3 (INT3)。

      EINT;

           ERTM;

 

           while (1)

           {

                       Setup_ePWM1 ();                   // ePWM1A 的初始化

 

                    EALLOW;

                       SysCtrlRegs.WDKEY = 0x55;          //服务 WD #1

                       EDIS;

           }

 

 

void GPIO_select (void)

           EALLOW;

           GpioCtrlRegs.GPAMUX1.ALL = 0;                // GPIO15... GPIO0 =通用尸体 I/O

           GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// ePWM1A 被激活

 

           GpioCtrlRegs.GPAMUX2.ALL = 0;                // GPIO31... GPIO16 =通用 I/O

           GpioCtrlRegs.GPBMUX1.ALL = 0;                // GPIO44... GPIO32 =通用 I/O

           EDIS;

 

void Setup_ePWM1 (void)

           /******** ePWM1A

 

           EPwm1Regs.TBCTL.bit.CLKDIV = 0x0000;        //        CLKDIV = 1

           EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x0001;//                      HSPCLKDIV = 2

 

           如果(索引1 % 2 = 0)  //余数= 0

                                   {

                                   EPwm1Regs.TBCTL.bit.CTRMODE = 0x0000;     //                     向上计数模式

                                   EPwm1Regs.AQCTLA.bit.CAU = 0x2;                               //                     在 CMPA 上设置 EPwm1A

                                   EPwm1Regs.AQCTLA.bit.PRD = 0x1;                               //                     清除 TBPRD 上的 EPwm1A

                                   }

           其他

                                   {

                                   EPwm1Regs.TBCTL.bit.CTRMODE = 0x0001;     //                     递减计数模式

                                   EPwm1Regs.AQCTLA.bit.CAD = 0x2;                               //                     将 CMPA 上的 EPwm1A 设置为低电平

                                   EPwm1Regs.AQCTLA.bit.ZRO = 0x1;                               //                     清零 EPwm1A

                                   }

 

           EPwm1Regs.TBPRD = 20000;                                                         //         对于1.5KHz PWM 生成50Hz 正弦

 

 

           EPwm1Regs.ETSEL.ALL = 0;

           EPwm1Regs.ETSEL.bit.INTEN = 1;                                   //         针对 ePWM1启用中断

 

           如果(索引1 % 2 = 0)

           {

           EPwm1Regs.ETSEL.bit.INTSEL = 2;                                  //        PRD 匹配上的中断(CTR = PRD)

           }

           其他

           {

           EPwm1Regs.ETSEL.bit.INTSEL = 1;                                  //        ZRO 匹配上的中断(CTR = ZRO)

           }

 

           EPwm1Regs.ETPS.bit.INTPRD = 1;                        //第一个事件发生中断

 

///----------------------------------------------

 

 

中断 ePWM1A_COMPARE_ISR ()

 

//每个中断处理看门狗

EALLOW;

SysCtrlRegs.WDKEY = 0xAA;        //服务 WD #2

EDIS;

 

EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD -_IQsat (_IQ30mpy (_IQ30 (0.2)、EPwm1Regs.TBPRD)、EPwm1Regs.TBPRD、0);

 

index1 += 1;                                      //使用查找表中的下一个元素

if (索引1>30)

索引1 = 1;

 

 

EPwm1Regs.ETCLR.bit.INT = 1;    //清除 ePWM1中断标志

 

PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;//或4 (0000000000000100)

 }

 

 

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

    尊敬的 Ravi:

    我不认为在中断中改变你的计数器方向是一个好主意。 请记住、在您接收 ISR 之前、有几个周期的最小延迟、但是如果系统中有其他更高优先级或不间断任务在进行、则中断可能会进一步延迟。

    您能否详细介绍一下您为何需要更改计数器方向、以便我们能够提供更强大的解决方案?

    此致、

    Kris

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

    你(们)好

    感谢您的回复。 实际上,对于我的应用程序,我需要计数器序列,如(上-下-上)- (上-下-上)-(上-下-上)--- 。 因此、我尝试使用中断更改计数器的方向。 是否有任何其他方法来改变计数器方向?

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

    Ravi、

    您可以配置同步事件后计数器计数的方向。 该位是 TBCTL[PHSDIR]。 您可以在以下位置找到更多信息: www.ti.com/.../spruge9e.pdf

    我认为这对您有所帮助的唯一方法是、您可以牺牲每1.5个 PWM 周期生成同步事件的 GPIO、或者找到一种自动触发 SW 同步的方法。

    编辑:您还可以使用另一个 PWM 模块、在当前 PWM 的每1.5个 PWM 周期生成一个同步输出事件。 这不需要 GPIO、而只需要专用 PWM 模块。 例如、设置 TBPRD = PWM_PERIOD* 1.5并在 TBCTR = PRD 上生成一个 SYNCO。


    请提供更多详细信息、说明为什么您需要以这种方式运行计数器。 可能还有另一种更简单的解决方案。

    此致、
    Kris

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

    您好!

    我尝试使用"TBCTL"。 我按如下方式更改了“Setup_ePWM1”和“ePWM1A_COMPARE_ISR”。 即使它不起作用。  我在这里附上了我通过两种方式完成的方案,我还包括了这些方案的产出。  

    e2e.ti.com/.../FAQ1.docxe2e.ti.com/.../FAQ2.docx