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/LAUNCHXL-F28069M:LAUNCHXL-F28069M Digitil 比较子模块和 DCAEVT1.sync

Guru**** 2553260 points
Other Parts Discussed in Thread: LAUNCHXL-F28069M

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/627314/ccs-launchxl-f28069m-launchxl-f28069m-digitil-compare-submodule-and-dcaevt1-sync

器件型号:LAUNCHXL-F28069M

工具/软件:Code Composer Studio

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

                                               图1.

当 ZCD 的上升沿 ,EPWM2的数字比较(DC)子模块输出 DCAEVT1.SYNC,时、ZCD 连接到 DSP,的 TZ2 (GPIO13)引脚、如图3-47所示。 如果两个上升沿之间的时间太短、它可以使用消隐窗口来过滤 ZCD 的第二个上升沿。

如图3-5所示、 DCAEVT1.SYNC 可以将 TBPHS 加载到 TBCTR、然后 TBCTR 从零增加。 当 TBCTR 被清零时、EPWM2B 被置位。 当 TBCTR 等于 CMPB 时、EPWM2B 被清零、EPWM2A 被置位。 当 TBCTR 等于 CMPA 时、EPWM2A 清零。

实验结果:

CH4 (绿色)是 ZCD、CH2 (浅蓝色)是 EPWM2A、CH1 (深蓝色)是 EPWM2B

有两个问题:

  1. 为什么 EPWM2A 在红色虚线框中不为0V、时间与 ZCD 的高级时间相同?
  2. ZCD 的第二个上升沿在第一个上升沿之后为10us。 在代码中、消隐窗口可以过滤 ZCD 的第二个上升沿、但在实验中它失败了、原因是什么?

有代码、硬件为 LAUNCHXL-F28069M:

 

#include "math.h"

#include "DSP28x_Project.h"

 

void InitEPwm2Examples(void);

 

int main (void){

 

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

 

   InitGpio();                                   //初始化 GPIO

 

   InitEPwm2Gpio()

 

   InitTzGpio()

 

   //配置 ePWM 模块

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0

 

   InitEPwm2Examples();

 

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;

   EDIS;

 

   //等待 timer0中断

   for (;;);

 

void InitEPwm2Examples()

   //设置 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_SHADODE;      //每0加载一次寄存器

   EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

   EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

   EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

 

   //设置比较值

   EPwm2Regs.CMPA.half.CMPA = 720;                   //设置比较值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_MODE = 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.DCFCTL.bit.PULSESEL = 1;                //时基计数器等于零

   EPwm2Regs.DCFCTL.bit.BLANKINV = 1;                //消隐窗口反相

   EPwm2Regs.DCFCTL.bit.Blanke = 1;                  //消隐窗口被启用

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

   EPwm2Regs.DCFOFFSET = 810;                        //消隐窗口偏移9us

   EPwm2Regs.DCFWINDOW = 180;                        //消隐窗口宽度2us

 

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

    您好!

    直流子模块能够通过触发区子模块强制 PWM 进入"高阻态"状态。 如果发生这种情况、器件将不再将引脚驱动为低电平。 默认情况下选择"High-Z"、尝试在 TZCTL 中将其切换为"Do Nothing"。  

    此致、
    Cody  

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

    Cody Watkins、您好!

    感谢你的帮助。

    根据您的建议、我修改了代码并解决了第一个问题。

     

    有原始代码和实验结果。

    //直流

    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.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;

     再次感谢您的慷慨帮助!

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

    Chenkai、

    在我看来、您是消隐 DCAEVT1。 这是您要消隐的事件吗?

    看起来您使用的是"反相"消隐窗口、这意味着窗口中的所有内容都不会消隐。 尝试使用" EPwm2Regs.DCFCTL.bit.BLANKINV=0 "。

    您的偏移(9US)+消隐窗口(2US)长于您的 PWM 周期(10US)、这将导致消隐和 PWM 周期之间的失准(这不是错误的、但我想确保您了解这是您配置它的方式)。

      • 较短的偏移(~2us)+消隐窗口(~6us)是否适合您的应用?(请参阅下图)
        • 请务必使用该解决方案的 BLANKINV = 0

    此致、
    Cody

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

    Cody、

     

    我想消隐 DCAEVT1。 修改后的代码如下所示:

      //直流

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

      EPwm2Regs.TZDCSEL.bit.DCAEVT1 = 2;         //DCAH =高电平、DCAL =无关

      EPwm2Regs.DCACTL.bit.EVT1SYNCE = 1;         //SYNC 生成启用

      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.DFOFFSET = 810;             //消隐窗口偏移2us

      EPwm2Regs.DCFWINDOW= 180;             //消隐窗口宽度6uS

    但实验结果仍然是错误的。  我的偏移(9US)+消隐窗口(2US) 不长于我的 PWM 周期(20US)。  由于10us 处的信号错误、我想使用消隐窗口来忽略信号错误。  

    谢谢、

    Chenkai

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

    Chenkai、

    当您说您的 PWM 周期为20us 时、我很困惑。 我认为您的所有信号的周期都是10uS、我读取示波器图片的错误吗?

    在我看来、您希望每隔一个 PWM 周期使用一个消隐窗口、只要您的偏移< TBPRD、就支持该窗口。 换句话说、您需要在下一个周期之前启动消隐窗口。

    如果您以不同的方式描述您想要再次执行的操作、这可能会有所帮助。

    谢谢、
    Cody  

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

    Cody、

    实际上、我想控制 CrM (临界模式)升压电路。 当电感器电流达到谷值时、ZCD 信号会上升沿。 当电感器电流达到峰值时、ZCD 信号会下降沿。 ZCD 信号被发送到 DSP。

    我希望使用消隐窗口的原因是、当电感器电流有时达到峰值时会出现干扰信号、如图所示。 1显示。 绿色波形是我的 ZCD 信号。 看起来还可以。 但当您看到浅蓝色波形时、它是 EPWMSYNCO 信号、有时当 ZCD 信号为下降沿时、淡蓝色波形会变得很重要。 因此、我希望使用消隐窗口来过滤错误的使用。

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

    图 1

    然后再将代码用于升压电路。 我使用波形发生器生成 ZCD 信号、使用干扰信号验证我的代码。

    如图2所示、绿色波形由波形发生器生成。 其周期为10us。 它包括 ZCD 信号和干扰信号。 第一个上升沿是 ZCD 信号、第二个上升沿是干扰信号。 因此、ZCD 信号的周期为20us、干扰信号也为20us。 我希望 ZCD 信号控制 PWM、并且干扰信号会被消隐窗口忽略。 因此、我说过我的 PWM 周期为20us。 我的偏移(9-11us) 小于 TBPRD (20us)。

    在我看来、如果编码正确、则第一个信号是 ZCD 信号、然后 EPWM1B 设置为高电平。 6us 后、EPWM1B 清零。 然后第二个信号是来自干扰信号、它将通过消隐窗口进行滤波、因此 EPWM1B 保持为零。 但实验结果不匹配。

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

    图2.

    谢谢、

    Chenkai