This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我看了官方最大功率点追踪(MPPT)的代码如下:
//############################################################################# // // FILE: mppt_dcdc.c // // TITLE: This is the solution file. // //############################################################################# // $TI Release: TIDM_SOLAR_DCDC v1.00.00.00 $ // $Release Date: Fri Oct 6 19:11:50 CDT 2023 $ // $Copyright: // Copyright (C) 2021 Texas Instruments Incorporated - http://www.ti.com/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. // // Neither the name of Texas Instruments Incorporated nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // $ //############################################################################# // //********************* the includes ****************************************** // #include <mppt_dcdc.h> // // Global Variables // // // Controller variables // MPPTDCDC_GI MPPTDCDC_gi_id = PI_DEFAULTS; MPPTDCDC_GV MPPTDCDC_gv_vBus = PI_DEFAULTS; float32_t MPPTDCDC_gi_id_out; float32_t MPPTDCDC_gv_vBus_out; // // // SOLAR variables // MPPT_INCC_F MPPTDCDC_incc1; // // Board State and Fault status variables // MPPTDCDC_stateType MPPTDCDC_state; MPPTDCDC_struct_boardFaultFlags MPPTDCDC_boardFaultFlags; // // Measurement Variables // float32_t MPPTDCDC_vOut_sensed_pu; float32_t MPPTDCDC_vOut_sensedOffset_pu; float32_t MPPTDCDC_iL_sensed_pu; float32_t MPPTDCDC_iL_sensedOffset_pu; volatile float32_t MPPTDCDC_iL_sensed_Avg_pu; float32_t MPPTDCDC_iL_sensed_pu_prev; float32_t MPPTDCDC_vPanel_sensed_pu; volatile float32_t MPPTDCDC_vPanel_sensed_Avg_pu; float32_t MPPTDCDC_vBus_sensed; float32_t MPPTDCDC_vBus_sensed_filter; float32_t MPPTDCDC_vBus_sensed_pu; float32_t MPPTDCDC_vPanel_sensedOffset_pu; float32_t MPPTDCDC_vBus_sensedOffset_pu; // // // Absolute/Display Values // volatile float32_t MPPTDCDC_guiVpanel, MPPTDCDC_guiVbus; volatile float32_t MPPTDCDC_guivOut_inst; volatile float32_t MPPTDCDC_guiiL_inst,MPPTDCDC_guiiL_Avg; // // PWM duty variables // float32_t MPPTDCDC_duty_A, MPPTDCDC_duty_B, MPPTDCDC_llc_prd; // // User command to clear the PWM trip and restore PWM signals // volatile uint16_t MPPTDCDC_clearPWMTrip; // // User command to update the duty of PWM outputs // Make sure that the desired duty values for 3 phases are written prior // using this command // volatile uint16_t MPPTDCDC_updateDuty; // // // User command to reset board state and fault flags // uint16_t MPPTDCDC_resetAllFaultStatus; // //MPPT related variables float32_t MPPTDCDC_Vpvref_Out; uint16_t MPPTDCDC_MPPT_ENABLE; uint16_t MPPTDCDC_Run_MPPT; uint16_t MPPTDCDC_MPPT_slew; // float32_t MPPTDCDC_id_pu; volatile float32_t MPPTDCDC_idRef_pu; volatile float32_t MPPTDCDC_idRef; // float32_t MPPTDCDC_activePower; #pragma SET_DATA_SECTION() DLOG_4CH MPPTDCDC_dLog1; float32_t MPPTDCDC_dBuff1[MPPTDCDC_DLOG_SIZE]; float32_t MPPTDCDC_dBuff2[MPPTDCDC_DLOG_SIZE]; float32_t MPPTDCDC_dBuff3[MPPTDCDC_DLOG_SIZE]; float32_t MPPTDCDC_dBuff4[MPPTDCDC_DLOG_SIZE]; float32_t MPPTDCDC_dVal1; float32_t MPPTDCDC_dVal2; float32_t MPPTDCDC_dVal3; float32_t MPPTDCDC_dVal4; void MPPTDCDC_globalVariablesInit(void) { // // Initialize Board state and fault flags // MPPTDCDC_state = STATE_NO_FAULT; MPPTDCDC_boardFaultFlags.fault_iL_overCurrent = false; MPPTDCDC_boardFaultFlags.fault_vPanel_overVoltage = false; MPPTDCDC_boardFaultFlags.fault_vBus_overVoltage = false; //*********************Solar MPPT init******************************** /* // mppt incc mppt_incc1.IpvH = _IQ(0.0001); mppt_incc1.IpvL = _IQ(-0.0001); mppt_incc1.VpvH = _IQ(0.0001); mppt_incc1.VpvL = _IQ(-0.0001); mppt_incc1.MaxVolt = _IQ(0.9); mppt_incc1.MinVolt = _IQ(0.0); mppt_incc1.Stepsize = _IQ(0.001); mppt_incc1.mppt_first=1; mppt_incc1.mppt_enable=0; //mppt pno mppt_pno1.DeltaPmin = _IQ(0.00001); mppt_pno1.MaxVolt = _IQ(0.9); mppt_pno1.MinVolt = _IQ(0.0); mppt_pno1.Stepsize = _IQ(0.001);*/ //MPPT_INCC_IQ_init(&MPPTDCDC_incc1); // Solar MPPT initialization. MPPT INCC algo generates Ref voltage for DC/DC Input voltage (Vin) control loop //MPPT_INCC_F_init(&MPPTDCDC_incc1); MPPTDCDC_incc1.IpvH = 0.0001f; MPPTDCDC_incc1.IpvL = -0.0001f; MPPTDCDC_incc1.VpvH = 0.0001f; MPPTDCDC_incc1.VpvL = -0.0001f; MPPTDCDC_incc1.MaxVolt = MPPT_DCDC_INCC_MAX_V; MPPTDCDC_incc1.MinVolt = MPPT_DCDC_INCC_MIN_V; MPPTDCDC_incc1.Stepsize = MPPT_DCDC_INCC_STEPSIZE; MPPTDCDC_incc1.mppt_first = 1; MPPTDCDC_incc1.mppt_enable = 0; MPPTDCDC_incc1.StepFirst = 0.01f; //*************************************end of Solar MPPT init**************** // Data logger initialization // DLOG_4CH_reset(&MPPTDCDC_dLog1); DLOG_4CH_config(&MPPTDCDC_dLog1, &MPPTDCDC_dVal1, &MPPTDCDC_dVal2, &MPPTDCDC_dVal3, &MPPTDCDC_dVal4, MPPTDCDC_dBuff1, MPPTDCDC_dBuff2, MPPTDCDC_dBuff3, MPPTDCDC_dBuff4, MPPTDCDC_DLOG_SIZE, MPPTDCDC_DLOG_TRIGGER, MPPTDCDC_DLOG_SCALE); // // PI coefficients // MPPTDCDC_gi_id.Kp = MPPT_DCDC_GI_PI_KP; MPPTDCDC_gi_id.Ki = MPPT_DCDC_GI_PI_KI; MPPTDCDC_gi_id.Umax = MPPT_DCDC_GI_PI_MAX; MPPTDCDC_gi_id.Umin = MPPT_DCDC_GI_PI_MIN; MPPTDCDC_gv_vBus.Kp = MPPT_DCDC_GV_PI_KP; //Voltage_Loop_Riccardo MPPTDCDC_gv_vBus.Ki = MPPT_DCDC_GV_PI_KI; MPPTDCDC_gv_vBus.Umax = MPPT_DCDC_GV_PI_MAX; MPPTDCDC_gv_vBus.Umin = MPPT_DCDC_GV_PI_MIN; MPPTDCDC_Vpvref_Out = 0.0f; MPPTDCDC_MPPT_ENABLE = 0; MPPTDCDC_Run_MPPT = 0; MPPTDCDC_MPPT_slew = 0; MPPTDCDC_id_pu = 0.0f; MPPTDCDC_idRef_pu = MPPT_DCDC_IREF_DEFAULT; MPPTDCDC_idRef = MPPT_DCDC_IREF_DEFAULT; MPPTDCDC_vOut_sensed_pu = 0.0f; MPPTDCDC_vOut_sensedOffset_pu = 0.0f; MPPTDCDC_iL_sensed_pu = 0.0f; MPPTDCDC_iL_sensed_Avg_pu = 0.0f; MPPTDCDC_iL_sensed_pu_prev = 0.0f; MPPTDCDC_iL_sensedOffset_pu = 0.0f; MPPTDCDC_vPanel_sensed_pu = 0.0f; MPPTDCDC_vPanel_sensed_Avg_pu = 0.0f; MPPTDCDC_vPanel_sensedOffset_pu = 0.0f; MPPTDCDC_vBus_sensedOffset_pu = 0.0f; // // Initializing absolute instantaneous values // MPPTDCDC_guiVpanel = 0.0f; MPPTDCDC_guiVbus = 0.0f; MPPTDCDC_guiiL_inst = 0.0f; MPPTDCDC_guiiL_Avg = 0.0f; MPPTDCDC_activePower = 0.0f; // // Duty initialization // MPPTDCDC_duty_A = 0.0f; MPPTDCDC_duty_B = 0.0f; MPPTDCDC_llc_prd = MPPT_DCDC_LLC_PWM_PRD_DEFAULT*0.5f; MPPTDCDC_clearPWMTrip = 0; MPPTDCDC_updateDuty = 0; MPPTDCDC_resetAllFaultStatus = 0; // } // // SFRA Related Variables // float32_t MPPTDCDC_plantMagVect[MPPT_DCDC_SFRA_FREQ_LENGTH]; float32_t MPPTDCDC_plantPhaseVect[MPPT_DCDC_SFRA_FREQ_LENGTH]; float32_t MPPTDCDC_olMagVect[MPPT_DCDC_SFRA_FREQ_LENGTH]; float32_t MPPTDCDC_olPhaseVect[MPPT_DCDC_SFRA_FREQ_LENGTH]; float32_t MPPTDCDC_freqVect[MPPT_DCDC_SFRA_FREQ_LENGTH]; SFRA_F32 MPPTDCDC_sfra1; // // Setup SFRA for capturing plant and close loop response // void MPPTDCDC_setupSFRA(void) { SFRA_F32_reset(&MPPTDCDC_sfra1); SFRA_F32_config(&MPPTDCDC_sfra1, MPPT_DCDC_SFRA_ISR_FREQ, MPPT_DCDC_SFRA_AMPLITUDE, MPPT_DCDC_SFRA_FREQ_LENGTH, MPPT_DCDC_SFRA_FREQ_START, MPPT_DCDC_SFRA_FREQ_STEP_MULTIPLY, MPPTDCDC_plantMagVect, MPPTDCDC_plantPhaseVect, MPPTDCDC_olMagVect, MPPTDCDC_olPhaseVect, NULL, NULL, MPPTDCDC_freqVect, 1); SFRA_F32_resetFreqRespArray(&MPPTDCDC_sfra1); SFRA_F32_initFreqArrayWithLogSteps(&MPPTDCDC_sfra1, MPPT_DCDC_SFRA_FREQ_START, MPPT_DCDC_SFRA_FREQ_STEP_MULTIPLY); SFRA_GUI_config(MPPT_DCDC_SFRA_GUI_SCI_BASE, MPPT_DCDC_SCI_VBUS_CLK, MPPT_DCDC_SFRA_GUI_SCI_BAUDRATE, MPPT_DCDC_SFRA_GUI_SCIRX_GPIO, MPPT_DCDC_SFRA_GUI_SCIRX_GPIO_PIN_CONFIG, MPPT_DCDC_SFRA_GUI_SCITX_GPIO, MPPT_DCDC_SFRA_GUI_SCITX_GPIO_PIN_CONFIG, MPPT_DCDC_SFRA_GUI_LED_INDICATOR, 0, 0, &MPPTDCDC_sfra1, 1); } void MPPTDCDC_runSFRABackGroundTasks(void) { // // Call SFRA BG Task which takes care of switching between // frequency points and saving gain/phase data for each // frequency point // SFRA_F32_runBackgroundTask(&MPPTDCDC_sfra1); // // Call to this routine keeps the SCI communication alive with GUI // SFRA_GUI_runSerialHostComms(&MPPTDCDC_sfra1); } /* void MPPTDCDC_calibrateOffset(uint16_t count) { uint16_t n = count; while (n > 0) { n--; MPPTDCDC_HAL_forceAllSOCs(); // // Wait till all ADC conversion complete check // while(!MPPTDCDC_HAL_adcConversionComplete()); MPPTDCDC_vOut_sensedOffset_pu += (float32_t)MPPT_DCDC_HAL_VOUT_FB * MPPT_DCDC_ADC_PU_SCALE_FACTOR; MPPTDCDC_iL_sensedOffset_pu += (float32_t)MPPT_DCDC_HAL_IL_FB * MPPT_DCDC_ADC_PU_SCALE_FACTOR; MPPTDCDC_vPanel_sensedOffset_pu += (float32_t)MPPT_DCDC_VPANEL_FB * MPPT_DCDC_ADC_PU_SCALE_FACTOR; MPPTDCDC_vBus_sensedOffset_pu += (float32_t)MPPT_DCDC_VBUS_FB * MPPT_DCDC_ADC_PU_SCALE_FACTOR; } MPPTDCDC_vOut_sensedOffset_pu = MPPTDCDC_vOut_sensedOffset_pu / ((float32_t)count); MPPTDCDC_iL_sensedOffset_pu = MPPTDCDC_iL_sensedOffset_pu / ((float32_t)count); MPPTDCDC_vPanel_sensedOffset_pu = MPPTDCDC_vPanel_sensedOffset_pu / ((float32_t)count); MPPTDCDC_vBus_sensedOffset_pu = MPPTDCDC_vBus_sensedOffset_pu / ((float32_t)count); }*/ void MPPTDCDC_updateFaultStatus(void) { #if MPPT_DCDC_CMPSS_PROTECTION_ENABLED == 1U if(MPPTDCDC_HAL_get_iL_overCurrentFlag()) { MPPTDCDC_boardFaultFlags.fault_iL_overCurrent = true; } else { MPPTDCDC_boardFaultFlags.fault_iL_overCurrent = false; } #else MPPTDCDC_boardFaultFlags.fault_iL_overCurrent = false; #endif if(MPPTDCDC_resetAllFaultStatus == 1) { MPPTDCDC_HAL_clearAllFaultFlags(); MPPTDCDC_resetAllFaultStatus = 0; MPPTDCDC_state = STATE_NO_FAULT; MPPTDCDC_boardFaultFlags.fault_iL_overCurrent = false; MPPTDCDC_boardFaultFlags.fault_vPanel_overVoltage = false; MPPTDCDC_boardFaultFlags.fault_vBus_overVoltage = false; } }
我不知道该怎么使用这个代码,也不太能理解其原理和方法。求指导。