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.

[参考译文] TMS320F28377S:PWM 时钟生成、信号不正确

Guru**** 2482215 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/845653/tms320f28377s-pwm-clock-generation-not-proper-signal

器件型号:TMS320F28377S

您好!

在另一篇文章中、我指出了在两个不同 SPI 上生成时钟的问题、一个是50MHz 时钟、另一个是100KHz 时钟。

由于源时钟和分频器的可能性相同、这是不可能实现的。

然后、我要提出的解决方案是由 PWM 生成时钟。

需要实现反馈 SSI 驱动器。 我们只需要生成一定数量的时钟并在 SPI 输入上获取数据。

为此、我使用与 BiSS 和 EnDat 库相同的架构:在 Epwm4a / Epwm4b (互补输出)上使用 GPIO6和7

问题是我无法获得正确的信号。

第一个问题与 IDDK 示例类似、脉冲生成的开始在 Epwm11 ISR 下给出、而 Epw4 ISR 在同一组中。 然后、当 I 处于 EPwm11 ISR 下时、不会生成 epwm4的 ISR。

第二个问题是我在 Epwm4b 信号上获得"干扰"。

CH1、黄色:Epwm4A

CH4、绿色:Epwm4B

CH2蓝色:主 ISR 中断(EPwm11)

CH3红色:EPwm4中断

下面是使用的代码:

初始化阶段(与 IDDK exemple 相同)

 /*时基子模块寄存器*/
 ePWM->TBCTL.bit.PRDLD     = TB_IMMETERY;                                   //设置立即加载*
 ePWM->TBPRD               =(((((uint32_t) dV_PWM_ePWM_CLK_MHz *(uint32_t) 1000)/(uint32_t)频率)- 1);
 ePWM->TBPHS.bit.TBPHS     = 0;
 ePWM->TBCTR = 0;
 ePWM->TBCTL.bit.CTRMODE   = TB_COUNT_UP;
 ePWM->TBCTL.bit.HSPCLKDIV = TB_DIV1;
 ePWM->TBCTL.bit.CLKDIV    = TB_DIV1;

 ePWM->TBCTL.bit.PHSEN     = TB_DISABLE;
 ePWM->TBCTL.bit.SYNCOSEL  = TB_CTR_ZERO;    /*同步"下流"*/

 /*计数器比较子模块寄存器*/
 ePWM->CMPA.bit.CMPA       = 0;              //初始设置占空比0%*/
 ePWM->CMPCTL.bit.SHDWAMODE = CC_SHADOW;
 ePWM->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

 /*操作限定符子模块寄存器*/
 ePWM->AQCTLA.bit.CAU      = AQ_CLEAR;
 ePWM->AQCTLA.bit.ZRO      = AQ_SET;

 /*高电平有效互补 PWM -设置死区*/
 ePWM->DBCTL.bit.in_mode   = DBA_ALL;
 ePWM->DBCTL.bit.out_mode  = DB_full_enable;
 ePWM->DBCTL.bit.POLSEL    = DB_ACTV_HIC;
 ePWM->DBRED.ALL           = 0;
 ePWM->DBFED.ALL           = 0;

 EPwm4Regs.CMPA.bit.CMPA = EPwm4Regs.TBPRD >> 1;
 EPwm4Regs.TZCTL.bit.TZA = TZ_FORCE_HI;             //将 PWMA 和 B 设置为 SPI Clk 的默认值*/
 EPwm4Regs.TZCTL.bit.TSB = TZ_FORCE_HI;
 EPwm4Regs.TZFRC.bit.OST = 1;                       //默认情况下,输出被禁用*/
 /* PWM4 INT 用于计算时钟脉冲数*/
 EPwm4Regs.ETSEL.bit.INTSEL  = ET_CTRL_CMPA;       // PRD 事件上的 INT *
 EPwm4Regs.ETSEL.bit.INTEN   = 1;                  //启用 INT *
 EPwm4Regs.ETPS.bit.INTPRD   = et_1st;             //在每个事件上生成 INT *
 …

 INTERRUPT_REGISTER (INT_EPWM4、DV_SSI_iPwmISR);

 /*清除标志*/
 EPwm4Regs.ETCLR.bit.INT = 1;

在 MainISR (EPwm11)中、当需要启动 SPI 传输时:

 /*初始化要生成和启用时钟输出的位数*/
 DV_SSI_BitCount = 16;  
 
 /*启用 Epwm4输出*/

 EALLOW;                      
 EPwm4Regs.TZCLR.bit.OST = 1;
 EDIS;                        


 INTERRUPT_ENABLE (INT_EPWM4);
 /*清除标志*/
 EPwm4Regs.ETCLR.bit.INT = 1;

进入 Epwm4 ISR

中断空 DV_SSI_iPwmISR (空)

  DV_SSI_BitCount--;  
   
 IF (DV_SSI_BitCount = 0)
 {

  /*禁用输出*/
   EALLOW;                       
   EPwm4Regs.TZFRC.bit.OST = 1;
   EDIS;                         

   INTERRUPT_DISABLE (INT_EPWM4);
 }

  /*清除标志*/
 EPwm4Regs.ETCLR.bit.INT = 1;
 INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group3);


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

    对于第一个问题(嵌套中断)、我通过在 EPwm11 ISR 的开头添加以下代码来解决它:

    PieCtrlRegs.PIEIER3.bit.INTx4 = 1;
    asm (" RPT #5 || NOP");
    INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group3);
    IER |= M_INT3;
    EINT;

    然后、现在我使用了 AQCTL 模块而不是 TripZone 来启用输出。

    但我总是有一些问题。 有时、在 EpwmA 之前、EpwmB 变为低电平。 ISR 在 EPwmA 的上升沿而不是下降沿触发。!

    但90%的时间、这是可以的。

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

    是否在运行时更改配置?

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

    为此、使用 ePWM 实现它会有点困难。 为什么不尝试使用最近发布的 CLB 外设和 CLB 工具。

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

    我不会更改有关中断类型/源等的配置。。。 仅 AQCTL

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

    是的、有人建议我:

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/839516

    但这在我看来并不是最简单的、因为我必须理解这个模块、安装所有相关工具等。

    那么、如何使用 CLB 生成这些时钟? 您有什么好的体验吗?

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

    我使用 AQCTL 在 PWM 上实施解决方案。

    问题是、如果 PWM 中断具有延迟(由于其他系统中断)并且 PWM 频率过高(大约为1.2、1.5MHz)、则下一个半周期结束前最后一个 ISR 没有时间执行。 在最后一个 ISR 中、我们更改了:

    EPwm4Regs.AQCTLB.bit.ZRO = AQ_CLEAR;至

    EPwm4Regs.AQCTLB.bit.ZRO = AQ_SET;

    但是清除事件会在 ISR 中断之前发生,然后我会在更多情况下出现负脉冲,这是意外的:-(

    我必须尝试使用 CLB、但看起来并不是很容易...

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

    这正是您在尝试以如此高的频率实施它时会面临的问题。 CLB 基本上允许您在硬件中进行设计。