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.

[参考译文] LAUNCHXL-F2.8069万M:如何使用ePWM模块的数字比较子模块事件过滤?

Guru**** 2561730 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635595/launchxl-f28069m-how-to-use-digital-compare-submodule-event-filtering-of-epwm-module

部件号:LAUNCHTXL-F2.8069万M

我想控制CRM (临界模式)升压电路。 当电感器电流到达其谷值时,ZCD信号获得上升边缘。 当电感器电流达到其峰值时,ZCD信号获得下降边缘。 ZCD信号被发送至DSP。

ZCD连接到DSP的TZ2(GPIO13)引脚,当ZCD的上升沿 出现时,EPWM2的数字比较(DC)子模块输出DCAEVT1.SYNC,如图3-47所示。 如果两个上升边缘之间的时间过小,则可以使用空白窗口过滤ZCD的第二个上升边缘。

如图3-5所示, DCAEVT1.SYNC可将TBPHS加载到TBCTR,然后TBCTR从零增加。 清除TBCTR后,将设置EPWM2B。 当TBCTR等于CMBB时,将清除EPWM2B,并设置EPWM2A。 当TBCTR等于CMPA时,EPWM2A是透明的。

有一个ZCD信号输入DSP,然后是DSP输出EPWM2A和EPWM2B,它们的关系如图1所示。

                                               图1.

我想要使用空白窗口的原因是,当电感器电流有时达到其峰值时,会出现干扰信号,如图 2显示。 绿色波形是我的ZCD信号。 看起来还可以。 但当您看到浅蓝色波形时,它是EPWMSYNCO信号,有时当ZCD信号处于下降边缘时,浅蓝色波形会变得很明显。 因此,我想使用空白窗口来过滤错误的pluse。

通道1:EPWM1B;通道2:EPWM1SYNCO;通道3:电感器电流;通道4:ZCD信号

图 二

在将代码用于我的升压电路之前。 我使用波形发生器生成ZCD信号和干扰信号来验证我的代码。

如图3所示,绿色波形由波形发生器生成。 它的时期是10us。 它包括ZCD信号和干扰信号。 第一个上升沿是ZCD信号,第二个上升沿是干扰信号。 所以ZCD信号的周期是20us,干扰信号也是20us。 我希望ZCD信号控制PWM,干扰信号被空白窗口忽略。 因此  ,我的PWM周期是20us。 我的偏移量(9-11us) 小于三大珠三角(20us)。

我认为,如果编码正确,第一个信号是ZCD信号,那么EPWM1B设置为高。 6US之后,EPWM1B清除。 第二个信号是干扰信号来了,它将通过空白窗口过滤,因此EPWM1B保持零。 但实验结果并不匹配。

通道1:EPWM1B;通道2:EPWM1A;通道4:ZCD信号

图3.

有我的代码:

包含 "math.h"

#include "DSP28x_Project.h"

 

void  InitEPwm2示例(void);

 

int  main (void){

 

    InitSysCtrl();//                               初始化系统控制

 

    InitGpio();                                   //初始化GPIO

 

    Initepwm2gpio()

 

    InitTzGpio();

 

   //配置ePWM模块

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

 

   InitEPwm2Example();

 

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

   EDIS;

 

   //等待timer0中断

    for (;;);

}

 

void  InitEPwm2Example(){

   //设置TBCLK

   EPwm2Regs.TBCTL.bit.CTRMODE = 0x0;                //计数模式

   EPwm2Regs.TBPRD =4500;                             //设置计时器周期,对于本示例,设置为最大值

   EPwm2Regs.TBCTL.bit.PHSEN = 0x1;                  //启用相位加载

   EPwm2Regs.TBPHS.Half.TBPHS = 0;                  //相位为0

   EPwm2Regs.TBCTR = 0x0000;                          //清除计数器

   EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;         //与SYSCLKOUT的时钟比率

   EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

 

   //将阴影寄存器加载设置为零

   EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOD;      //加载每零个寄存器

   EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;

   EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

   EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

 

   //设置比较值

   EPwm2Regs.CMPA.Halp.CMPA = 720;                   // set比较值8us

   EPwm2Regs.CMPB = 450;                            //设置比较B值5us

 

   //设置操作

   EPwm2Regs.AQCTLA.bit.CBU = AQ_SET;                //强制EPWM1A输出高电平;高电平开关打开

   EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;             //强制EPWM1A输出低电平;高电平开关关闭

   EPwm2Regs.AQCTLB.bit.ZRO = AQ_SET;                //强制EPWM1B输出高电平;低电平开关打开

   EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR;             //强制EPWM1B输出电压低;低电平开关关闭

 

   //死机时间

   EPwm2Regs.DBCTL.bit.in_mode = 0;                  //清除事件B上的PWM1B,上升计数

   EPwm2Regs.DBCTL.bit.HALFCYCLE = 0;                //清除事件B上的PWM1B,上升计数

   EPwm2Regs.DBCTL.bit.POLSEL = 0;                   //清除事件B上的PWM1B,上升计数

   EPwm2Regs.DBCTL.bit.out模式=2;                 //清除事件B上的PWM1B,上升计数

   EPwm2Regs.DBRED =9;                              //清除事件B上的PWM1B,上升计数0.1us

 

   //直流

   EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 1;          //TZ2输入

   EPwm2Regs.TZDCSEL.bit.DCAEVT1 = 2;                //DCAH =高,DCAL =不在乎

   EPwm2Regs.DCACTL.bit.EVT1SYNCE = 1;              //已启用同步生成

   EPwm2Regs.DCACTL.bit.EVT1SRCSEL = 0;              //0:源为DCAEVT1信号;1:源为DCEVTFILT信号

EPwm2Regs.TZCTL.bit.DCAEVT1 = 3;

   //过滤器

   EPwm2Regs.DCFCTL.bit.PULSESEL = 1;                //时基计数器等于零

   EPwm2Regs.DCFCTL.bit.BLANKINV = 0;                //空白窗口未反转

   EPwm2Regs.DCFCTL.bit.Blanke =1;                  //启用了空白窗口

   EPwm2Regs.DCFCTL.bit.SRCSEL = 0;                  //源为DCAEVT1信号

   EPwm2Regs.DCFOFFSET = 810;                        //空白窗口偏移9us

   EPwm2Regs.DCFWINDW = 180;                        //空白窗口宽度2us

}

谢谢!

Chenkai

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

    很抱歉回复太晚。 我浏览了您的代码,您的空白窗口配置似乎是正确的。 也许我错过了这里的一些东西,明天我会给您更多的更新。 感谢您的详细问题。

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

    我想我注意到的一点是,您需要更改事件触发的源信号选择寄存器的设置。
    正如您在下面的原始代码中所做的评论:
    EPwm2Regs.DCACTL.bit.EVT1SRCSEL = 0; //0:源为DCAEVT1信号;1:源为DCEVTFILT信号
    源应该是DCEVTFILT信号,而不是DCAEVT1信号。

    此致,