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/TMS320F28379D:动作限定器连续 S/W 强制(AQCSFRC)寄存器和 PWM 第一脉冲

Guru**** 2530270 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/762744/ccs-tms320f28379d-action-qualifier-continuous-s-w-force-aqcsfrc-register-and-pwm-first-pulse

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

大家好、  

我正在制作一个程序、其中我使用以下命令:

EPwm1Regs.AQCSFRC.bit.CSFA = 0;  

EPwm1Regs.AQCSFRC.bit.CSFB = 0;

EPwm1Regs.AQCSFRC.bit.CSFA = 2;  

EPwm1Regs.AQCSFRC.bit.CSFB = 2;

来控制 PWM 输出。 我遇到的问题是、在打开 PWM 后、使用以下方法产生的第一个 PWM 脉冲:

EPwm1Regs.AQCSFRC.bit.CSFA = 0;  

EPwm1Regs.AQCSFRC.bit.CSFB = 0;

默认情况下、我使用20%的占空比、但启动后的第一个脉冲似乎是~50%+-10%。

我想问、我能不能通过某种方式解决这个问题? 或者这是硬件默认设置、是这样吗? 是否有其他方法可以快速打开和关闭 PWM?

提前感谢您!

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

    您是否使用立即模式或阴影模式加载 AQCSFRC?
    在立即模式中、一个连续的强制在下一个 TBCLK 边沿上生效。 在影子模式下、连续强制在影子加载到活动寄存器后的下一个 TBCLK 边沿生效。 要配置影子模式、请使用 AQSFRC[RLDSF]。

    如果您使用立即模式、则第一个脉冲的占空比实际上取决于软件写入寄存器的时间。
    在下一个 TBCLK 周期中观察到这种影响。 因此、很难控制确切的占空比。
    您可以尝试使用上述阴影模式来克服这一问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯... 我使用 RLDSF=11.... '^^、
    感谢您的建议! 我将在明天尝试更改它。

    我还使用 HRPWM 函数、是否可以将影子寄存器与 HRPWM 一起使用?...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以尝试改用 RLDSF=0 ZERO。
    HRPWM 函数应独立于 AQCSFA 配置。
    单独更改 RLDCSF 不应影响 HRPWM 操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经尝试过您建议的方法
    (我已将 RLDCSF 的值从3更改为0,比我尝试的1和2更改为1)
    不管用... 第一个脉冲仍为~50%。
    还有其他建议吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否共享 PWM 配置-操作限定符设置等?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、当然可以。
    volatile struct ePWM_regs  * ePWM[]  ={&EPwm1Regs、&EPwm2Regs、&EPwm3Regs、&EPwm4Regs、&EPwm5Regs、 EPwm6Regs、&EPwm7Regs、&EPwm8Regs};

    InitEPwm (uint32周期)

    uint16 j;  
    for (j=0;j<8;j++)  

    (* ePWM[j]).AQSFRC.bit.RLDSF = 0;

    (* ePWM[j]).TBPRD =周期;  
    (* ePWM[j]).TBCTR = 0x0000;
    (* ePWM[j]).TBCTL.bit.PRDLD = 0;

    (* ePWM[j]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    (* ePWM[j]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (* ePWM[j]).TBCTL.bit.CLKDIV = TB_DIV1;  

    (* ePWM[j]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;
    (* ePWM[j]).cmPCTL.bit.SHDWBMODE = CC_SHADOW;
    (* ePWM[j]).cmPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;
    (* ePWM[j]).cmPCTL.bit.LOADBMODE = CC_CTR_ZERO _PRD;

    (* ePWM[j]).cmpa.bit.cmpA =(* ePWM[j]).TBPRD/2;  
    (* ePWM[j]).cmpa.bit.cmpaHR =(1 << 8);  

    (* ePWM[j]).AQCTLA.bit.CAU = AQ_CLEAR;  
    (* ePWM[j]).AQCTLA.bit.CAD = AQ_SET;  

    (* ePWM[j]).AQCTLB.bit.CAU = AQ_SET;
    (* ePWM[j]).AQCTLB.bit.CAD = AQ_CLEAR;

    EALLOW;

    (* ePWM[j]).HRCNFG.ALL = 0x0;
    (* ePWM[j]).HRCNFG.bit.EDGMODE = HR_BEP;
    (* ePWM[j]).HRCNFG.bit.CTLMODE = HR_CMP;
    (* ePWM[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO _PRD;
    (* ePWM[j]).HRCNFG.bit.EDGMODEB = HR_BEP;
    (* ePWM[j]).HRCNFG.bit.CTLMODEB = HR_CMP;
    (* ePWM[j]).HRCNFG.bit.HRLOADB = HR_CTR_zero_PRD;  
    (* ePWM[j]).HRCNFG.bit.AUTOCONV = 1;

    (* ePWM[j]).HRPCTL.bit.TBPHSHRLOADE = 1;
    (* ePWM[j]).HRPCTL.bit.HRPE = 0;

    (* ePWM[j]).DBCTL.bit.out_mode = DB_full_enable;
    (* ePWM[j]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
    (* ePWM[j]).DBCTL.bit.IN_MODE = DBA_ALL;
    (* ePWM[j]).DBCTL.bit.OUTSWAP = 3;
    (* ePWM[j]).DBCTL.bit.HALFCYCLE = 1;
    (* ePWM[j]).DBFEDHR.bit.DBFEDHR =(0 << 9);
    (* ePWM[j]).DBFEDHR.bit.DBFEDHR =(0 << 9);

    DBref =((long)(TOTZET+0))>15;//转换为 IQ0 (需要 DBRED/DBFED、因为它们是高字节)(整个部分)
    DBtemp =(TOTZET+0)-((long) DBref<15);//分裂
    DBHRref = DBtemp<<1;//转换为 Q16 //只在 DBHRRED/DBHRFED 的高位写入分数部分

    (* ePWM[j]).DBRED.bit.DBRED = DBref;
    (* ePWM[j]).DBREDHR.bit.DBREDHR = DBHRref;
    (* ePWM[j]).DBFED.bit.DBFED = DBref;
    (* ePWM[j]).DBFEDHR.bit.DBFEDHR = DBHRref;

    (* ePWM[j]).HRCNFG2.bit.EDGMODEPB = HR_BEP;
    (* ePWM[j]).HRCNFG2.bit.CTLMODEDBRED = 0;// ZRO 上的负载
    (* ePWM[j]).HRCNFG2.bit.CTLMODEDFED = 0;// ZRO 上的负载

    (* ePWM[j]).ETSEL.bit.SOCAEN = 1;
    (* ePWM[j]).ETSEL.bit.SOCASEL = 2;
    (* ePWM[j]).ETPS.bit.SOCAPRD = 2;

    if (j==0)

    (* ePWM[j]).TBPHS.bit.TBPHS = 0;
    (* ePWM[j]).TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    (* ePWM[j]).TBCTL.bit.PHSEN = TB_DISABLE;

    其他

    (* ePWM[j]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    (* ePWM[j]).TBCTL.bit.PHSEN = TB_ENABLE;

    EDIS;

    (* ePWM[j]).TBCTL.bit.SWFSYNC = 1;

    此函数用于打开和关闭我需要的 PWM 通道。  

    UpdateModule (int 值)

    uint16 j;

    if (value > value_MAX)

    值= value_MAX;

    if (值< 0)

    值= 0;

    对于(j=0;<VALUE;j++)

    (*Regulator[j]).ui=DC;  
    D_MOD[j]=直流;  

    if (j<=(value)/2)  

    PHS1 =(* ePWM[j]).TBPRD*2/(浮点)值*j;
    IQPHS1 = PHS1 * 32768;
    PHSref =(long)(IQPHS1)>15;
    PHStemp =(IQPHS1)-((long) PHSref<15);
    PHSHRref = PHStemp<1;
    (* ePWM[0]).TBPHS.ALL = 0;
    (* ePWM[j]).TBPHS.bit.TBPHS = PHSref;
    (* ePWM[j]).TBPHS.bit.TBPHSHR = PHSHRref;

    (* ePWM[j]).TBCTL.bit.PHSDIR = TB_DOWN;


    其他

    PHS2 =(float)((* ePWM[j]).TBPRD*2 -(* ePWM[j]).TBPRD*2/(float)值*j);
    IQPHS2 = PHS2 * 32768;
    PHSref =(长整型)(IQPHS2)>>15;
    PHStemp =(IQPHS2)-((long) PHSref<15);
    PHSHRref = PHStemp<1;
    (* ePWM[0]).TBPHS.ALL = 0;
    (* ePWM[j]).TBPHS.bit.TBPHS = PHSref;
    (* ePWM[j]).TBPHS.bit.TBPHSHR = PHSHRref;

    (* ePWM[j]).TBCTL.bit.PHSDIR = TB_UP;

    if (flag_BiDirect!= 1)

    if (i_ref >= 0)

    (* ePWM[j]).AQCSFRC.bit.CSFB = 2;
    (* ePWM[j]).AQCSFRC.bit.CSFA = 0;
    (* ePWM[j]).DBCTL.bit.OUT_MODE = DB_DISABLE;
    (* ePWM[j]).DBCTL.bit.OUTSWAP = 0;


    其他

    (* ePWM[j]).AQCSFRC.bit.CSFA = 2;
    (* ePWM[j]).AQCSFRC.bit.CSFB = 0;
    (* ePWM[j]).DBCTL.bit.OUT_MODE = DB_DISABLE;
    (* ePWM[j]).DBCTL.bit.OUTSWAP = 0;  



    其他

    (* ePWM[j]).DBCTL.bit.out_mode = DB_full_enable;
    (* ePWM[j]).DBCTL.bit.OUTSWAP = 3;
    (* ePWM[j]).AQCSFRC.bit.CSFA = 0;
    (* ePWM[j]).AQCSFRC.bit.CSFB = 0;

    if (i_ref >= 0)

    for (j=value;j<8;j++)

    (* ePWM[j]).AQCSFRC.bit.CSFA = 2;
    (* ePWM[j]).AQCSFRC.bit.CSFB = 2;
    (* ePWM[j]).DBCTL.bit.OUT_MODE = 0;

    for (j=value;<VALUE_MAX; j++)

    D_MOD[j]=直流;
    (*稳压器[j]).Ref = 0;
    (*稳压器[j]).FBK = 0;
    (*稳压器[j]).err_old = 0;
    (*稳压器[j]).Stoer = 0;
    (*稳压器[j]).out = 0;
    (*稳压器[j]).up = 0;
    (*Regulator[j]).ui=0;
    (*稳压器[j]).v1 = 0;
    (*稳压器[j]).err = 0;

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

    您好!

    我尝试了类似的配置、但无法复制您上面提到的条件。
    我确实观察到、即使在 CSFA 为零后的第一个周期中、占空比也是预期的。
    为了导致此问题的根本原因、您是否可以禁用同步操作并进行检查?
    我确实看到您在 PHSEN 开/关条件之间切换。 您能否始终将其关闭并进行检查。
    我想知道第一 个 PWM 周期上的意外占空比是否是由一些其他配置而不仅仅是 CSFA 更改引起的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Anton、
    自您上次答复以来已经有一段时间了、如果您仍面临此问题、请解决 Bharathi 的问题、以便我们可以继续调试。
    谢谢、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题似乎是在相移操作...
    由于发现了解决这个问题的另一种方法、我现在将其保留一段时间。
    感谢大家的帮助!