mppt/App/src/mppt_control.c

274 lines
5.5 KiB
C
Raw Normal View History

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-07-11 06:58:55 +00:00
SL_Mppt_para g_Mppt_Para = {0};
2024-07-12 09:02:26 +00:00
static void TrickleCharge(void);
static void ConstantCurrentCharge(void);
static void ConstantVoltageCharge(void);
static void FloatingCharge(void);
#define TrickleV 10
#define ConstantCurrentV 13
#define ConstantVoltageV 14
#define FloatingV 14
2024-07-22 06:20:24 +00:00
float duty_ratio = 0.5;
2024-07-11 06:58:55 +00:00
/**
* @brief <EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD>
* @param
* @retval OutputPower <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static float Get_OutputPower(void)
{
static float OutputPower;
static float V_out, I_out;
// float V_out_array[array_num];
// float I_out_array[array_num];
// float V_temp = 0;
// float I_temp = 0;
// for (int var = 0; var < array_num; ++var) {
// I_out_array[var] = get_CHG_CURR();
// V_out_array[var] = get_PV_VOLT_OUT();
// Delay_Ms(1);
// }
//
// for (int var = 0; var < array_num; ++var) {
// I_temp += I_out_array[var];
// V_temp += V_out_array[var];
// }
// for (int var = 0; var < array_num; ++var) {
// I_temp += get_CHG_CURR();
// V_temp += get_PV_VOLT_OUT();
// Delay_Ms(1);
// }
// V_out = V_temp / array_num;
// I_out = I_temp / array_num;
V_out = get_PV_VOLT_OUT();
I_out = get_CHG_CURR();
OutputPower = V_out * I_out;
printf(" V = %d/100, I = %d/10000, OutputPower = %d/10000 \r\n",
(int)(V_out*100), (int)(I_out * 10000), (int)(OutputPower * 10000));
return OutputPower;
}
/**
* @brief ʹ<EFBFBD>õ<EFBFBD>Ϊ<EFBFBD>Ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ,ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param
* @retval
*/
/* pwmռ<6D>ձȵ<D5B1><C8B5>ڲ<EFBFBD><DAB2><EFBFBD> */
const float step1_pwm = 0.01;
const float step2_pwm = 0.001;
//#define array_num 10
void mppt_readJust(void)
{
static float last_duty_ratio = 0.5;
static float now_duty_ratio;
static float last_OutputPower;
static float now_OutputPower;
static float step_pwm = step1_pwm;
last_OutputPower = Get_OutputPower();
printf(" duty_ratio = %d/1000 \r\n", (int)(last_duty_ratio * 1000));
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ鿴<DAB2><E9BFB4><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
now_duty_ratio = last_duty_ratio + step_pwm;
if (now_duty_ratio > 1) {
now_duty_ratio = 1;
}
Set_duty_ratio(now_duty_ratio);
now_OutputPower = Get_OutputPower();
if (now_OutputPower > last_OutputPower) {
printf(" now_OutputPower > last_OutputPower1 \r\n");
last_duty_ratio = now_duty_ratio;
return;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ鿴<DAB2><E9BFB4><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
now_duty_ratio = last_duty_ratio - step_pwm;
if (now_duty_ratio < 0) {
now_duty_ratio = 0;
}
Set_duty_ratio(now_duty_ratio);
now_OutputPower = Get_OutputPower();
if (now_OutputPower > last_OutputPower) {
printf(" now_OutputPower > last_OutputPower2 \r\n");
last_duty_ratio = now_duty_ratio;
return;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><DAB9>ʾ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>󣬴<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>Ϊԭ<CEAA><D4AD><EFBFBD>ĵ<EFBFBD> */
Set_duty_ratio(last_duty_ratio);
// step_pwm = step2_pwm;
}
void printf_data(void)
{
printf("\n");
get_CHG_CURR();
get_PV_VOLT_OUT();
get_DSG_CURR();
get_PV1_VOLT_IN();
get_PV_VOLT_IN1();
get_MOSFET_Temper();
get_PV2_VOLT_IN();
printf("\n");
}
2024-07-12 09:34:47 +00:00
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
* @param
* @retval
*
*/
void mppt_constantVoltage(float InVoltage)
2024-07-11 06:58:55 +00:00
{
2024-07-12 09:34:47 +00:00
// float temp = get_PV_VOLT_OUT();
// Set_duty_ratio(0);
// Delay_Ms(500);
// float PV1_V = get_PV1_VOLT_IN();
//
// float constant_V = 0.78 * PV1_V;
//
// temp = temp / constant_V;
//
// Set_duty_ratio(temp);
2024-07-22 06:20:24 +00:00
// static float duty_ratio = 0.5;
2024-07-12 09:34:47 +00:00
static uint8_t ConstantVoltageFlag = 1;
2024-07-22 06:20:24 +00:00
// if (ConstantVoltageFlag) {
//// Set_duty_ratio(0);
//// Delay_Ms(500);
// float temp = get_PV_VOLT_OUT();
// temp = temp / InVoltage;
// Set_duty_ratio(temp);
// ConstantVoltageFlag = 0;
// }
2024-07-12 09:34:47 +00:00
2024-07-22 06:20:24 +00:00
// Set_duty_ratio(0);
// Delay_Ms(500);
2024-07-11 06:58:55 +00:00
float PV1_V = get_PV1_VOLT_IN();
2024-07-22 06:20:24 +00:00
if (ConstantVoltageFlag) {
if (PV1_V > InVoltage) {
duty_ratio += step1_pwm;
Set_duty_ratio(duty_ratio);
} else {
duty_ratio -= step1_pwm;
Set_duty_ratio(duty_ratio);
}
if (PV1_V - InVoltage < 0.1) {
ConstantVoltageFlag = 0;
}
2024-07-12 09:34:47 +00:00
} else {
2024-07-22 06:20:24 +00:00
if (PV1_V > InVoltage) {
duty_ratio += step2_pwm;
Set_duty_ratio(duty_ratio);
} else {
duty_ratio -= step2_pwm;
Set_duty_ratio(duty_ratio);
}
if (PV1_V - InVoltage > 0.1) {
ConstantVoltageFlag = 1;
}
2024-07-12 09:34:47 +00:00
}
2024-07-22 06:20:24 +00:00
2024-07-11 06:58:55 +00:00
}
2024-07-22 06:20:24 +00:00
2024-07-12 09:02:26 +00:00
/**
2024-07-12 09:34:47 +00:00
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-07-12 09:02:26 +00:00
* @param
* @retval
*
*/
void TrickleCharge(void)
{
}
/**
2024-07-12 09:34:47 +00:00
* @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>
2024-07-12 09:02:26 +00:00
* @param
* @retval
*
*/
void ConstantCurrentCharge(void)
{
}
/**
* @brief <EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param
* @retval
*
*/
void ConstantVoltageCharge(void)
{
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param
* @retval
*
*/
void FloatingCharge(void)
{
}
void MpptContorl(void)
{
2024-07-22 06:20:24 +00:00
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF>Ǽ<EFBFBD><C7BC>ٷŵ<D9B7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><ECA3AC>ֹͣ<CDA3>ŵ<EFBFBD><C5B5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD> */
2024-07-12 09:02:26 +00:00
float OutputVoltage = get_PV_VOLT_OUT();
if (TrickleV > OutputVoltage) {
TrickleCharge();
} else if (ConstantCurrentV > OutputVoltage) {
ConstantCurrentCharge();
} else if (ConstantVoltageV > OutputVoltage) {
ConstantVoltageCharge();
} else {
FloatingCharge();
}
}
2024-07-11 06:58:55 +00:00
void test(void)
{
// mppt_readjust();
// Get_OutputPower();
2024-07-22 08:48:34 +00:00
mppt_constantVoltage(18);
2024-07-22 06:20:24 +00:00
// printf_data();
// void MpptContorl();
2024-07-11 06:58:55 +00:00
}