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波。
以下附上部分源码:
(EPWM_getOneShotTripZoneFlagStatus(IoHwAb_PWMHandle[1]) &( EPWM_TZ_OST_FLAG_OST1 | EPWM_TZ_OST_FLAG_DCAEVT1 | EPWM_TZ_OST_FLAG_DCBEVT1)) |
tbClkInHz /= (float32_t)(1U << (uint16_t) EPWM_HSCLOCK_DIVIDER_2);
EPWM_setFallingEdgeDelayCount(IoHwAb_PWMHandle[i], dbdlyfalinVal);
EPWM_setDeadBandDelayPolarity(IoHwAb_PWMHandle[i], EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
}
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的配置,请帮忙看看是不是一些配置冲突导致的异常。
初始化配置代码如下:
GPIO_setQualificationMode(signalParams->pinA, GPIO_QUAL_SYNC);
GPIO_setPadConfig(signalParams->pinB, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(signalParams->pinB, GPIO_QUAL_SYNC);
float32_t tbClkInHz = 0.0F;
tbClkInHz = ((float32_t)signalParams->sysClkInHz /(float32_t)(1U << (uint16_t)signalParams->tbClkDiv));
cmpBVal = (uint16_t)(((float32_t)tbPrdVal -
((signalParams->dutyValB/100 *
dbdlyfalinVal = (uint16_t)(tbClkInHz * signalParams->DBdelay);
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_setCounterCompareShadowLoadMode(signalParams->Base,EPWM_COUNTER_COMPARE_B,EPWM_COMP_LOAD_ON_CNTR_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);