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.8035万:PWM同步:"SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0"来自CLA不正常

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/659676/tms320f28035-pwm-synchronization-sysctrlregs-pclkcr0-bit-tbclksync-0-from-cla-not-ok

部件号:TMS320F2.8035万

您好,
我正在将Piccolo (TMS320F2.8035万NT CA-31AVKVW G4)与CCS Vers.CPU 7.4 0 (以及用于CPU和CLA的C代码)配合使用。 PWM1,2和3正在运行
具有相同频率(即相同的TBPRD值)并生成三相信号。 PWM1是主设备,PWM2由PWM1同步
(相对于tp PWM1,滞后120°),PWM3与PWM2同步(相对于PWM2,滞后120°)。
当系统正在运行并且我想更改PWM频率(新的TBPRD和TBPHS值)时,我在CPU中使用以下过程,它工作正常:
   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC =0; //停止所有TB时钟,需要EALLOW

   EPwm1Regs.TBPRD = u2a.wm_tbprd;//设置 新的期间值
   EPwm2Regs.TBPRD = u2a.wm_tbprd;
   EPwm3Regs.TBPRD = u2a.wm_tbprd;

   EPwm2Regs.TBPHS.Half.TBPHS = u2a.PWM_tbphs;//设置 新的相位值
   EPwm3Regs.TBPHS.Half.TBPHS = u2a.pwm_tbphs;

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

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC =1; //开始,需要EALLOW
   EDIS;

另一种方法是将代码放入CLA任务并在其中执行,用__meallow()/__medIS()替换EALLOW/EDIS。
不幸的是,这不起作用(PWM1输出正常,但PWM2输出为0,PMW3输出的相位通常不正确)。
如果我在“SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC =0;”命令后面放置一个无限循环,则激活频率更改(这会导致无限循环) ,然后
检查调试器中的TBCLKSYNC位,然后如果我在CPU中执行代码,我看到0 (应该看到的),如果我执行,我看到1
CLA中的代码。 我的代码中是否存在任何不允许的内容?

非常感谢您提出的有用建议,
Leo

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

    您能否确认CLA写入成功?

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

    我们认为,我们已经确定了这个问题。 CLA没有对sysctrl寄存器的访问权限。

    因此,CLA无法执行此写入操作:SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC =0;

    您必须让C28x执行此写入。 您可能需要C28x来更新PWM, 或者,您需要在C28x和CLA之间进行一些同步,以便让CLA知道何时可以写入这些PWM寄存器,然后告诉C28x再次写入sysctrl寄存器。

    此致,
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Sal,
    我已经怀疑CLA无法更改TBCLKSYNC位。 因此,我通过CPU更改它。 非常感谢您的检查。
    此致,
    Leo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Leo,

        我想澄清的是,您不需要在每次更新周期/阶段时禁用PWM (设置TBCLKSYNC =0)。 用户指南仅针对初始配置提出此建议。 请注意,可能会发生几种危险情况,我可以想到的两种情况是:

    • 缺少比较事件,当您将加载相位增加到高于CMP值的值时,会发生这种情况。 结果将是PWM在一段时间内保持高或低,具体取决于您的配置
    • 一个PWM更新而另一个PWM不更新的可能性,当PWM期间结束时,在写入PWM1的期间之后,但在PWM2或PWM3之前,可能会发生这种情况。 这将导致PWM期间不匹配的1个期间。

    您需要查看您的系统并定义更新周期和阶段的时间。

    此致,
    科迪  

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

    非常感谢您对我的问题的关注。

    我知道在正在运行的系统中更改PWM寄存器时可能会出现电源电子硬件问题。
    在CLA任务1,2,3中,我检查打开PWM1,2,3的条件,如果满足条件(实际相电流小或零,因为我们在具有峰值电流模式控制的非连续传导模式下工作),我打开PWM一次SW强制事件"EPwmxRegs.AQSFRC.Bit.OTSFA = 1;"。

    因此,我认为以下用于更改活动PWM的数量及其频率的CPU代码是安全的,尽管我在执行之前没有检查正在运行的PWM的状态:

    EPwm1Regs.AQSFRC.bit.ACTSFA = 0;//输出A上的一次性SW强制事件已禁用
    EPwm2Regs.AQSFRC.bit.ACTSFA = 0;
    EPwm3Regs.AQSFRC.bit.ACTSFA = 0;

    EPwm1Regs.AQCSRC.bit.CFFA = 1;//在输出A上强制连续低电平
    EPwm2Regs.AQCSFRC.bit.CSFA = 1;
    EPwm3Regs.AQCSFRC.bit.CSFA = 1;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC =0;//停止所有TB时钟,需要EALLOW

    EPwm1Regs.CMPA.Half.CMPA = u2a.pwm_cmpa;//设置新的最大占空比
    EPwm2Regs.CMPA.Half.CMPA = u2a.pwm_cmpa;
    EPwm3Regs.CMPA.Half.CMPA = u2a.pwm_cmpa;

    EPwm1Regs.TBPRD = u2a.wm_tbprd;//设置新的PWM周期
    EPwm2Regs.TBPRD = u2a.wm_tbprd;
    EPwm3Regs.TBPRD = u2a.wm_tbprd;

    如果(u2a.n_PWMs == 1){//设置新的活动PWM数
    EPwm1Regs.AQSFRC.Bit.ACTSFA =2;//调用一次性SW force A时设置输出A
    }否则,如果(u2a.n_PWMs ==2){
    EPwm1Regs.AQSFRC.Bit.ACTSFA = 2;
    EPwm2Regs.AQSFRC.Bit.ACTSFA = 2;
    }否则,如果(u2a.n_PWMs ==3){
    EPwm1Regs.AQSFRC.Bit.ACTSFA = 2;
    EPwm2Regs.AQSFRC.Bit.ACTSFA = 2;
    EPwm3Regs.AQSFRC.Bit.ACTSFA = 2;
    }

    EPwm2Regs.TBPHS.Half.TBPHS = u2a.pwm_tbphs;//设置新的相位同步值
    EPwm3Regs.TBPHS.Half.TBPHS = u2a.pwm_tbphs;

    EPwm1Regs.TBCTR = 0x0000;//清除重新启动计数器
    EPwm2Regs.TBCTR = 0x0000;
    EPwm3Regs.TBCTR = 0x0000;

    EPwm1Regs.AQCSRC.bit.CFFA = 0;//禁用持续SW力
    EPwm2Regs.AQCSFRC.bit.CSFA = 0;
    EPwm3Regs.AQCSFRC.bit.CSFA = 0;

    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//重新启动,需要EALLOW
    EDIS;

    首先,我禁用一次性SW强制事件(用于CLA代码)。 然后,我应用连续SW强制以关闭所有PWM和相应的电源开关。 然后关闭PWM时钟,更改活动PWM和PWM寄存器的数量,然后重新启动PWM。 可能丢失PWM中断并不会给我带来太多的困扰,到目前为止,这似乎是可行的。
    我的代码块的执行时间约为4US,在此期间PWM不工作,也许在一两个同步期间不会是问题。

    在您看来,我的代码中不需要命令TBCLKSYNC =0和TBCLKSYNC =1? 一开始我就忘记了EALLOW/EDIS命令,代码通常不能正常工作。 PWM1始终正常,但PWM2经常产生零输出,并且PWM2的相位不正确。 在插入EALLOW/EDIS后,它就开始了。 然后,我将代码放入CLA task7,并使用__meallow()/__medis()代替EALLOW/EDIS,代码的行为与我之前描述的情况相似,当时我忘记了CPU代码中的EALLOW/EDIS命令。 所以我检测到TBCLKSYNC位无法从CLA更改。
    现在我做了一个额外的小实验,从上面的代码中删除了代码行EALLOW,TBCLKSYNC =0和TBCLKSYNC =1,然后再次检查。 行为不正常。 所以,对我来说,我似乎需要这些代码行。

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

    我必须补充一点意见:
    如果我不使用TBCKLKSYNC位并在我的PWM频率更改代码末尾将所有PWM计数器设置为0,则PWM同步似乎存在问题。

    另一方面,当我想更改PWM频率时,如果我不在我的代码段末尾将所有PWM计数器重置为0,我就不需要修改TBCKLKSYNC位。 如果,例如我设置
    EPwm1Regs.TBCTR = 0xFF0;//重新启动时的"清除"计数器
    EPwm2Regs.TBCTR = 0xFFF4;
    EPwm3Regs.TBCTR = 0xFFF8;
    该代码在CPU或CLA中执行时工作正常。

    此致,
    Leo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Leo,
    很抱歉耽误您的时间,请允许我花些时间仔细考虑您的问题。

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

    Leo,

        请通读此帖子 https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/317898。31.7898万。 它强调了我认为您可能遇到的一个问题。  这说明了您的ePWM2可能在一段时间内偏低的原因。 不正确的相移可能是另一个问题,但很难判断您是否错过了CMPx事件。

    此致,

    科迪

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

    Cody,

    非常感谢 您的信息。 目前,我的解决办法似乎已经足够。 如有必要,我将在稍后介绍详细信息。

    此致,

    Leo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Leo,
    好的,听起来不错。 我认为您在更新值时暂停PWM操作的解决方案是解决此问题的令人满意的方法。

    我将关闭此线程,如果您有更多问题,请随时以新线程返回此处。

    此致,
    科迪