主题中讨论的其他器件:C2000WARE、 SysConfig
工具与软件:
hi champs、
我尝试通过遵循代码示例来测试 HRPWM。。。
device_support\f2837xs+ examples\cpu1\HRPWM_DEADBAND_SFO_v8\cpu01
driverlib\f2837xs+ examples\cpu1\HRPWM\HRPWM_ex4_DUTY_UPDOWN_SFO
这里是我的初始代码。
void epwm1_init(void)
{
EPWM_setEmulationMode(EPWM1_BASE, EPWM_EMULATION_FREE_RUN);
//
// Set-up TBCLK
//
EPWM_setTimeBasePeriod(EPWM1_BASE, 357);
EPWM_setPhaseShift(EPWM1_BASE, 0U);
EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);
//
// set duty 50% initially
//
HRPWM_setCounterCompareValue(EPWM1_BASE, HRPWM_COUNTER_COMPARE_A, ((uint32_t)357<< 8)/2);
//
// Set up counter mode
//
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_disablePhaseShiftLoad(EPWM1_BASE);
EPWM_setClockPrescaler(EPWM1_BASE,
EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_DISABLED);
//
// Set up shadowing
// MUST BE CTR=(ZER & PRD)
//
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,
EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD);
//
// Set actions
//
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
HRPWM_setMEPEdgeSelect(EPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(EPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);
HRPWM_setMEPEdgeSelect(EPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(EPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL);
//
// Set up shadowing
// MUST BE CTR=(ZER & PRD)
//
HRPWM_setCounterCompareShadowLoadEvent(EPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
HRPWM_setCounterCompareShadowLoadEvent(EPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
HRPWM_enableAutoConversion(EPWM1_BASE);
//
// Turn on high-resolution period control for DUTY to take HR on BOTH EDGEs.
//
HRPWM_enablePeriodControl(EPWM1_BASE);
HRPWM_disablePhaseShiftLoad(EPWM1_BASE);
//------ Dead band configuration ------
//
// Use EPWMA as the input for both RED and FED
//
EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);
EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);
//
// Invert only the Falling Edge delayed output (AHC)
//
EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
//
// Use the delayed signals instead of the original signals
//
EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, true);
EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, true);
EPWM_setRisingEdgeDelayCountShadowLoadMode(EPWM1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD);
EPWM_setFallingEdgeDelayCountShadowLoadMode(EPWM1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD);
EPWM_setDeadBandCounterClock(EPWM1_BASE, EPWM_DB_COUNTER_CLOCK_HALF_CYCLE);
//
// Set the RED and FED values
//
HRPWM_setFallingEdgeDelay(EPWM1_BASE, (uint32_t)64<<7);
HRPWM_setRisingEdgeDelay(EPWM1_BASE, (uint32_t)64<<7);
HRPWM_setDeadbandMEPEdgeSelect(EPWM1_BASE,HRPWM_DB_MEP_CTRL_RED_FED);
HRPWM_setRisingEdgeDelayLoadMode(EPWM1_BASE,HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
HRPWM_setFallingEdgeDelayLoadMode(EPWM1_BASE,HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
}
基本上、我为时基设置100MHz 时钟、并选择向上/向下模式。 输出频率为140kHz。
ePWM1A 和 ePWM1B 是互补输出、插入了死区区域。
我想检查一下它是否可以执行0.1%的140KHz 步长 它等于7.14ns 的步长。 ePWM1A 可以正常工作(占空比增加)、但 ePWM1B 不变。
然后我尝试增加到0.2%。 在本例中、ePWM1A 和1B 均有效。 由于0.2%等于14.28ns (>时基 周期为10ns)、因此在我看来、ePWM1B 不支持 HR。
你能在这里讲一讲吗?
此致、
Kien Nguyen

