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.

[参考译文] TMS320F2.8023万:当CBC在5个连续的开关周期中发生时,如何配置ePWM以锁定?

Guru**** 2391345 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/642772/tms320f28023-how-to-config-epwm-to-be-latched-while-cbc-occurs-in-5-consecutive-switch-cycle

部件号:TMS320F2.8023万

尊敬的C2000专家:

我想使用F2.8023万的ePWM在CBC模式下工作,并要求在5个连续的开关循环中发生CBC后锁定ePWM。  

但是我遇到了一个问题,如果我清除TZCLR寄存器,PWM在CBC模式下不工作。 TZCLR寄存器清除后TZ状态似乎消失了。 请您分享您对此的意见吗?

我的操作顺序如下所示:

在每个PWM周期中ISR:

-阅读TZFLG以查看是否发生CBC

-如果是CBC,则统计数字并设置TZCLR寄存器(这将导致PWM问题),如果是连续的5个PWM循环,则锁定PWM

否则请清除计数器

这是我的测试波,正常的PWM周期是50us,但PWM周期在清除TZCLR寄存器后更改。

下面是我关于CBC初始化的代码:

 

void init_pfc_acomp_tTrip ePWM (void)

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.ADCENCLK =1;                //为ADC启用时钟

   AdcRegs.ADCCTL1.bit.ADCBGPWD =1;                    //比较器共享ADC的内部BG参考,即使未使用ADC,也必须为其供电

 

   //启用模拟比较器

   DELAY _US (1000);                                     //加电延迟

 

   SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK =1;              //为比较器1块启用时钟

   Comp1Regs.COMPCTL.bit.COMPDACEN =1;                 //本地通电比较器1

   //Comp1Regs.COMPCTL.bit.COMPSOURCE = 1;              //将反相输入连接到引脚COMP1B

   ////////////////// 取消注释以下2行以使用DAC,而不是引脚COMP1B //////////////////////

   Comp1Regs.COMPCTL.bit.SYNCSEL = 1;                                             //传递比较器输出的同步版本

   Comp1Regs.COMPCTL.bit.QUALSEL = 31;                                            //在Qual块CAN输出之前,块的输入必须连续3个时钟保持一致

                                                                                                                                     //更改

   Comp1Regs.COMPCTL.bit.COMPSOURCE = 0;                //将反相输入连接到内部DAC

   Comp1Regs.DACVAL.bit.DACVAL = COMP_DAC_VALUE;                    //将DAC输出设置为中点

   EDIS;

 

   EALLOW;

   //根据TZ1和TZ2定义事件(DCAEVT1)

   EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT;       // DCAH =比较器1输出

   EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = DC_TZ2;            // DCAL = TZ2

   //EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_LOW;             // DCAEVT1 = DCAH LOW (当比较器输出变为低电平时将变为活动状态)

   //EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1;               // DCAEVT1 = DCAEVT1 (未过滤)

   //EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_Async;      //采用异步路径

 

   EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_LOW;

   EPwm1Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2;// DCAEVT2 = DCAEVT2 (未过滤)

   EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_Async;//采用异步路径//启用DCAEVT2 AS

   //一触式跳闸源

 

   //注:可以定义DCxEVT1事件

   //启用DCAEVT1和DCBEVT1是一个触发跳闸源

   //注:DCxEVT1事件可以定义为单次触发。

   //      DCxEVT2事件可定义为逐周期。

   EPwm1Regs.TZsel.bit.DCAEVT1 = 0;

   EPwm1Regs.TZsel.bit.DCAEVT2 = 1;

 

   //我们希望DCAEVT1和DCBEVT1事件做什么?

   // DCAEVTx事件可以强制EPWMxA

   // DCBEVTx事件可以强制EPWMxB

   EPwm1Regs.TZCTL.bit.TZA = TZ_FORM_LO;          // EPWM1A将会高电平

   EDIS;

}

 

 

ISR中的CBC处理程序代码:

内联void ePWM_CBC_handler (void)

   挥发性接头 TZFLG_REG tzflg;

   静态内部16 CBC_COUNT = 0;

 

   EALLOW;

   tzflg.all = EPwm1Regs.TZFLG.all;

   IF (tzflg.bit.CBC == 1)/CBC发生

   {

       EPwm1Regs.TZCLL.ALL = tzflg.all;//清除CBC标志

       CBC_COUNT ++;

       IF (CBC_COUNT == 5)

       {

           turn-off-PFC ();

           PFC_VCC_OFF;

           PFC_vars.CBC_FAULT = 1;

       }

   }

   否则

   {

       CBC_COUNT = 0;

   }

   EDIS;

}

此致,

千斤顶

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

    千斤顶,

    TZ模块的正常使用情况是尽可能快地获得响应。 如果您将TZ配置为"不执行任何操作",然后在连续5次CBC跳闸后,将TZ重新配置为"清除低电平",从而导致PWM输出驱动低电平,则可以执行此操作。

    此致,
    科迪  

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

    Jack,您好!

    我建议您配置TZCTL寄存器中的每个寄存器位。  其中一些位的默认设置可能不符合您的要求,并且可能会影响您的预期。


    谢谢!
    Brett

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

    感谢您的建议,但我认为这不是解决方案。 如果发生CBC但PWM未跳闸,则会在输出短路时导致IGBT损坏。

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

    感谢您的建议。 请与我分享示例代码吗? 我只是从ePWM参考手册中复制它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在ePWM用户指南中,您会发现TZCTL寄存器中有6个寄存器位。  

    您当前只配置了TZA位。  我会将其他寄存器位配置为'o Nothing (无)'。  这将防止它们影响输出。

    ===

    如果这不起作用:
    仅清除CBC标志是否会改变您看到的行为?  (而不是清除所有TZ标志)


    谢谢!
    Brett

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

    千斤顶,

    抱歉,我误解了您的问题。 在这种情况下,CBC之旅不应明确。 您是否在某处配置了单触发逻辑? 是否可以共享"tzflg.all"的位定义?

    我同意Brett的意见,下一步好的做法是将“EPwm1Regs.TZCLL.ALL = tzflg.all;//清除 CBC 标志”更改为仅清除CBC标志。 现在它的写法可以清除许多旗帜。 这对您的程序来说可能是可以的,但为了简化调试,只允许清除CBC标志。

    此致,
    科迪  

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

    我只是在CBC模式下配置ePWM wroks,在这种情况下不需要一个短路。

    tzflg.all的位定义与TZFLG寄存器相同。

    下面是我的变量定义:
    挥发性接头TZFLG_REG tzflg;

    我刚刚验证了您的解决方案,如果我清除CBC位就没有用处。 如果清除了TZCLR寄存器中的CBC位,则ePWM的周期会发生变化。

    谢谢..
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    千斤顶,
    您是否可以共享tzflg的偏移地址并显示TZFLG_REG的定义?

    我不明白"我刚刚验证了您的解决方案,如果我清除CBC位就没有用处。"。 "不使用"是什么意思,这是否意味着当您仅清除CBC行程时代码正常工作?

    周期如何变化? 它是更短还是更长? 我不希望PWM周期因TZCLR而改变"如果TZCLR寄存器中的CBC位被清除,ePWM的周期就会改变。"

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

    您好,Cody:

    请注意,我的要求是在连续发生5或10次CBC后锁定ePWM,并且ePWM应因CBC事件而跳闸。

    您似乎仍然不明白我遇到了什么问题。  请参阅下面的波形,我在其上做了一些标记。 位置A是CBC事件,我清除了位置B处TZCLR寄存器的CBC位。在我看来,EPWMxA被CBC触发,但EPWMxA在清除TZCLR寄存器中的CBC位后再次拉高,这不是我想要的。 我希望ePWM在下一个开关循环而不是此循环中打开。 希望您已了解我的情况。

    TZFLG_REG的定义在DSP2802x_ePWM.h中,这里是。

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

    //跳闸区域标志寄存器位定义*/

    结构TZFLG_Bits {     // BITS 说明

     UINT16 INT:1;      //   0全局状态

     UINT16 CBC:1;      // 1   跳闸区域按周期循环内部

     UINT16 OST:1;      // 2   个跳闸区域单触发内部

     UINT16 DCAEVT1:1;   //   3强制DCAEVT1事件

     UINT16 DCAEVT2:1;   // 4   强制DCAEVT2事件

     UINT16 DCBEVT1:1;   // 5   强制DCBEVT1事件

     UINT16 DCBEVT2:1;   // 6   强制DCBEVT2事件

     uINT16 rsvd2:9;     //15:7 保留

    };

    联合TZFLG_REG{

     UINT16.          全部;

     结构TZFLG_Bits   位;

    };

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

    是否有任何有关此问题的更新? 谢谢...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Cody和Brett,

    请您帮忙分享一些有关这方面的意见吗? 谢谢...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    千斤顶,

    很抱歉耽误你的时间。 清除TZFLG.CBC不会影响PWM的输出,清除CBC跳闸的唯一事件是Counter=0。 这项功能已经过很好的测试,所以我不认为有缺陷。

    此电路中有两个因素也会强制PWM输出过低,并在任何点清除。

    1. 如果配置了单触发跳闸,则会强制PWM过低,并且写入TZCLL.OSHT将清除跳闸。
    2. 数字比较事件  (DCAEVT1,DCAEVT2,DCBEVT1或DCBEVT2)会强制PWM输出过低。 如果比较器事件被清除,则会导致跳闸事件在任何点被清除。

    如果您对本线程前面建议的代码进行了修改,那么我认为数字比较事件强制PWM输出为低电平,而不是CBC跳闸。  


    此致,
    科迪  

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

    我知道CBC断路经过了很好的测试,工作正常,但我需要的是ePWM应在连续5或10次CBC发生后强制降低。 是否可以对该芯片执行此操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    千斤顶,

    是的,您应该能够在连续的BC跳闸x次后强制输出为低电平。

    我会使用与您尝试的方案非常相似的方案:

    1. 将ePWMx ISR设置为在TBCTR =0处中断
    2. 禁用所有DCxEVTy
    3. 禁用OSHT跳闸
    4. 将CBC跳闸设置为强制低档
    5. 编写一个ePWM ISR
      1. 如果设置了CBC标志,则递增变量,否则清除该变量
      2. 如果变量大于阈值,请重新配置AQ或TZ 以关闭PWM
      3. 清除CBC标记
      4. 确认中断

    有什么不清楚的吗?

    此致,
    科迪

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

    您好,Cody:

    感谢您的大力支持。 此问题已修复。

    再次感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    千斤顶,
    我很高兴您的问题已得到解决。

    如果您有任何其他问题,请在论坛上开始另一个话题,我们很乐意为您提供帮助!

    此致,
    科迪