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.

[参考译文] TMS320F28377D:CBC 跳闸时具有零/低斜坡参考值的意外 PWM 输出

Guru**** 2530350 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/601875/tms320f28377d-unexpected-pwm-output-with-cbc-trip-with-zero-low-ramp-reference-value

器件型号:TMS320F28377D

我正在研究实现的峰值电流模式控制。 大部分情况下工作正常、但我看到 RAMPMAXREF 值较低时出现问题。 我具有带死区时间的逐周期限制功能、使用模拟比较器触发数字比较事件、然后在 PWM 的 AQ 块中触发 T1事件。

TBPRD = 999

CMPA = 500 (50%占空比)

RAMPMAXREFS = 2000

黄色= PWM A

粉红色= PWM B

预期行为、PWM A 通道在 CMPA 正常触发之前被切断。

  

当我将 RAMPMAXREFS 设置为低于某个值时、门的行为异常。

RAMPMAXREFS = 0 (高达450左右的类似行为)

 

我希望模拟比较器能够在 RAMPMAXREFS 较低时立即跳闸、并保持 PWM A 通道低电平和 PWM B 通道高电平。 相反、我得到这种中间行为、它看起来像比较器会针对 PWM A 通道而即时跳闸、但不会针对 PWM B 通道跳闸。 以八为正方向、PWM B 通道将保持低电平、而 PWM A 通道将输出50%。 当然不是很好的情况。

是否有任何想法正在发生什么以及如何解决此问题? 如果有任何见解,将不胜感激。 谢谢!

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

    Noah、您好!

    您是否看到所有 RAMPMAXREF 值从0到450的这种行为、或者此频段中有一些值似乎起作用? 您能否分享您的动作限定符(AQ)设置? 我假设 PWMA 的上升沿到下降沿是跳闸区域动作的结果、而 PWMB 的下降沿到上升沿是 T1 AQ 事件的结果。 是这样吗? 您是否使用斜坡补偿、即 RAMPDECVAL?

    这里有一些可能的解释。 一旦我获得上述信息、我们就可以缩小这些范围。

    谢谢。

    Hrishi

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

    Hrishi、您好!

    感谢您的联系。

    我在0到450频带中没有看到任何预期行为。 不过、正常行为返回的 RAMPMAXREF 的上限位会有所不同。 我正在使用斜坡补偿、但如果我设置 RAMPDECVAL = 0、我没有看到任何行为变化。

    这是我的 AQ 设置。

    EPwm6Regs.AQCTLA.bit.ZRO = 0x2; //在 CTR=Zero
    EPwm6Regs.AQCTLA.bit.CAU = 0x1时设置 PWMxA; //清除事件 A 上的 PWMxA,向上计数
    EPwm6Regs.AQTSRCSEL.bit.T1SEL = 0x1;//将 DCA_EVT1配置为 T1事件
    EPwm6Regs.AQCTLA2.bit.T1U = 0x1的触发; // T1事件触发 PWM6A 变为低电平 

    我的目标是将 PWMA 设置为零、然后在 T1 AQ 事件或 CTR=CMPA 时清除。 然后、PWMB 将是插入了一些死区时间的互补器件。 我确实使用数字比较事件在整个电路板上进行了这项工作、但后来意识到它在死区功能之后操纵了 PWM 信号。

    这也是我的整个 PWM/比较器设置、以防有助于澄清任何问题。

    
    
    //将 EPwm6配置为同步降压/-------------------------------------------------------
    
    
    EALLOW;
    //为 ePWM6A 和 ePWM6B (分别配置 GPIO10和 GPIO11)
    GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1;// 0 = GPIO、1 = EPWM6A、2 = CANR6B (I)、3 = ADCSOCBO (O)
    GPOX1=GPIO1.GPIO2=GPIO1.GPIO=GPIO1.GPIO1.GPIO=GPIO1.GPIO=GPIO1.GPIO1.GPIO=GPIO1.GPIO1.GPIO=GPIO1.GPIO1.GPIO=GPIO1.GPIO1.GPIO=GPIO1.GPIO1.GPIO1.GPIO=GPIO1.GPIO=GPIO1.GPIO1.GPIO=GPIO1.GPIO=GPIO1.GPIO1.
    //禁用 GPIO10 (EPWM6A)
    GpioCtrlRegs.GPAPUD.bit.GPIO11 = 1; //禁用 GPIO11 (EPWM6B)上的上拉
    
    电阻//将 EPWM6分配给 CPU1
    DevCfgRegs.CPUSEL0.bit.EPWM6 = 0;
    
    //结束受保护寄存
    器 EDIS;
    
    EPwm6Regs.TBCTL.bit.PRD = 0;
    
    //周期= u32PwmPerd9 = 0;/ Tbt
    
    
    
    = 0;/计数
    
    器 Tbt = 0;/计数器 Tbt = 0;/计数器= Tbt = 0;/计数器= Tbt
    非对称模式
    // TB_COUNT_DOWN: 非对称模式
    // TB_COUNT_UPDOWN:对称模式
    EPwm6Regs.TBCTL.bit.CTRMODE = 0;
    
    // TB_DISABLE: 相位加载被禁用
    EPwm6Regs.TBCTL.bit.PHSEN = 0;
    
    // TB_SYNC_DISABLE:输出同步信号断开
    //(即 ePWMn+1模块不会同步到当前的 ePWMn、模块)
    EPwm6Regs.TBCTL.bit.SYNCOSEL = 3;
    EPwmLx =
    
    0位 EPwmCLR2.tbn.TBIN.TBIN.TBIN.0/时钟位0 = 0;EPmCLKCLM0.
    
    
    //首次运行时停止 TB 模块
    EPwm6Regs.TBCTL.bit.FREE_SOFT = 0x3;
    
    //清除计时器计数
    器 EPwm6Regs.TBCTR = 0x0000;
    
    //在计数器=周期
    EPwm6Regs.CMPCTL.bit.LOADAMODE = 1时加载新的比较值;//
    在更新 EPwmCTL.R=0=0XDPM6Rd.AMRd.Rd.Rd.Rd.CMT.CMTL.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.Rd.
    
    
    //在 CTR=Zero
    EPwm6Regs.AQCTLA.bit.CAU = 0x1时设置 PWMxA; //清除事件 A 上的 PWMxA,向上计数
    EPwm6Regs.AQTSRCSEL.bit.T1SEL = 0x1;//将 DCA_EVT1配置为 T1事件
    EPwm6Regs.AQCTLA2.bit.T1U = 0x1的触发; // T1事件触发 PWM6A 变为低电平
    
    //启用对受保护寄存
    器 EALLOW 的写入;
    
    //初始化 HRPWM 扩展
    EPwm6Regs.CMPA.bit.CMPAHR =(1 << 8);
    
    //复位 HRPWM 配置寄存
    器 EPwm6Regs.HRCNFG.ALL = 0;
    
    //启用 MEP 控制在:
    //上升沿
    :// Ep_HRESR
    ://下降沿:// 上升沿和下降沿(对于相移拓扑有用)
    EPwm6Regs.HRCNFG.bit.EDGMODE = 2;
    
    // CMPAHR 控制 MEP (周期模式)
    EPwm6Regs.HRCNFG.bit.CTLMODE = 0;
    
    // CTR 上的影子负载=周期 EPwm6Regs.HRCNG.auth
    
    
    
    =
    1;//将 PHYCONV.AUTO.CONTRATE = 1;// PWRCONVERT = 1 = 1;//将 PHYCONVERT = 1转换为 PHY.AUTOCONV.AUTO.CONTRATE = 1;
    #endif
    
    //打开高分辨率周期控制
    EPwm6Regs.HRPCTL.bit.HRPE = 1;
    
    //同步高分辨率周期
    EPwm6Regs.TBCTL.bit.SWFSYNC = 1;
    
    //禁用对受保护寄存器
    EDIS 的写入;
    
    #if (CONVERT)
    //调用 SFO ()使用经校准的 HRMSTEP 寄存器更新 HRMEP 系数。
    // MEP_ScaleFactor/HRMSTEP 必须用校准值填充。
    u16SfoStatus = SFO_INcomplete;
    
    //在
    完成时调用(u16SfoStatus == SFO_INCOMPLETE)
    {
    //检查 SFO 更新
    的状态 u16SfoStatus = SFO ();
    if (u16SfoStatus =SFO_ERROR)
    {
    //如果发生错误,SFO 函数返回2,MEP 步进数/粗步进数返回#
    //超过最大255。
    ESTOP0;
    }
    
    #endif
    
    EPwm6Regs.CMPA.ALL = 0;
    
    EPwm6Regs.TBPHS.bit.TBPHS = 0;
    
    //启用或禁用将 PWM 模块的相位寄存器加载到时基输出器
    //(引入 u16PwmPhaseTicksn 的延迟);//启用或禁用 EPwmCR0.TBR0.THRES.PHS0
    
    
    =
    
    
    0
    
    位/TBRAN.THRCOL = 0;EPmCOL = 0;EPwCL.TBR0.THREST.THREST.THREST.THREST.THRESR = 0;= 0位= 0;0;0位/TBR0/ 0 = 0;0 = 0 = 0 = 0位/THRESPHMORT.THRESCOL = 0;0 = 0;
    
    // TBPHSHR 控制 MEP (相位模式)、默认为周期、否则
    EPwm6Regs.HRCNFG.bit.CTLMODE = 0;
    
    
    EPwm6Regs.TZSEL.bit.DCBEVT1 = 1;
    
    //配置 PWM 通道操作(跳匣区域触发 EPwm6Regs.TZCTL.bit.EPIC.T6ZL
    
    
    
    
    = 2);EPwZCCTL = 0;EPT2.T6ZL = 0 = 0;EEPwZEPI.TVB_DED = 0;TVBDADDR.T6ZL = 2;TVBDOND = 0;EPTH = 0 = 0;EPTZ2/ DED = 0
    
    
    //启用和配置死区模块
    EPwm6Regs.DBCTL.bit.IN_MODE = 0;
    
    // A 和 B 通道极性
    EPwm6Regs.DBCTL.bit.POLSEL = 2;
    
    //在 TBCLK 单元中配置下降沿和上升沿延迟
    EPwm6Regs.DBFSEL.bit.DBFRED
    = 2;//在 DBWRED.SOD
    
    =
    1;EEPwm6LD.EN.DBRTED= 1;EEPw20.EN.DBRTED=2
    //配置转换开始选择
    EPwm6Regs.ETSEL.bit.SOCASEL = 4;
    //配置 SOC 周期的事件选择
    EPwm6Regs.ETPS.bit.SOCAPRD = 1;
    
    //启用保护模式寄存
    器 EALLOW;
    
    //选择数字比较事件以引起跳闸区域事件
    // DCxEVT2/SOCARD= 2
    周期;//启用保护模式寄存器 EALLOW;//选择数字比较事件以引起跳闸区域事件= 2周期 EEPwREP.DCAL.2周期;
    //从 TRIP4IN
    EPwm6Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 3选择数字比较高电平事件
    
    (即应用消隐窗口逻辑)
    EPwm6Regs.DCACTL.BIT.EVT2SRCSEL = 0;
    
    //配置同步或异步触发
    EPw40SRL =
    
    
    1位 EPT6RCLA.EPT6RMS1.EPT6位源= 1;// EPTMCTL = 1位 EPT6RESL = 0;//异步或异步触发 EPwCMR1R1RC.EPT6RC.EPT6RC.EFR4R =源代码
    
    //时基计数器等于周期(TBCTR = TBPRD)或0 (TBCTR = 0)
    EPwm6Regs.DCFCTL.bit.PULSESEL = 1;
    
    //配置消隐
    //滤波器块使用正常或反相的消隐窗口极性
    EPwm6Regs.DCFCTL.bit.BLANKINV = 0;
    //禁用屏蔽/禁用屏蔽/屏蔽/禁用屏蔽
    
    
    
    
    
    //过滤器块消隐窗口长度
    EPwm6Regs.DCFWINDOW = 0;
    // Fll 块消隐窗口偏移量(然后消隐窗口开始)
    EPwm6Regs.DFOFFSET = 0;
    
    //通过 ePWM X-BAR 将比较器3高输出连接到 TRIN4 (mux 4 = 0)
    EALLOW;
    EPwmUXTREMUXREGS.MUX = 0---
    
    
    
    
    
    //配置比较器
    -------------------------------------------------------
    
    EALLOW;
    
    //ADC A
    CpuSysRegs.PCLKCR14.bit.CMPSS3 = 0;//disble clock
    //将 CMPSS 分配给 CPU1
    DevCfgRegs.CPUSEL12.bit.CMPSS3 = 0;
    CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1
    ;启用/启用逻辑/启用/启用 DAC
    Cmpss3Regs.COMPCTL.bit.COMPDACE = eAdcCompEnableIn;
    
    //为 DAC 配置基准
    Cmpss3Regs.COMPDACCTL.bit.SELREF = 0;
    
    //选择同步或异步比较器触发
    Cmpss3Regs.COMPCTL.bit.ASYNCHEN = 1;
    
    //Invert 比较器输出?
    Cmpss3Regs.COMPCTL.bit.COMPHINV = 0;
    
    //比较器高负输入连接到外部引脚或内部 DAC?
    Cmpss3Regs.COMPCTL.bit.COMPHSOURCE = 0;
    
    
    //配置数字滤波
    器//最大 SAMPWIN 值提供最大数量的样本(5位)
    Cmpss3Regs.CTRIPHFILCTL.bit.SAMPWIN = 0x1F & 0x00;
    //最大 THRESH 值需要整个窗口的静态值
    //(5位 THRESH 应大于 SAMPL1.THRESH 的一半
    ;0x1F.THRESH = 0x1F.THRESH)
    //最大 CLKPRESCALE 值提供最长的采样间隔时间(12位)
    Cmpss3Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE = 0x3FF & 0x001;
    
    //复位滤波器逻辑&开始滤波
    Cmpss3Regs.CTRIPHFILCTL.bit.FILINIT = 0x3FF 和0x001;//配置
    
    Cmpss3Regs.COMPSTSCLR.bit.HLATCHCLR
    
    
    
    
    
    Cmpss3Regs.COMPSTSCLR.bit.HSYNCCLREN = Cmpss3Regs.COMPCTL.bit.CTRIPHSEL 1 /同步= 1;/配置锁存器= 1 /清除路径;//= 1 /同步= 1;/同步= 1
    
    //配置 DAC 和斜率补偿
    //在初始配置
    Cmpss3Regs.DACHVALS .all = 0;
    Cmpss3Regs.DACLVALS .all = 0;
    Cmpss3Regs.DACHVALA.all = 0;Cmpss3Regs.DACHVALA.all = 0;
    Cmpss3Regs.DACLVALA.all = 0;
    CmpssRA3Regs.0;Cmpss3Regs = 0
    cmps3Regs.RAMPMAXREFA = 0;
    
    //仿真模式行为、立即停止斜坡、电流斜坡后、还是自由运行?
    Cmpss3Regs.COMPDACCTL.bit.FREESOFT = 2;
    
    //选择使用 DACVAL 寄存器或 DAC 源的斜坡
    Cmpss3Regs.COMPDACCTL.bit.DACSOURCE = 1;
    
    //选择 DAC 斜坡的同步源
    Cmpss3Regs.COMPDACCTL.bit.RAMPSOURCE = 5;
    
    //从影子或立即加载斜坡?
    Cmpss3Regs.COMPDACCTL.bit.RAMPLOADSEL = 1;
    
    cmps3Regs.RAMPDECVALS = 7;
    //禁用受保护模式寄存器 EDIS;

    在这里、我要通过调试器对 EPwm6.CMPA.bit.CMPA 至500 (最大占空比为50%)、RAMPMAXREFS 和 RAMPDECVALS 进行实验。

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

    Noah、

    感谢您共享配置代码。 看到 RAMPMAXREF 从0到450的相同行为是很好的。 我认为、这表明比较器输入上的信号噪声足以在这个低 DAC 电平触发 PWM 输出。  

    现在需要回答的问题是、为什么 PWMA 输出保持低电平、而 PWMB 似乎受到跳闸条件的影响? 我认为这是因为死区配置。 我认为 DBRED 足够长、在 DBRED 延迟结束之前、峰值电流信号触发 PWMA 输出、输出保持低电平。 该跳闸可能是由于该输入端的噪声造成的。 解决此问题的一种方法是具有一个从 CTR = 0/1开始的消隐窗口、其长度至少等于 DBRED。

    PWMB 看起来正常的原因是、它是作为 PWMA 动作限定符信号的反相版本推导出来的。 PWMA 动作限定信号在到达死区模块之前似乎有一个有效的上升沿。 PWMB 的死区信号路径会延迟 PWMA 信号的下降沿、而该信号路径不会延迟上升沿。 因此、PWMB 似乎可以、即使 PWMA (输出)已完全被 DBRED 路径占用。

    尝试使用针对 PWMB 输出的动作限定器设置来单独生成 PWMB、即 DBCTL[IN_MODE]= 0x2。

    BTW 我注意到您也配置了 HR 功能。 在峰值电流模式控制下、占空比由反馈电流达到基准值的时间决定。 如果您使用异步跳闸路径(以重置 PWMA 输出)、它将为您提供尽可能最佳的分辨率。 无需启用 HR 功能。

    但愿这对您有所帮助。

    Hrishi

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

    Hrishi、您好!

    感谢您的回答。 我一直在尝试各种 PWM 设置、这样动作限定符块会设置互补的 PWM A/B 信号并绕过死区模块、并且仍然会获得相同的不良行为。  

    EPwm6Regs.AQCTLA.bit.ZRO = 0x2; //在 CTR=Zero
    EPwm6Regs.AQCTLA.bit.CAU = 0x1时设置 PWMxA; //清除事件 A 上的 PWMxA,向上计数
    EPwm6Regs.AQTSRCSEL.bit.T1SEL = 0x1;//将 DCA_EVT1配置为 T1事件
    EPwm6Regs.AQCTLA2.bit.T1U = 0x1的触发; // T1事件触发 PWM6A 变为低
    
    电平 EPwm6Regs.AQCTLB.bit.PRD = 0x1; //在 CTR=PRD
    EPwm6Regs.AQCTLB.bit.CAU = 0x2时清除 PWMxB; //在事件 A 上设置 PWMxB、向上计数
    EPwm6Regs.AQCTLb2.bit.T1U = 0x2; // T1事件触发 PWM6B 进入高
    
    电平 EPwm6Regs.DBCTL.bit.OUT_MODE = 0x0;//绕过死区模块 

    RAMPMAXREFS 的值接近零将导致 PWM A 通道输出 CMPA 占空比、而 PWM B 通道为低电平。 我可以通过调整消隐来控制输出的是 PWM A 还是 PWM B、这是一个线索。 我可以在几乎整个周期内添加消隐窗口偏移、然后通过 CTR=Zero 进行消隐、并使行为保持在 PWM B 上

    还有其他见解吗? 我将继续进行演示。

    PS:感谢您对 HRPWM 的提醒。 这是我想到进行平均电流模式控制时的一个残余。