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.

[参考译文] CCS/TMS320F28335:生成二次 PWM。 未在中断 epwm1_ISR 上进入

Guru**** 2608865 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/682171/ccs-tms320f28335-generating-quadratic-pwm-not-entering-on-interrupt-epwm1_isr

器件型号:TMS320F28335
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

您好!

我尝试生成一个二次 PWM 来控制100Hz 的5V 直流电机速度。 根据 TI 示例、我完成了以下代码:

(笑声)

GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;     //将电阻器上拉参数设置为使用 el GPIO0 como EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;    //准备好 GPIO0参数使 EPWM1A 具有功能

unsigned int epwm1Periodo = 46921;
unsigned int epwm1DuttyCycle = 26921;

空 InitEPwm (空)

   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
   EDIS;

   EPwm1Regs.TBCTL.bit.CTRMODE = 0x0;           // generar diente de Sierra de tipo 向上计数模式
   EPwm1Regs.TBPRD = epwm1Periodo;                // India el periodo del diente de Sierra Segun la fórmula TPWM =(TBPRD+1) x TTBCLK 参数递增计数模式
   EPwm1Regs.TBCTL.bit.PHSEN = 0x0;               //从 tiempo 基址去 fase TBPHS
   EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;           // se setea la fase a cero
   EPwm1Regs.TBCTR = 0x0000;                      // se iniciza el contador
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x5;           // TBCLK = SYSCLKOUT /(HSPCLKDIV×CLKDIV)(Valor /32)
   EPwm1Regs.TBCTL.bit.CLKDIV = 0x1;              // TBCLK = SYSCLKOUT /(HSPCLKDIV×CLKDIV)(Valor /1)-时钟 del PWM 特性 de SYSCLKOUT (150MHz)
   EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0x0;          // se setean los registros Shadow a cero
   EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0x0;          // se setean los registros Shadow a cero
   EPwm1Regs.CMPCTL.bit.LOADAMODE = 0x0;          // Carga el registro cuando TBCTR toma valor 0
   EPwm1Regs.CMPCTL.bit.LOADBMODE = 0x0;          // Carga el registro cuando TBCTR toma valor 0
   EPwm1Regs.CMPA.half.CMPA = epwm1DuttyCycle;    // se setea un valor de comparación ó n con el diente de Sierra en Herzios
   EPwm1Regs.AQCTLA.bit.ZRO = 0x2;                //将 PWM1A "置为零
   EPwm1Regs.AQCTLA.bit.CAU = 0x1;                //在事件 A 上"清除"PWM1A、递增计数
   EPwm1Regs.ETSEL.bit.INTSEL = 0x1;              // se selectiona la interrupción 0 para el PWM (La interrupción cambiará ó n el valor de comparación ó n)
   EPwm1Regs.ETSEL.bit.INTEN = 1;                 // se habilita la interrupción ó n
   EPwm1Regs.ETPS.bit.INTPRD = 0x3;               // se genera la interrupción ó n despus que se hayan productido 3 eventos asociados a la interrupción ó n
   EPwm1Regs.AQSFRC.ALL = 0x0000;                 //动作限定符 s/w 强制寄存器
   EPwm1Regs.AQCSFRC.ALL = 0x0000;                //动作限定符连续 s/w 强制寄存器
   EPwm1Regs.DBCTL.bit.OUT_MODE = 0;              //禁用死区
   EPwm1Regs.PCCTL.bit.CHPEN = 0;                 // PWM 斩波器单元被禁用
   EPwm1Regs.TZCTL.bit.TZA = 0x3;                 //针对输出 A 禁用跳闸操作

   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
   EDIS;

   IER |= M_INT3;
   PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
   EINT;
   ERTM;

然后在中断上、以下代码:

中断空 EPWM1_INT_ISR (空)           // PIE3.1 @ 0x000D60 EPWM1_INT

   EPwm1Regs.CMPA.half.CMPA =(无符号整型) 20000;
   EPwm1Regs.ETCLR.bit.INT = 1;               //清除此计时器的 INT 标志
   PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;    //确认此中断以接收来自组3的更多中断
   IER |= M_INT3;

n´t 编译正确、但在调试程序时会在中断上停止。 使用测试仪、GPIO0上的电压在 Aprox 2、5V 上为n´t μ A、这与 dutty 周期类似。 原因可能是什么?

谢谢、

Pablo González í a

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

    巴勃罗

    是否有任何设备连接? 如果是、我建议您将其删除、然后继续调试。 该引脚绝不能为2.5V、它只能提供0V 和3.3V 电压(VDDIO)。

    如果您没有收到中断、则应首先检查您是否收到中断标志。 如果是、则需要确保设置了所有正确的寄存器、从而使该标志能够通过 PIE 模块传播。 请查看 图78。  TRM 内的"概述:使用 PIE 块的中断多路复用"。  

    接下来、应确保正确映射 PIE 中断矢量表以分支到已定义的 ISR。

    最后、如果所有这些步骤都正确完成、您应该至少接收到一个中断、要继续接收中断、您需要确认 ISR 内部的中断。 许多示例展示了如何在 controlSUITE 中实现此目的。

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的详细答复。 很遗憾、我想我正在做您的所有建议:

    --------------------------------------------------
    如果您没有收到中断、则应首先检查您是否收到中断标志。 如果是、则需要确保设置了所有正确的寄存器、从而使该标志能够通过 PIE 模块传播。 请查看图78。 TRM 内的"概述:使用 PIE 块的中断多路复用"。

    - IER |= 0x0004;
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    EINT;
    ERTM;

    接下来、应确保正确映射 PIE 中断矢量表以分支到已定义的 ISR。

    - PieVectTable.EPWM1_INT =&EPWM1_INT_ISR;

    最后、如果所有这些步骤都正确完成、您应该至少接收到一个中断、要继续接收中断、您需要确认 ISR 内部的中断。 许多示例展示了如何在 controlSUITE 中实现此目的。

    - PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

    --------------------------------------------------

    这是我的n´t、现在仍然工作、既不会进入中断、也不会通过 GPIO0输出电压:

    ---- (笑声)
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Habilisto la Resistencia 上拉参数 usar el GPIO0 como EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO0=1; //准备好 EEPWM1A 的功能
    ---- (笑声)
    空 InitEPwm (空)

    EALLOW;
    PieVectTable.EPWM1_INT =&EPWM1_INT_ISR;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;

    EPwm1Regs.TBPRD = epwm1Periodo;
    EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;
    EPwm1Regs.TBCTR = 0x0000;
    EPwm1Regs.TBCTL.bit.CTRMODE = 0x1;
    EPwm1Regs.TBCTL.bit.PHSEN = 0x0;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x0;
    EPwm1Regs.TBCTL.bit.CLKDIV = 0x5;
    EPwm1Regs.TBCTL.bit.PRDLD = 0x0;
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0x0;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0x0;
    EPwm1Regs.CMPA.half.CMPA = epwm1DuttyCycle;
    EPwm1Regs.AQCTLA.bit.CAD = 0x1;
    EPwm1Regs.AQCTLA.bit.ZRO = 0x2;
    EPwm1Regs.ETSEL.bit.INTSEL = 0x1;
    EPwm1Regs.ETSEL.bit.INTEN = 1;
    EPwm1Regs.ETPS.bit.INTPRD = 0x1;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;

    IER |= 0x0004;
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    EINT;
    ERTM;

    ------ (笑声)

    还有一个问题、在递减计数模式下、这3个选项是否具有相同的功能?

    EPwm1Regs.AQCTLA.bit.PRD = 0x2; //将其与 Iguala el valor del periodo 的竞争对手合起来
    EPwm1Regs.AQCTLA.bit.CAU = 0x2; //将其从 Fanco positivo cuando el contador autmenta y cruza el CMPA 中运行
    EPwm1Regs.AQCTLA.bit.ZRO = 0x2; //选择一个金属陶瓷

    此致、提前感谢您。

    Pablo。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有任何方法可以"启动"PWM? 或者、哪条指令启动它?

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

    巴勃罗

    我建议从 controlSUITE 示例开始并进行增量更改、这将帮助您了解代码的错误位置。

    要"启动"PWM、您需要为模块启用时钟并配置 CTRMODE。。。 我现在可能还有其他的东西,但没有什么可以想到的。

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否已解决此问题?
    如果是、请标记任何有用的帖子。

    此致、
    Cody