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波。
以下附上部分源码:
(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;
uint16_t tbPrdVal = 0U, cmpAVal = 0U, cmpBVal = 0U, dbdlyrisinVal = 0U, dbdlyfalinVal = 0U;
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_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_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);
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波形就是没有问题的。