CLLLC.C

  1. 这段代码是一个函数CLLLC_runISR3,它的作用是更新一些变量的值。具体来说,它运行了四个EMA滤波器,然后计算了一些电压和电流的值。接下来,根据控制模式和电源流向,更新了一些参考电压或电流的值。最后,计算了PWM死区的值并更新了PWM死区。 

  2. 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

  3. 这段代码是用来设置TI C2000系列芯片EPWM模块的高分辨率PWM输出的函数。其中,EPWM模块是一种用于产生PWM信号的模块,HRPWM是一种高分辨率PWM技术,可以提高PWM输出的精度和分辨率。具体来说,这段代码实现了以下功能:
    1.设置EPWM模块的时基寄存器,包括周期、计数器、相位等;
    2.设置EPWM模块的计数比较寄存器,包括占空比等;
    3.设置EPWM模块的动作限制寄存器,包括输出动作、死区时间等;
    4.设置EPWM模块的高分辨率PWM功能,包括MEP控制、自动转换、周期控制等。

  4. 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);
    
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值