-
这段代码是一个函数CLLLC_runISR3,它的作用是更新一些变量的值。具体来说,它运行了四个EMA滤波器,然后计算了一些电压和电流的值。接下来,根据控制模式和电源流向,更新了一些参考电压或电流的值。最后,计算了PWM死区的值并更新了PWM死区。
-
void CLLLC_runISR3(void) { EMAVG_run(&CLLLC_iSecSensedAvg_pu, CLLLC_iSecSensed_pu); EMAVG_run(&CLLLC_iPrimSensedAvg_pu, CLLLC_iPrimSensed_pu); EMAVG_run(&CLLLC_vSecSensedAvg_pu, CLLLC_vSecSensed_pu); EMAVG_run(&CLLLC_vPrimSensedAvg_pu, CLLLC_vPrimSensed_pu); CLLLC_vPrimSensed_Volts = CLLLC_vPrimSensedAvg_pu.out * CLLLC_VPRIM_MAX_SENSE_VOLTS; CLLLC_vSecSensed_Volts = CLLLC_vSecSensedAvg_pu.out * CLLLC_VSEC_OPTIMAL_RANGE_VOLTS; CLLLC_iPrimSensed_Amps = CLLLC_iPrimSensedAvg_pu.out * CLLLC_IPRIM_MAX_SENSE_AMPS; CLLLC_iSecSensed_Amps = CLLLC_iSecSensedAvg_pu.out * CLLLC_ISEC_MAX_SENSE_AMPS; #if CLLLC_CONTROL_MODE == CLLLC_VOLTAGE_MODE #if CLLLC_POWER_FLOW == CLLLC_POWER_FLOW_PRIM_SEC CLLLC_vSecRef_pu = CLLLC_vSecRef_Volts / CLLLC_VSEC_OPTIMAL_RANGE_VOLTS; if((CLLLC_vSecRef_pu - CLLLC_vSecRefSlewed_pu) > (2.0 * CLLLC_VOLTS_PER_SECOND_SLEW / CLLLC_VSEC_OPTIMAL_RANGE_VOLTS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)) { CLLLC_vSecRefSlewed_pu = CLLLC_vSecRefSlewed_pu + ((CLLLC_VOLTS_PER_SECOND_SLEW / CLLLC_VSEC_OPTIMAL_RANGE_VOLTS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)); } else if((CLLLC_vSecRef_pu - CLLLC_vSecRefSlewed_pu) < - (2.0 * CLLLC_VOLTS_PER_SECOND_SLEW / CLLLC_VSEC_OPTIMAL_RANGE_VOLTS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)) { CLLLC_vSecRefSlewed_pu = CLLLC_vSecRefSlewed_pu - ((CLLLC_VOLTS_PER_SECOND_SLEW / CLLLC_VSEC_OPTIMAL_RANGE_VOLTS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)); } else { CLLLC_vSecRefSlewed_pu = CLLLC_vSecRef_pu; } #elif CLLLC_POWER_FLOW == CLLLC_POWER_FLOW_SEC_PRIM CLLLC_vPrimRef_pu = CLLLC_vPrimRef_Volts / CLLLC_VPRIM_MAX_SENSE_VOLTS; if((CLLLC_vPrimRef_pu - CLLLC_vPrimRefSlewed_pu) > (2.0 * CLLLC_VOLTS_PER_SECOND_SLEW / CLLLC_VPRIM_MAX_SENSE_VOLTS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)) { CLLLC_vPrimRefSlewed_pu = CLLLC_vPrimRefSlewed_pu + ((CLLLC_VOLTS_PER_SECOND_SLEW / CLLLC_VPRIM_MAX_SENSE_VOLTS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)); } else if((CLLLC_vPrimRef_pu - CLLLC_vPrimRefSlewed_pu) < - (2.0 * CLLLC_VOLTS_PER_SECOND_SLEW / CLLLC_VPRIM_MAX_SENSE_VOLTS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)) { CLLLC_vPrimRefSlewed_pu = CLLLC_vPrimRefSlewed_pu - ((CLLLC_VOLTS_PER_SECOND_SLEW / CLLLC_VPRIM_MAX_SENSE_VOLTS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)); } else { CLLLC_vPrimRefSlewed_pu = CLLLC_vPrimRef_pu; } #endif #else CLLLC_iSecRef_pu = CLLLC_iSecRef_Amps / CLLLC_ISEC_MAX_SENSE_AMPS; if((CLLLC_iSecRef_pu - CLLLC_iSecRefSlewed_pu) > (2.0 * CLLLC_AMPS_PER_SECOND_SLEW / CLLLC_ISEC_MAX_SENSE_AMPS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)) { CLLLC_iSecRefSlewed_pu = CLLLC_iSecRefSlewed_pu + ((CLLLC_AMPS_PER_SECOND_SLEW / CLLLC_ISEC_MAX_SENSE_AMPS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)); } else if((CLLLC_iSecRef_pu - CLLLC_iSecRefSlewed_pu) < - (2.0 * CLLLC_AMPS_PER_SECOND_SLEW / CLLLC_ISEC_MAX_SENSE_AMPS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)) { CLLLC_iSecRefSlewed_pu = CLLLC_iSecRefSlewed_pu - ((CLLLC_AMPS_PER_SECOND_SLEW / CLLLC_ISEC_MAX_SENSE_AMPS) * (1.0 / (float32_t)CLLLC_ISR3_FREQUENCY_HZ)); } else { CLLLC_iSecRefSlewed_pu = CLLLC_iSecRef_pu; } #endif CLLLC_calculatePWMDeadBandPrimTicks(); CLLLC_HAL_updatePWMDeadBandPrim(CLLLC_pwmDeadBandREDPrim_ticks, CLLLC_pwmDeadBandFEDPrim_ticks); }
ss
-
这段代码是用来设置TI C2000系列芯片EPWM模块的高分辨率PWM输出的函数。其中,EPWM模块是一种用于产生PWM信号的模块,HRPWM是一种高分辨率PWM技术,可以提高PWM输出的精度和分辨率。具体来说,这段代码实现了以下功能:
1.设置EPWM模块的时基寄存器,包括周期、计数器、相位等;
2.设置EPWM模块的计数比较寄存器,包括占空比等;
3.设置EPWM模块的动作限制寄存器,包括输出动作、死区时间等;
4.设置EPWM模块的高分辨率PWM功能,包括MEP控制、自动转换、周期控制等。 -
void CLLLC_HAL_setupHRPWMinUpDownCount2ChAsymmetricMode(uint32_t base1, float32_t pwmFreq_Hz, float32_t pwmSysClkFreq_Hz) { uint32_t pwmPeriod_ticks; pwmPeriod_ticks = TICKS_IN_PWM_FREQUENCY(pwmFreq_Hz, pwmSysClkFreq_Hz); // // Time Base SubModule Registers // EPWM_setPeriodLoadMode(base1, EPWM_PERIOD_SHADOW_LOAD); EPWM_setTimeBasePeriod(base1, pwmPeriod_ticks >> 1); EPWM_setTimeBaseCounter(base1, 0); EPWM_setPhaseShift(base1, 0); EPWM_setTimeBaseCounterMode(base1, EPWM_COUNTER_MODE_UP_DOWN); EPWM_setClockPrescaler(base1, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // // Counter Compare Submodule Registers // set duty 50% initially // EPWM_setCounterCompareValue(base1, EPWM_COUNTER_COMPARE_A, pwmPeriod_ticks >> 2); // // set as shadow mode // EPWM_setCounterCompareShadowLoadMode(base1, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD); EPWM_setCounterCompareValue(base1, EPWM_COUNTER_COMPARE_B, pwmPeriod_ticks >> 2); EALLOW; // // Clear AQCTLA, B and Deadband settings settings // HWREGH(base1 + EPWM_O_AQCTLA) = 0x0000; HWREGH(base1 + EPWM_O_AQCTLB) = 0x0000; HWREGH(base1 + EPWM_O_DCBCTL) = 0x0000; EDIS; // // Action Qualifier SubModule Registers // CTR = CMPA@0 , xA set to 1 // EPWM_setActionQualifierAction(base1, EPWM_AQ_OUTPUT_A , EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO ); // // CTR = CMPA@Up , xA set to 0 // EPWM_setActionQualifierAction(base1, EPWM_AQ_OUTPUT_A , EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // // CTR = CMPB@PERIOD, xB set to 1 // EPWM_setActionQualifierAction(base1, EPWM_AQ_OUTPUT_B , EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD); // // CTR = CMPB@DOWN , xB set to 0 // EPWM_setActionQualifierAction(base1, EPWM_AQ_OUTPUT_B , EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); // // Hi-res PWM // MEP control on both edges. // HRPWM_setMEPEdgeSelect(base1, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE); HRPWM_setCounterCompareShadowLoadEvent(base1, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD); HRPWM_setMEPEdgeSelect(base1, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE); HRPWM_setCounterCompareShadowLoadEvent(base1, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD); HRPWM_setMEPControlMode(base1, HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL); HRPWM_setMEPControlMode(base1, HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL); // // Enable autoconversion // HRPWM_enableAutoConversion(base1); // // Enable TBPHSHR sync (required for updwn count HR control) // HRPWM_enablePhaseShiftLoad(base1); // // Turn on high-resolution period control. // HRPWM_enablePeriodControl(base1); }
CLLLC.C
最新推荐文章于 2024-08-07 13:05:48 发布