主题中讨论的其他器件: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); }