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.

TMS320F280049C: 使用HRPWM,周期出现2*TBCLK抖动,在20KHz频率下出现8Hz的频率抖动,抖动无法接受,请问怎么解决?

Part Number: TMS320F280049C

uint16_t period;

  period = DEVICE_SYSCLK_FREQ / frq;

  // Enable ePWMx clock
  SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1);
  // Enable HRPWM clock
  SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRPWM);
  // Disable sync(Freeze clock to PWM as well)
  SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

  // Set AQ
  HRPWM_setActionQualifierAction(PSFB_X_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
  HRPWM_setActionQualifierAction(PSFB_X_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
  HRPWM_setActionQualifierAction(PSFB_X_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
  HRPWM_setActionQualifierAction(PSFB_X_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);

  // Set up TBPRD
  EPWM_setTimeBasePeriod(PSFB_X_BASE, period - 1);
  EPWM_setTimeBaseCounter(PSFB_X_BASE, 0U);
  EPWM_setClockPrescaler(PSFB_X_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);

  // Set compare value
  EPWM_setCounterCompareValue(PSFB_X_BASE, EPWM_COUNTER_COMPARE_A, period >> 1);

  // Set counter mode UP
  EPWM_setTimeBaseCounterMode(PSFB_X_BASE, EPWM_COUNTER_MODE_UP);

  // Set period load mode shadowing
  EPWM_setPeriodLoadMode(PSFB_X_BASE, EPWM_PERIOD_SHADOW_LOAD);

  // Set compare value load mode shadowing
  EPWM_setCounterCompareShadowLoadMode(PSFB_X_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD);

  // Enable auto-conversion
  HRPWM_enableAutoConversion(PSFB_X_BASE);

  // Set MEP control on both edges
  HRPWM_setMEPEdgeSelect(PSFB_X_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);

  // Enable phase shift load
  EPWM_enablePhaseShiftLoad(PSFB_X_BASE);
  HRPWM_enablePhaseShiftLoad(PSFB_X_BASE);

  // Enable high-resolution period control
  HRPWM_enablePeriodControl(PSFB_X_BASE);

  // Enable sync(Freeze clock to PWM as well)
  SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

  // Calling SFO() updates the HRMSTEP register with calibrated MEP_ScaleFactor.
  // HRMSTEP must be populated with a scale factor value prior to enabling
  // high resolution period control.
  while(status == SFO_INCOMPLETE)
  {
    status = SFO();
    if(status == SFO_ERROR)
    {
      ESTOP0;   // SFO function returns 2 if an error occurs & # of MEP
    }              // steps/coarse step exceeds maximum of 255.
  }

  // Force a software sync pulse
  EPWM_forceSyncPulse(PSFB_X_BASE);