你好!
我在使用280049输出PWM的时候,发现当控制PWM为0输出的时候,PWM的输出会有间歇性的脉冲出现。查找程序一直找到不问题,也没有一个思路,想请教一下这是什么问题?
有关PWM的控制程序如下:
void initEPWM1()
{
//
// Set_up TBCLK
//
EPWM_setTimeBasePeriod(EPWM1_BASE, EPWM1_TIMER_TBPRD);
EPWM_setPhaseShift(EPWM1_BASE, 0U);
EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);
// Set up counter mode
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_disablePhaseShiftLoad(EPWM1_BASE);
//
// Set ePWM clock pre-scaler
//
EPWM_setClockPrescaler(EPWM1_BASE,
EPWM_CLOCK_DIVIDER_4,
EPWM_HSCLOCK_DIVIDER_4);
//
// Set up shadowing
//
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,
EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,
EPWM_COUNTER_COMPARE_B,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
//
// Set-up compare
//
EPWM_setCounterCompareValue(EPWM1_BASE,
EPWM_COUNTER_COMPARE_A,
EPWM1_MIN_CMPA);
EPWM_setCounterCompareValue(EPWM1_BASE,
EPWM_COUNTER_COMPARE_B,
EPWM1_MIN_CMPB);
//
// 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);
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
}
void pump_ctrl(uint16_t pump, uint16_t freq, float32_t ratio)
{
EPWM_SignalParams *signalParams;
uint32_t base;
float32_t tbClkInHz = 0.0F;
uint16_t tbPrdVal = 0U, cmpAVal = 0U, cmpBVal = 0U;
switch (pump)
{
case 0:
base = EPWM1_BASE;
signalParams = &pwmSignal1;
signalParams->dutyValA = ratio;
if(ratio != 0.0)
neg_pump1_status = 1;
else
neg_pump1_status = 0;
break;
case 1:
base = EPWM1_BASE;
signalParams = &pwmSignal1;
signalParams->dutyValB = ratio;
if(ratio != 0.0)
neg_pump2_status = 1;
else
neg_pump2_status = 0;
break;
case 2:
base = EPWM2_BASE;
signalParams = &pwmSignal2;
signalParams->dutyValA = ratio;
if(ratio != 0.0)
pos_pump_status = 1;
else
pos_pump_status = 0;
break;
}
signalParams->freqInHz = freq;
//
// Calculate TBCLK, TBPRD and CMPx values to be configured for
// achieving desired signal
//
tbClkInHz = ((float32_t)signalParams->sysClkInHz /
(1U << (uint16_t)signalParams->tbClkDiv));
if(signalParams->tbCtrMode == EPWM_COUNTER_MODE_UP)
{
tbPrdVal = (uint16_t)((tbClkInHz / signalParams->freqInHz) - 1.0f);
cmpAVal = (uint16_t)((float32_t)signalParams->dutyValA *
(tbPrdVal + 1U));
cmpBVal = (uint16_t)((float32_t)signalParams->dutyValB *
(tbPrdVal + 1U));
}
else if(signalParams->tbCtrMode == EPWM_COUNTER_MODE_DOWN)
{
tbPrdVal = (uint16_t)((tbClkInHz / signalParams->freqInHz) - 1.0f);
cmpAVal = (uint16_t)((tbPrdVal + 1U) -
((float32_t)signalParams->dutyValA * (tbPrdVal + 1U)));
cmpBVal = (uint16_t)((tbPrdVal + 1U) -
((float32_t)signalParams->dutyValB * (tbPrdVal + 1U)));
}
else if((signalParams->tbCtrMode == EPWM_COUNTER_MODE_UP_DOWN))
{
tbPrdVal = (uint16_t)(tbClkInHz / (2.0f * signalParams->freqInHz));
cmpBVal = (uint16_t)(((float32_t)tbPrdVal -
((float32_t)(signalParams->dutyValB *
tbPrdVal))) + 0.5f);
cmpAVal = (uint16_t)(((float32_t)tbPrdVal -
((float32_t)(signalParams->dutyValA *
tbPrdVal))) + 0.5f);
}
//
// Configure TBPRD value
//
EPWM_setTimeBasePeriod(base, tbPrdVal);
//
// Set Compare values
//
EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A,
cmpAVal);
EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_B,
cmpBVal);
// ++counterA;
// if(counterA < epwm1Info.epwmMaxCompA)
// {
// epwm1Info.epwmCompA = counterA;
// }
// else
// {
// counterA = epwm1Info.epwmMinCompA;
// }
//
// ++counterB;
// if(counterB < epwm1Info.epwmMaxCompB)
// {
// epwm1Info.epwmCompB = counterB;
// }
// else
// {
// counterB = epwm1Info.epwmMinCompB;
// }
// updataCompare(&epwm1Info);
}
void main()
{
//
// Disable sync(Freeze clock to PWM as well)
//
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
//
// Initialize device clock and peripherals
//
Device_init();
DINT;
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
//
// Enable sync and clock to PWM
//
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
//
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
//
EINT;
// Disable pin locks and enable internal pullups.
Device_initGPIO();
// Set up GPIOs
setupGPIO();
//
// Configuring ePWM module for desired frequency and duty
//
EPWM_configureSignal(EPWM1_BASE, &pwmSignal1);
EPWM_configureSignal(EPWM2_BASE, &pwmSignal2);
pump_ctrl(POS_PUMP, 0, 0);
}
