主题中讨论的其他器件:UCC21710
各位专家、您好!
当我从 eCAP 测量 PWM 脉冲序列时,我一直在直流母线中获得这些随机跳跃。
PWM 脉冲序列来自 UCC21710的 APWM 引脚。
需要注意的一点是、重新布防是另一个 PWM ISR、它每10KHz 执行一次。
当我绘制最终值时、我看到很多干扰:

下面是我的初始化代码和 eCAP ISR 计算、我认为有一种更好的方法可以获得占空比:
void HAL_setupECAP(HAL_MTR_Handle handle)
{
uint16_t cnt;
eCAP_INPUTXBAR_init(handle);
HAL_MTR_Obj *obj = (HAL_MTR_Obj*) handle;
for (cnt = 0; cnt < 2; cnt++)
{
// Disable ,clear all capture flags and interrupts
ECAP_disableInterrupt(obj->ecapHandle[cnt],
(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
ECAP_ISR_SOURCE_COUNTER_COMPARE));
ECAP_clearInterrupt(obj->ecapHandle[cnt],
(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
ECAP_ISR_SOURCE_COUNTER_COMPARE));
// Disables time stamp capture.
ECAP_disableTimeStampCapture(obj->ecapHandle[cnt]);
// Stops Time stamp counter.
ECAP_stopCounter(obj->ecapHandle[cnt]);
// Sets eCAP in Capture mode.
ECAP_enableCaptureMode(obj->ecapHandle[cnt]);
// Sets the capture mode.
ECAP_setCaptureMode(obj->ecapHandle[cnt],ECAP_ONE_SHOT_CAPTURE_MODE,ECAP_EVENT_4);
// Sets the Capture event prescaler.
ECAP_setEventPrescaler(obj->ecapHandle[cnt], 0U);
// Sets the Capture event polarity.
ECAP_setEventPolarity(obj->ecapHandle[cnt],ECAP_EVENT_1,ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(obj->ecapHandle[cnt],ECAP_EVENT_2,ECAP_EVNT_FALLING_EDGE);
ECAP_setEventPolarity(obj->ecapHandle[cnt],ECAP_EVENT_3,ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(obj->ecapHandle[cnt],ECAP_EVENT_4,ECAP_EVNT_FALLING_EDGE);
// Configure counter reset on events
ECAP_disableCounterResetOnEvent(obj->ecapHandle[cnt],ECAP_EVENT_1);
ECAP_disableCounterResetOnEvent(obj->ecapHandle[cnt],ECAP_EVENT_2);
ECAP_disableCounterResetOnEvent(obj->ecapHandle[cnt],ECAP_EVENT_3);
ECAP_enableCounterResetOnEvent(obj->ecapHandle[cnt],ECAP_EVENT_4);
// Sets a phase shift value count.
ECAP_setPhaseShiftCount(obj->ecapHandle[cnt],0U);
// Disable counter loading with phase shift value.
ECAP_disableLoadCounter(obj->ecapHandle[cnt]);
// Configures Sync out signal mode.
ECAP_setSyncOutMode(obj->ecapHandle[cnt],ECAP_SYNC_OUT_SYNCI);
// Configures emulation mode.
ECAP_setEmulationMode(obj->ecapHandle[cnt],ECAP_EMULATION_STOP);
// Starts Time stamp counter.
ECAP_startCounter(obj->ecapHandle[cnt]);
// Enables time stamp capture.
ECAP_enableTimeStampCapture(obj->ecapHandle[cnt]);
// Re-arms the eCAP module.
//ECAP_reArm(obj->ecapHandle[cnt]);
//INFO: Re-Arming is done in the PWM ISR(PWM ISR frequency 10 KHz)
}
}
__interrupt void M2_INT_DCbusECap_ISR(void)
{
ECAPVars[1].dcbus_counter++;
uint32_t cap1_count = 0;
uint32_t cap2_count = 0;
uint32_t cap3_count = 0;
// uint32_t cap4_count = 0;
cap1_count = ECAP_getEventTimeStamp(M2_ECAP_VDC_BASE, ECAP_EVENT_1); //1st raising edge
cap2_count = ECAP_getEventTimeStamp(M2_ECAP_VDC_BASE, ECAP_EVENT_2); //1st falling edge
cap3_count = ECAP_getEventTimeStamp(M2_ECAP_VDC_BASE, ECAP_EVENT_3); //2nd raising edge
// cap4_count = ECAP_getEventTimeStamp(M2_ECAP_VDC_BASE, ECAP_EVENT_4); //2nd falling edge
ECAPVars[1].dcbus_derivedDT_raw = (float32_t) (cap2_count - cap1_count)
/ (cap3_count - cap1_count);
ECAPVars[1].dcbus_derivedDT_raw += ECAPVars[1].dcbus_offsetDTRaw;
if (ECAPVars[1].dcbus_derivedDT_raw > 0.77)
{
ECAPVars[1].dcbus_derivedDT_raw = 0.77;
}
else if (ECAPVars[1].dcbus_derivedDT_raw <= 0.1)
{
ECAPVars[1].dcbus_derivedDT_raw = 0.10;
}
//Converting floating point representation into fixed point representation and feeding it to the IIR filter pow(2,15)
m2_iir_dcbus.input = (int16_t) (ECAPVars[1].dcbus_derivedDT_raw * 32768);
m2_iir_dcbus.calc(&m2_iir_dcbus);
//Converting fixed point representation back to floating point representation.pow(2,15)
ECAPVars[1].dcbus_derivedDTFiltered = __divf32(m2_iir_dcbus.output*2,32768.0) * 100;
if (ECAPVars[1].dcbus_derivedDTFiltered > 77)
{
ECAPVars[1].dcbus_derivedDTFiltered = 77;
}
else if (ECAPVars[1].dcbus_derivedDTFiltered <= 10)
{
ECAPVars[1].dcbus_derivedDTFiltered = 10;
}
// ECAPVars[1].dcbus_derivedDTFiltered = ECAPVars[1].dcbus_derivedDT_raw * 100; //Temporary no filtering
ECAPVars[1].dcbus = 359.275 - (4.60373 * ECAPVars[1].dcbus_derivedDTFiltered);
ECAP_clearGlobalInterrupt(M2_ECAP_VDC_BASE);
ECAP_clearInterrupt(M2_ECAP_VDC_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);
}
