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.

[参考译文] TMS320F28.0025万C:设置ePWM不工作

Guru**** 2460850 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1088994/tms320f280025c-setup-epwm-not-working

部件号:TMS320F28.0025万C

您好,

我是TI C2000 UC的新用户,在使用ePWM模块从PWP-PWM 100 % 占空比生成0 % 时遇到了一些困难。

目前,我甚至无法生成PWM信号,但我还不能弄清楚我做了什么错误。 我想使用PWM7A输出,并按如下所示配置PWM:

初始化(这在MotorControl SDK - UniversalMotor实验室示例中,其中设置了3相PWM):

    
void HAL_setupPWMs(HAL_MTR_Handle handle)
{
    ...

    //Set the handle for the base
    obj->bcHandle = BC_PWM_BASE;
    
    // setup the Time-Base Control Register (TBCTL)
    EPWM_setTimeBaseCounterMode(obj->bcHandle,
                                EPWM_COUNTER_MODE_UP_DOWN);

    EPWM_disablePhaseShiftLoad(obj->bcHandle);

    EPWM_setPeriodLoadMode(obj->bcHandle, EPWM_PERIOD_SHADOW_LOAD); //Shadow load

    EPWM_setClockPrescaler(obj->bcHandle, EPWM_CLOCK_DIVIDER_1,
                             EPWM_HSCLOCK_DIVIDER_1);

    // setup the Timer-Based Phase Register (TBPHS)
    EPWM_setPhaseShift(obj->bcHandle, 0); //No phase shift to the basis timer

    // setup the Time-Base Counter Register (TBCTR)
    EPWM_setTimeBaseCounter(obj->bcHandle, 0);

    // setup the Time-Base Period Register (TBPRD)
    // set to zero initially
    EPWM_setTimeBasePeriod(obj->bcHandle, 0);

    // setup the Counter-Compare Control Register (CMPCTL)
    EPWM_setCounterCompareShadowLoadMode(obj->bcHandle,
                                         EPWM_COUNTER_COMPARE_A,
                                         EPWM_COMP_LOAD_ON_CNTR_ZERO);

    EPWM_setCounterCompareShadowLoadMode(obj->bcHandle,
                                         EPWM_COUNTER_COMPARE_B,
                                         EPWM_COMP_LOAD_ON_CNTR_ZERO); 

    EPWM_setCounterCompareShadowLoadMode(obj->bcHandle,
                                         EPWM_COUNTER_COMPARE_C,
                                         EPWM_COMP_LOAD_ON_CNTR_ZERO);

    EPWM_setCounterCompareShadowLoadMode(obj->bcHandle,
                                         EPWM_COUNTER_COMPARE_D,
                                         EPWM_COMP_LOAD_ON_CNTR_ZERO);

    // setup the Action-Qualifier Output A Register (AQCTLA)
     EPWM_setActionQualifierAction(obj->bcHandle,
                                   EPWM_AQ_OUTPUT_A,
                                   EPWM_AQ_OUTPUT_LOW,
                                   EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);

     EPWM_setActionQualifierAction(obj->bcHandle,
                                   EPWM_AQ_OUTPUT_A,
                                   EPWM_AQ_OUTPUT_NO_CHANGE,
                                   EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);

     EPWM_setActionQualifierAction(obj->bcHandle,
                                   EPWM_AQ_OUTPUT_A,
                                   EPWM_AQ_OUTPUT_NO_CHANGE,
                                   EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);

     EPWM_setActionQualifierAction(obj->bcHandle,
                                   EPWM_AQ_OUTPUT_A,
                                   EPWM_AQ_OUTPUT_HIGH,
                                   EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); 

    // setup the PWM-Chopper Control Register (PCCTL)
    EPWM_disableChopper(obj->bcHandle); 

    // PWM frequency
    EPWM_setTimeBasePeriod(obj->bcHandle, pwmPeriodCycles); 
    
    ...
    }

现在我激活具有恒定系数的PWM:

HAL_writeBCData(HAL_MTR_Handle handle,HAL_PWMData_t *pPWMData, float32_t duty)
{
    HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;

    float32_t period = (float32_t)(EPWM_getTimeBasePeriod(obj->bcHandle));

    float32_t duty_pu = __fsat(duty, 0.0f, 1.0f);
    int16_t duty_time_base  = (int16_t)(duty_pu * period);  //

    // write the PWM data value
    EPWM_setCounterCompareValue(obj->bcHandle,
                                EPWM_COUNTER_COMPARE_A,
                                duty_time_base);
    return;
} // end of HAL_writeBCData() function

我没有使用任何Tripzone设置,我认为这可能是问题所在。 最后,我想让此PWM始终处于激活状态,所以我是否需要为此设置一些Tripzone?

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

    好的,发现了问题,是 __fsat (Duty,0.0f,1.0f);,终止了占空比