2024-07-11 06:58:55 +00:00
|
|
|
|
/*
|
|
|
|
|
* mppt_control.c
|
|
|
|
|
*
|
|
|
|
|
* Created on: 2024<EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>29<EFBFBD><EFBFBD>
|
|
|
|
|
* Author: psx
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "mppt_control.h"
|
|
|
|
|
#include "collect_Conversion.h"
|
|
|
|
|
#include "pwm.h"
|
|
|
|
|
#include "inflash.h"
|
2024-07-22 06:20:24 +00:00
|
|
|
|
#include "gpio.h"
|
2024-08-29 02:50:22 +00:00
|
|
|
|
#include "sl_protocol.h"
|
|
|
|
|
#include "task.h"
|
2024-08-17 03:14:19 +00:00
|
|
|
|
#include "uart_dev.h"
|
2024-10-12 09:51:15 +00:00
|
|
|
|
#include "parameter.h"
|
2024-10-18 08:55:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void ConstantCurrentCharge(void);
|
|
|
|
|
static void ConstantVoltageCharge(void);
|
|
|
|
|
static void FloatingCharge(void);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD>㶨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void mppt_constantVoltage(float InVoltage)
|
|
|
|
|
{
|
|
|
|
|
static float_t kp = 0.005;
|
|
|
|
|
static float_t ki = 0.00001;
|
|
|
|
|
|
2024-10-26 01:07:30 +00:00
|
|
|
|
float_t pv1Volt = g_otherParameter.Solar_In_Circuit_Voltage;
|
2024-10-18 08:55:39 +00:00
|
|
|
|
float_t error = pv1Volt - InVoltage;
|
|
|
|
|
float_t stepPwm = kp * error + ki * pv1Volt;
|
|
|
|
|
g_controlParameter.dutyRatio += stepPwm;
|
|
|
|
|
|
|
|
|
|
Set_duty_ratio(&g_controlParameter.dutyRatio);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD>㶨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void mppt_constantVoltageB(float OutVoltage)
|
|
|
|
|
{
|
|
|
|
|
static float_t kp = 0.005;
|
|
|
|
|
static float_t ki = 0.00001;
|
|
|
|
|
|
|
|
|
|
float_t outVolt = g_otherParameter.Battery_Voltage;
|
|
|
|
|
|
|
|
|
|
float_t error = OutVoltage - outVolt;
|
|
|
|
|
float_t stepPwm = kp * error + ki * outVolt;
|
|
|
|
|
g_controlParameter.dutyRatio += stepPwm;
|
|
|
|
|
|
|
|
|
|
Set_duty_ratio(&g_controlParameter.dutyRatio);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD>㶨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void mppt_constantVoltageO(float OutVoltage)
|
|
|
|
|
{
|
|
|
|
|
static float_t kp = 0.005;
|
|
|
|
|
static float_t ki = 0.00001;
|
|
|
|
|
|
|
|
|
|
float_t outVolt = g_otherParameter.Output_Voltage;
|
|
|
|
|
|
|
|
|
|
float_t error = OutVoltage - outVolt;
|
|
|
|
|
float_t stepPwm = kp * error + ki * outVolt;
|
|
|
|
|
g_controlParameter.dutyRatio += stepPwm;
|
|
|
|
|
|
|
|
|
|
Set_duty_ratio(&g_controlParameter.dutyRatio);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磩<EFBFBD><EFBFBD>mppt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʳ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void ConstantCurrentCharge(void)
|
|
|
|
|
{
|
|
|
|
|
mppt_constantVoltage(18);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void ConstantVoltageCharge(void)
|
|
|
|
|
{
|
|
|
|
|
mppt_constantVoltageO(g_controlParameter.constantVoltageChargeV);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void FloatingCharge(void)
|
|
|
|
|
{
|
|
|
|
|
mppt_constantVoltageO(g_controlParameter.FloatV);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief mppt<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void MpptContorlChoice(void)
|
|
|
|
|
{
|
|
|
|
|
switch(g_otherParameter.MPPT_Mode) {
|
|
|
|
|
|
|
|
|
|
case CONSTANTCURRENT:
|
|
|
|
|
ConstantCurrentCharge();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CONSTANTVOLTAGE:
|
|
|
|
|
ConstantVoltageCharge();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FLOAT:
|
|
|
|
|
FloatingCharge();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief mpptģʽ<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void MpptModeChoice(void)
|
|
|
|
|
{
|
|
|
|
|
/* ̫<><CCAB><EFBFBD>ܰ<EFBFBD><DCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹС<D1B9><D0A1>һ<EFBFBD><D2BB>ֵ<EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲС<D2B2><D0A1>һ<EFBFBD><D2BB>ֵʱmpptֹͣ<CDA3><D6B9><EFBFBD><EFBFBD> */
|
|
|
|
|
if ((g_otherParameter.Input_Voltage < g_controlParameter.stopSolarOpenCircuitV
|
|
|
|
|
&& g_otherParameter.Charg_Current < 0.05) ){
|
|
|
|
|
// && g_otherParameter.MPPT_Mode != NoWork) {
|
|
|
|
|
g_otherParameter.MPPT_Mode = NoWork;
|
|
|
|
|
|
|
|
|
|
TIM_Cmd(TIM3, DISABLE);
|
|
|
|
|
TIM_SetCompare4(TIM4, 0);
|
|
|
|
|
g_controlParameter.dutyRatio = 0;
|
|
|
|
|
|
|
|
|
|
TimeSliceOffset_Register(&g_startMpptControl, Task_startMpptControl
|
|
|
|
|
, startMpptControl_reloadVal, startMpptControl_offset);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĵ<D8B5><C4B5><EFBFBD>С<EFBFBD><D0A1>һ<EFBFBD><D2BB>ֵ<EFBFBD><D6B5><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߹<EFBFBD>С<EFBFBD><D0A1><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
if ((g_otherParameter.Charg_BatteryCurrent < 0.05 && g_otherParameter.Charg_BatteryCurrent > -0.05)
|
|
|
|
|
|| g_otherParameter.Battery_Voltage > 16 || g_otherParameter.Battery_Voltage < 8) {
|
|
|
|
|
g_otherParameter.MPPT_Mode = FLOAT;
|
|
|
|
|
g_otherParameter.batteryState = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* */
|
|
|
|
|
if ((g_controlParameter.constantVoltageV - 0.2) >= g_otherParameter.Battery_Voltage
|
|
|
|
|
&& g_otherParameter.Charg_Current > 0.1) {
|
|
|
|
|
g_otherParameter.MPPT_Mode = CONSTANTCURRENT;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-26 01:07:30 +00:00
|
|
|
|
if ((g_controlParameter.constantVoltageV < g_otherParameter.Battery_Voltage)
|
|
|
|
|
&& (g_controlParameter.floatI + 0.1 <= g_otherParameter.Charg_Current)) {
|
2024-10-18 08:55:39 +00:00
|
|
|
|
g_otherParameter.MPPT_Mode = CONSTANTVOLTAGE;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((((g_controlParameter.constantVoltageV < g_otherParameter.Battery_Voltage)
|
|
|
|
|
&& (g_controlParameter.floatI > g_otherParameter.Charg_Current))
|
|
|
|
|
&& (g_controlParameter.floatI > g_otherParameter.Discharg_Current))) {
|
|
|
|
|
g_otherParameter.MPPT_Mode = FLOAT;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief mppt<EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void MpptContorl(void)
|
|
|
|
|
{
|
|
|
|
|
g_otherParameter.Output_Voltage = get_PV_VOLT_OUT();
|
2024-10-26 01:07:30 +00:00
|
|
|
|
g_otherParameter.Solar_In_Circuit_Voltage = get_PV1_VOLT_IN();
|
2024-10-18 08:55:39 +00:00
|
|
|
|
|
2024-10-26 01:07:30 +00:00
|
|
|
|
// /* <20><><EFBFBD><EFBFBD>adc<64>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>ȫΪ0,<2C>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
|
|
|
|
|
// if (g_otherParameter.Discharg_Current == 0 && g_otherParameter.Charg_Current == 0) {
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
2024-10-18 08:55:39 +00:00
|
|
|
|
|
|
|
|
|
g_otherParameter.Charg_BatteryCurrent = g_otherParameter.Charg_Current - g_otherParameter.Discharg_Current;
|
|
|
|
|
|
|
|
|
|
/* <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><DEB5><EFBFBD> */
|
|
|
|
|
if (g_otherParameter.batteryState == 0 && (g_otherParameter.Charg_BatteryCurrent > 0.1 || g_otherParameter.Charg_BatteryCurrent < -0.1)
|
|
|
|
|
&& g_otherParameter.Output_Voltage < 14.2) {
|
|
|
|
|
g_otherParameter.batteryState = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!g_otherParameter.overTemperature) {
|
|
|
|
|
MpptModeChoice();
|
|
|
|
|
MpptContorlChoice();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|