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.

电流重构几个问题

static inline void HAL_setTrigger(HAL_Handle handle,const SVGENCURRENT_IgnoreShunt_e ignoreShunt,const int16_t minwidth, const int16_t cmpOffset)
{
  HAL_Obj *obj = (HAL_Obj *)handle;

  PWM_Obj *pwm1 = (PWM_Obj *)obj->pwmHandle[PWM_Number_1];
  PWM_Obj *pwm2 = (PWM_Obj *)obj->pwmHandle[PWM_Number_2];
  PWM_Obj *pwm3 = (PWM_Obj *)obj->pwmHandle[PWM_Number_3];
  PWM_Obj *pwm;

  uint16_t nextPulse1 = (pwm1->CMPA + pwm1->CMPAM) / 2;
  uint16_t nextPulse2 = (pwm2->CMPA + pwm2->CMPAM) / 2;
  uint16_t nextPulse3 = (pwm3->CMPA + pwm3->CMPAM) / 2;
  uint16_t pwmCMPA1 = pwm1->CMPA;
  uint16_t pwmCMPA2 = pwm2->CMPA;
  uint16_t pwmCMPA3 = pwm3->CMPA;

  int16_t offset;

  if(ignoreShunt == use_all)
    {
      if((nextPulse1 <= nextPulse2) && (nextPulse1 <= nextPulse3))
        {
          pwm = pwm1;
        }
      else if((nextPulse2 <= nextPulse1) && (nextPulse2 <= nextPulse3))
        {
          pwm = pwm2;
        }
      else
        {
          pwm = pwm3;
        }
    }
  else if(ignoreShunt == ignore_a)
    {
      offset = pwmCMPA1 + cmpOffset;
    }
  else if(ignoreShunt == ignore_b)
    {
      offset = pwmCMPA2 + cmpOffset;
    }
  else if(ignoreShunt == ignore_c)
    {
      offset = pwmCMPA3 + cmpOffset;
    }
  else if(ignoreShunt == ignore_ab)
    {
      if(pwmCMPA1 > pwmCMPA2)
        {
          offset = pwmCMPA1 + cmpOffset;
        }
      else
        {
          offset = pwmCMPA2 + cmpOffset;
        }
    }
  else if(ignoreShunt == ignore_ac)
    {
      if(pwmCMPA1 > pwmCMPA3)
        {
          offset = pwmCMPA1 + cmpOffset;
        }
      else
        {
          offset = pwmCMPA3 + cmpOffset;
        }
    }
  else // when ignoreShunt == ignore_bc
    {
      if(pwmCMPA2 > pwmCMPA3)
        {
          offset = pwmCMPA2 + cmpOffset;
        }
      else
        {
          offset = pwmCMPA3 + cmpOffset;
        }
    }


  if(ignoreShunt == use_all)
    {
      if(pwm->CMPAM >= (pwm->CMPA + pwm->DBFED))
        {
          pwm1->CMPB = (pwm->CMPAM - (pwm->CMPA + pwm->DBFED)) / 2 + 1;
          PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualCmpBDecr);
        }
      else
        {
          pwm1->CMPB = ((pwm->CMPA + pwm->DBFED) - pwm->CMPAM ) / 2 + 1;
          PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualCmpBIncr);
        }
    }
  else
    {
      pwm1->CMPB = offset;
      PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualCmpBIncr);
    }

  return;
} // end of HAL_setTrigger() function

 

下一个脉冲  uint16_t nextPulse1 = (pwm1->CMPA + pwm1->CMPAM) / 2;

下一个脉冲 不就是影子寄存器 cmpam 吗? 为啥立即寄存器 和 影子寄存器 相加再除2

if(ignoreShunt == use_all)  如果使用 全部分流   触发源       PWM_setSocAPeriod(obj->pwmHandle[PWM_Number_1],PWM_SocPeriod_FirstEvent);

不就行了吗?

 

 

  • CMPA和CMPAM分别表示当前上一周期的比较值和下一周期要更新的比较值,为何采用两个值相加除以2,原因是,只有在下管开通时,才会进行电流采样,而AQ的发波方式是上管驱动在上升沿匹配比较值时拉高,在下降沿匹配比较值时拉低,对于下管来说,在前一周期的下降沿匹配点(CMPA)到过零,和过零到当前周期(CMPAM)的上升沿匹配点的时间段内是处于开通状态的,所以取中点的话,不考虑死区时间,直接就是(CMPA+CMPAM)/2.