主题中讨论的其他器件:TMS320F28035、 HALCOGEN、
大家好、我使用 PWM 驱动 BLDC 电机的时间已经很安静了、在测试期间、我注意到了一些奇怪的行为。
我已经检测到这种情况在哪里,我 想知道为什么会发生。
(注意: PWM_u 是 EPwm4Regs、 PWM_v 是 EPwm7Regs、 PWM_w 是 EPwm5Regs
使用向上/向下模式将 PWM 设置为20kHz 频率、到目前为止 PWM 外设中的所有变化都具有相同的结果)
/* Basic PWM periphery settings */ pwm_u->TBPRD = 2000; // Period = 4001 TBCLK counts (20 kHz) pwm_u->TBPHS.half.TBPHS = 0; // Set Phase register to zero pwm_u->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetrical mode pwm_u->TBCTL.bit.PHSEN = TB_DISABLE; // Phase loading disabled pwm_u->TBCTL.bit.PRDLD = TB_SHADOW; pwm_u->TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module pwm_u->CMPCTL.bit.SHDWAMODE = CC_SHADOW; pwm_u->CMPCTL.bit.SHDWBMODE = CC_SHADOW; pwm_u->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR=Zero pwm_u->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR=Zero pwm_u->AQCTLA.bit.CAU = AQ_SET; // set actions for EPWM4A pwm_u->AQCTLA.bit.CAD = AQ_CLEAR;
这在中断内部被调用来改变哪些 PWM 输出应该被调制:
/* To prevent unintentional transistor short-circuit during force event */ pwm_u->DBCTL.bit.OUT_MODE = OUT_DISABLED; // 0 - Disable Dead Band for output A pwm_v->DBCTL.bit.OUT_MODE = OUT_DISABLED; // 0 - Disable Dead Band for output A pwm_w->DBCTL.bit.OUT_MODE = OUT_DISABLED; // 0 - Disable Dead Band for output A /* Main part */ pwm_u->aqcsfrc.reg_value.csfa = PWM_AQ_SWF_NONE; // enable PWM on A output pwm_u->aqcsfrc.reg_value.csfb = PWM_AQ_SWF_LO; pwm_v->aqcsfrc.reg_value.csfa = PWM_AQ_SWF_LO; pwm_v->aqcsfrc.reg_value.csfb = PWM_AQ_SWF_HI; pwm_w->aqcsfrc.reg_value.csfa = PWM_AQ_SWF_LO; pwm_w->aqcsfrc.reg_value.csfb = PWM_AQ_SWF_LO; pwm_u->DBCTL.bit.HALFCYCLE = ENABLED; // 1 pwm_u->DBCTL.bit.IN_MODE = IN_MODE_RA_FA; // 0 - source for both falling-edge and rising-edge pwm_u->DBCTL.bit.POLSEL = ACTIVE_HI_COMP; // 2 - Active High Complementary (B is inverted) pwm_u->DBCTL.bit.OUT_MODE = PWM_DB_OUT_FULL_ENABLE; // 3 - Enable Dead Band for both outputs pwm_v->DBCTL.bit.HALFCYCLE = DISABLED; // 0 pwm_v->DBCTL.bit.IN_MODE = IN_MODE_RA_FA; // 0 - source for both falling-edge and rising-edge pwm_v->DBCTL.bit.POLSEL = ACTIVE_HI; // 0 - Active High (neither A nor B is inverted) pwm_v->DBCTL.bit.OUT_MODE = PWM_DB_OUT_A_ENABLE; // 2 - Enable Dead Band for output A pwm_w->DBCTL.bit.HALFCYCLE = DISABLED; // 0 pwm_w->DBCTL.bit.IN_MODE = IN_MODE_RA_FA; // 0 - source for both falling-edge and rising-edge pwm_w->DBCTL.bit.POLSEL = ACTIVE_HI; // 0 - Active High (neither A nor B is inverted) pwm_w->DBCTL.bit.OUT_MODE = PWM_DB_OUT_A_ENABLE; // 2 - Enable Dead Band for output A
结果是:
导致干扰的主要问题在某种程度上具有讽刺意味、即应该阻止此类事情(从我的角度来看)、并在强制动作限定符之前禁用死区。
现在另一个奇怪的现象是、当我增加占空比(高于35%)时、通道 B 上的脉冲很长(正在过载)。
占空比超过50%时、互补脉冲会正常工作并正常运行、这很奇怪:
现在进入我的问题。 当我移除禁用 U 相(ePWM4A)上 DBCTL 的线路后、互补通道 B 在每个占空比下都开始正常工作(不仅超过50%)。
有人能解释一下为什么会发生这种情况吗? 为什么我无法安全地首先禁用死区、然后几条指令在开启时不会产生奇怪的毛刺脉冲?
此外、我一直在使用具有相同 PWM 设置和相同代码的 TMS320F28035 (当然、由于其处理器的不同而进行了一些微小的更改)、但那里并未发生这种情况。