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.

[参考译文] TMS320F28027:PWM 配置

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1021245/tms320f28027-pwm-configuration

器件型号:TMS320F28027

尊敬的

    我的客户电机运行速度范围为1880RPM; 计划在1000 RPM 内的 PWM 载波为10K、高于1000 RPM 则更改为8K;  

 

目前、PWM 载波的初始配置执行一次、电机正常运行; 当电机运行速度达到1000 RPM 或更高时、PWM 载波的初始配置功能再次被调用(以修改载波频率)、无法实现;  

 

需要解决的问题是、当电机速度达到1000RPM 时、除了通过配置 ePWM 周期寄存器(PWM -> TBPRD =周期)来修改载波频率之外、是否还有任何其他相关的寄存器配置或逻辑需要修改?  或者还有其他方法;  

 

以下是 ePWM 初始配置函数、请参阅 InstaSPIN。 并提前告知您

void HAL_setupPwms (HAL_Handle handle、
                   const uint_least16_t systemFreq_MHz、
                   const float_t pwmPeriod_usec、
                   const uint_least16_t numPwmTicksPerIsrTick)

  HAL_Obj   * obj = (HAL_Obj *)句柄;
  uint16_t   half Period_cycles = (uint16_t)((float_t) systemFreq_MHz*pwmPeriod_usec) >> 1;
  uint_least8_t    cnt;

//  clk_disableTbClockSync (obj->clkHandle);
  // 关闭      EPWM 外设的输出 ,从而  放置  电源 开关
  // 进入  高 阻抗 状态。
  PWM_setOneShotscope (obj->pwmHandle[PWM_Number_1]);
  PWM_setOneShotscope (obj->pwmHandle[PWM_Number_2]);
  PWM_setOneShotscope (obj->pwmHandle[PWM_NUMBER_3]);

  for (cnt=0;cnt<3;cnt++)
    {
      // 设置  时基 控制 寄存器 (TBCTL)
      PWM_setCounterMode (obj->pwmHandle[cnT]、PWM_CounterMode_UpDown);
      PWM_disableCounterLoad (obj->pwmHandle[cnt]);
      PWM_setPeriodLoad (obj->pwmHandle[cnt]、PWM_PeriodLoad_Immediate);
      PWM_setSyncMode (obj->pwmHandle[cnT]、PWM_SyncMode_EPWMxSYNC);
      PWM_setHighSpeedClkDiv (obj->pwmHandle[cnt]、PWM_HspClkDiv_BY_1);
      PWM_setClkDiv (obj->pwmHandle[cnt]、PWM_ClkDiv _BY_1);
      PWM_setPhaseDir (obj->pwmHandle[cnT]、PWM_PhaseDir_CountUp);
      PWM_setRunMode (obj->pwmHandle[cnt]、PWM_RunMode_FreeRun);

      // 设置  基于定时器 的相位 寄存器 (TBPHS)
      PWM_setPhase (obj->pwmHandle[cnt]、0);

      // 设置  时基 计数 器寄存器 (TBCTR)
      PWM_setCount (obj->pwmHandle[cnt]、0);

      // 设置  时基 周期 寄存器 (TBPRD)
      //    初始设置为零
      PWM_setPeriod (obj->pwmHandle[cnt]、0);

      // 设置  计数器比较 控制 寄存器 (CMPCTL)
      PWM_setLoadMode_cmpA (obj->pwmHandle[cnt]、PWM_LoadMode_Zero);
      PWM_setLoadMode_CMPB (obj->pwmHandle[cnt]、PWM_LoadMode_Zero);
      PWM_setShadowImage Mode_cmpA (obj->pwmHandle[cnt]、PWM_ShadowImage Mode_Shadow);
      PWM_setShadowImage Mode_CMPB (obj->pwmHandle[cnt]、PWM_ShadowImage Mode_Immediate);

      // 设置  动作限定器 输出 A 寄存器 (AQCTLA)  
      PWM_setActionQual_CntUp_CmpA_PwmA (obj->pwmHandle[cnt]、PWM_ActionQual_set);
      PWM_setActionQual_CntDown_CmpA_PwmA (obj->pwmHandle[cn]、PWM_ActionQual_clear);

      // 设置  死区 发生器 控制 寄存器 (DBCTL)
      PWM_setDeadBandOutputMode (obj->pwmHandle[cnt]、PWM_DeadBandOutputMode_EPWMxA_rising_EPWMxB_Falling);
      PWM_setDeadBandPolarity (obj->pwmHandle[cnT]、PWM_DeadBandPolarity _EPWMxB_Inverted);

      // 设置  死区 上升 沿 延迟 寄存器 (DBRED)
      PWM_setDeadBandRisingEdgeDelay (obj->pwmHandle[cnt]、HAL_PWM_DBRED_CNT);

      // 设置  死区 下降 沿 延迟 寄存器 (DBFED)
      PWM_setDeadBandFallingEdgeDelay (obj->pwmHandle[cnT]、HAL_PWM_DBFED_CNT);
      // 设置  PWM 斩波 器控制 寄存器 (PCCTL)
      pwm_disableChopping (obj->pwmHandle[cnt]);

      // 设置  触发 区 选择 寄存器 (TZSEL)
      PWM_disableTripZones (obj->pwmHandle[cnT]);
    }

      // 设置  事件 触发 器选择 寄存器 (ETSEL)
      PWM_DisableInt (obj->pwmHandle[PWM_NUMBER_1]);
      PWM_setSockAPulseSrc (obj->pwmHandle[PWM_Number_1]、PWM_SockPulseSrc_EqualCounterZero);
      PWM_enableSockpulse (obj->pwmHandle[PWM_NUMBER_1]);

  // 设置  事件 触发 器预分频 寄存器 (ETPS)
  if (numPwmTicksPerIsrTick == 3)
    {
      PWM_setIntPeriod (obj->pwmHandle[PWM_NUMBER_1]、PWM_IntPeriod_ThirdEvent);
      PWM_setSockAPeriod (obj->pwmHandle[PWM_Number_1]、PWM_SockPeriod_ThirdEvent);
    }
  否则 、如果(numPwmTicksPerIsrTick == 2)
    {
      PWM_setIntPeriod (obj->pwmHandle[PWM_NUMBER_1]、PWM_IntPeriod_SecondEvent);
      PWM_setSockAPeriod (obj->pwmHandle[PWM_Number_1]、PWM_SockPeriod_SecondEvent);
    }
  其他
    {
      PWM_setIntPeriod (obj->pwmHandle[PWM_NUMBER_1]、PWM_IntPeriod_FirstEvent);
      PWM_setSockAPeriod (obj->pwmHandle[PWM_Number_1]、PWM_SockPeriod_FirstEvent);
    }

  // 设置  事件 触发 器清除 寄存器 (ETCLR)
  PWM_clearIntFlag (obj->pwmHandle[PWM_NUMBER_1]);
  PWM_clearSockAFlag (obj->pwmHandle[PWM_Number_1]);

  //    同步  PWM 的第一步
  clk_disableTbClockSync (obj->clkHandle);//2021.7.8

  //   由于 PWM  配置 为  递增/递减 计数器,  因此周期 寄存器  设置 为 二分之一  
  所   需 PWM 周期的//
  PWM_setPeriod (obj->pwmHandle[PWM_NUMBER_1]、half Period_cycles);
  PWM_setPeriod (obj->pwmHandle[PWM_NUMBER_2]、half Period_cycles);
  PWM_setPeriod (obj->pwmHandle[PWM_NUMBER_3]、half Period_cycles);

  //    同步  PWM 的最后一步
  clk_enableTbClockSync (obj->clkHandle);

  返回;
}  //   HAL_setupPwms() 函数结束

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

    雷蒙德

    感谢您在这里的耐心等待、我们仍在努力为正确的工程师分配这项任务、因为我们有些人不在办公室、请在第二天回复。

    最棒的

    Matthew

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

    instaspin focus 无法直接支持在线更改 PWM 频率、 如果更改 PWM 频率、则必须重新计算估算器和控制器参数。

    您可以参阅 motorControlSDK 中的示例 lab12、本实验基于 F28004x、但您也可以在 F28027F 上实现该方法。

    MotorControl 软件开发套件(SDK)

    http://www.ti.com/tool/c2000ware-motorcontrol-sdk