TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F2800157: PWM采用移相同步控制后第一个周期开管异常的问题

Part Number:TMS320F2800157

Q1:我们在PWM驱动关断的设计中使用EPWM_forceTripZoneEvent(uint32_t base, uint16_t tzForceEvent)软件强制动作触发TZ模块,使PWM模组按照EPWM_setTripZoneAction中预设的动作输出低电平,在开启PWM时使用EPWM_clearTripZoneFlag(EPWMx_Base, EPWM_TZ_FLAG_OST)函数清除关断时被置起的Trip Zones One Shot flag使后级能依据预设条件输出PWM波。

烦请帮我们评估一下这样做是否存在可能的异常风险导致PWM不能及时关断或者出现PWM异常开启。
以下附上部分源码:

void IoHwAb_Set_FrequencyAndDuty_False(float32_t Frequency,float32_t DutyCycle1,float32_t DutyCycle2,float32_t DutyCycle3,float32_t DutyCycle4)

{
//传入参数处理
    Frequency = 2*Frequency;
    DutyCycle1=DutyCycle1/100;
    DutyCycle2=DutyCycle2/100;
    DutyCycle3=DutyCycle3/100;
    DutyCycle4=(DutyCycle4+50)/100;

//获取硬件过流故障信息

    tripFault_flg = (EPWM_getOneShotTripZoneFlagStatus(IoHwAb_PWMHandle[0]) &( EPWM_TZ_OST_FLAG_OST1 | EPWM_TZ_OST_FLAG_DCAEVT1 | EPWM_TZ_OST_FLAG_DCBEVT1)) |
                    (EPWM_getOneShotTripZoneFlagStatus(IoHwAb_PWMHandle[1]) &( EPWM_TZ_OST_FLAG_OST1 | EPWM_TZ_OST_FLAG_DCAEVT1 | EPWM_TZ_OST_FLAG_DCBEVT1)) |
                    (EPWM_getOneShotTripZoneFlagStatus(IoHwAb_PWMHandle[2]) &( EPWM_TZ_OST_FLAG_OST1 | EPWM_TZ_OST_FLAG_DCAEVT1 | EPWM_TZ_OST_FLAG_DCBEVT1)) |
    if (PWMSoftwareEn_flg == 1)
  {
   float32_t tbClkInHz = 0.0F;
   uint16_t tbPrdVal = 0U, cmpAVal = 0U, cmpBVal = 0U, dbdlyrisinVal = 0U, dbdlyfalinVal = 0U;

   tbClkInHz = ((float32_t)Sys_Freq /
                (float32_t)(1U << (uint16_t)EPWM_CLOCK_DIVIDER_1));      
   tbClkInHz /= (float32_t)(1U << (uint16_t) EPWM_HSCLOCK_DIVIDER_2);

   dbdlyrisinVal = (uint16_t)(tbClkInHz * Pwm_DeadTime_S);
   dbdlyfalinVal = dbdlyrisinVal; 

   if((tripFault_flg == 0) && (Continue_Flow_flg == 0))
    {

     uint16_t i =0;
          Continue_Flow_flg = 1;
//如果是第一次进入则进行死区设置
 for(i = 0; i < 3 ; i++)
 {
       //EPWM_setTimeBaseCounter(IoHwAb_PWMHandle[i], 1875);(Q2问题增加代码)

          EPWM_clearTripZoneFlag(IoHwAb_PWMHandle[i], EPWM_TZ_FLAG_OST);  
          EPWM_setDeadBandDelayMode(IoHwAb_PWMHandle[i], EPWM_DB_RED, true);

          EPWM_setRisingEdgeDelayCount(IoHwAb_PWMHandle[i], dbdlyrisinVal);  
          EPWM_setDeadBandDelayMode(IoHwAb_PWMHandle[i], EPWM_DB_FED, true);
          EPWM_setFallingEdgeDelayCount(IoHwAb_PWMHandle[i], dbdlyfalinVal);
          EPWM_setDeadBandDelayPolarity(IoHwAb_PWMHandle[i], EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);          }
//设置三相PWM波的周期和占空比,通过控制上桥间接控制下桥
          tbPrdVal = (uint16_t)(tbClkInHz / (2.0f * Frequency)); 
          cmpAVal = (uint16_t)(((float32_t)tbPrdVal –
                              (((1-DutyCycle1) *
                              (float32_t)tbPrdVal))) + 0.5f);
          EPWM_setTimeBasePeriod(IoHwAb_PWMHandle[2], tbPrdVal); 
          EPWM_setCounterCompareValue(IoHwAb_PWMHandle[2], EPWM_COUNTER_COMPARE_A, cmpAVal);

          ·

          ·
          ·
          ·
          ·
          ·
   }
   else
   {
 EPWM_forceTripZoneEvent(IoHwAb_PWMHandle[0],EPWM_TZ_FORCE_EVENT_OST);
 EPWM_forceTripZoneEvent(IoHwAb_PWMHandle[1],EPWM_TZ_FORCE_EVENT_OST);
 EPWM_forceTripZoneEvent(IoHwAb_PWMHandle[2],EPWM_TZ_FORCE_EVENT_OST);
 Continue_Flow_flg =0;
    }
}

Q2:测试过程中我发现第一次开管会出现一个占空比不受控制的异常发波,之前的交流中贵司有回复可以通过加载一个偏移量去消除异常,实际测试过程中通过对TBCTR寄存器设置一个初值(修改点如Q1代码所示)的确会对第一个周期的异常波形有一定影响,但同时也引发了新的问题,三相不同步了,出现一个固定的相位差。

之前的回复:

官方的电机控制算法实例中三相控制波形是否有关断时六桥拉低的动作?目前可以提供一些现有做法下PWM的配置,请帮忙看看是不是一些配置冲突导致的异常。
初始化配置代码如下:

    //
    // EPWM1 -> myEPWM1 Pinmux
    // Upper bridge
    GPIO_setPinConfig(signalParams->pinConfigA);
    GPIO_setPadConfig(signalParams->pinA, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(signalParams->pinA, GPIO_QUAL_SYNC);

    // Lower  bridge
    GPIO_setPinConfig(signalParams->pinConfigB);
    GPIO_setPadConfig(signalParams->pinB, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(signalParams->pinB, GPIO_QUAL_SYNC);
    float32_t tbClkInHz = 0.0F;

    uint16_t tbPrdVal = 0U, cmpAVal = 0U, cmpBVal = 0U, dbdlyrisinVal = 0U, dbdlyfalinVal = 0U;

    EPWM_setClockPrescaler(signalParams->Base,
                           signalParams->tbClkDiv,
                           signalParams->tbHSClkDiv);         
    tbClkInHz = ((float32_t)signalParams->sysClkInHz /(float32_t)(1U << (uint16_t)signalParams->tbClkDiv)); 

    if(signalParams->tbHSClkDiv <= EPWM_HSCLOCK_DIVIDER_4)
    {

        tbClkInHz /= (float32_t)(1U << (uint16_t)signalParams->tbHSClkDiv);
    }

    else
    {
        tbClkInHz /= (float32_t)(2U * (uint16_t)signalParams->tbHSClkDiv);         

    }

        tbPrdVal = (uint16_t)(tbClkInHz / (2.0f * signalParams->freqInHz));

          cmpAVal = (uint16_t)(((float32_t)tbPrdVal –
                               ((signalParams->dutyValA/100  *
                                (float32_t)tbPrdVal))) + 0.5f);

          cmpBVal = (uint16_t)(((float32_t)tbPrdVal –
                               ((signalParams->dutyValB/100  *

                                (float32_t)tbPrdVal))) + 0.5f);
          dbdlyrisinVal = (uint16_t)(tbClkInHz * signalParams->DBdelay); 
          dbdlyfalinVal = (uint16_t)(tbClkInHz * signalParams->DBdelay);

EPWM_forceTripZoneEvent(signalParams->Base,EPWM_TZ_FORCE_EVENT_OST);
        EPWM_setTimeBaseCounterMode(signalParams->Base, signalParams->tbCtrMode);  
        EPWM_enableSyncOutPulseSource(signalParams->Base,EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO); 
        EPWM_setSyncInPulseSource(signalParams->Base, signalParams->syncinsource );
        EPWM_setCountModeAfterSync(signalParams->Base, EPWM_COUNT_MODE_UP_AFTER_SYNC);
        EPWM_setTimeBasePeriod(signalParams->Base, tbPrdVal);
        EPWM_selectPeriodLoadEvent(signalParams->Base, EPWM_SHADOW_LOAD_MODE_COUNTER_ZERO);
        EPWM_setPeriodLoadMode(signalParams->Base, EPWM_PERIOD_SHADOW_LOAD);
        EPWM_setCounterCompareValue(signalParams->Base, EPWM_COUNTER_COMPARE_A, cmpAVal); 
        EPWM_setCounterCompareValue(signalParams->Base, EPWM_COUNTER_COMPARE_B, cmpBVal); 

        EPWM_disablePhaseShiftLoad(signalParams->Base);
        EPWM_setPhaseShift(signalParams->Base, 0);                                                      
        EPWM_setTimeBaseCounter(signalParams->Base, 0); 
        EPWM_setCounterCompareShadowLoadMode(signalParams->Base,EPWM_COUNTER_COMPARE_A,EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(signalParams->Base,EPWM_COUNTER_COMPARE_B,EPWM_COMP_LOAD_ON_CNTR_ZERO);
          //动作限定(互补输出,参照)                            
        EPWM_setActionQualifierAction(signalParams->Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); 
        EPWM_setActionQualifierAction(signalParams->Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(signalParams->Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); 
        EPWM_setActionQualifierAction(signalParams->Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); 
        EPWM_setActionQualifierAction(signalParams->Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(signalParams->Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); 
Yale Li:

1. 这么操作是没有问题的,有没有风险要具体结合你的应用来看。从TZ事件产生,到程序运行到软件触发TZ这里,总是会有延迟的。TZ更重要的是可以自动响应,配置好相应的响应动作之后,TZ信号可以自动触发这些动作,响应会更及时。

2. 

Chris Tang 说:测试过程中我发现第一次开管会出现一个占空比不受控制的异常发波,

能再详细描述一下吗?

Chris Tang 说:之前的交流中贵司有回复可以通过加载一个偏移量去消除异常,

之前是通过什么途径获取技术支持的?

,

Chris Tang:

之前是通过邮件方式获得技术支持,异常波形只会出现在开管后的第一个周期,表现形式是其占空比于我预设的占空比大两到三倍,其频率低于我预设频率,如果我不采用移相控制的方式进行同步,那么在第一个周期三相之间会出现一个固定的相位差,如果我采用同步源TBCTR计数零点做位移相控制的触发信号(移相相位差设置0),则第一个开管周期虽然波形异常,仍能保持同步性

,

Chris Tang:

如您所言,的确用这种关断方式会涉及到代码运行速率的问题导致一些延迟,虽然可能时间上很短,我同时也有将TZ配置成一些故障响应触发,实测下来也是us级的响应速度。如果只是单纯的想要在发出指令后,关断PWM模组,您还有什么推荐的其他方式吗?使用软件强制触发TripZone也是我在提供的电机控制实例中看到的

,

Yale Li:

1. 我建议你还是找之前和你对接的技术支持来继续解决这个问题;

2. 目前使用的软件触发TZ来关断PWM波形就是没有问题的。

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F2800157: PWM采用移相同步控制后第一个周期开管异常的问题
分享到: 更多 (0)