From a418010b91defd480f7eb348fb66f298bbf72bf1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B7=E5=BA=8A=E5=B0=B1=E7=8A=AF=E5=9B=B0?=
<11730503+psx123456@user.noreply.gitee.com>
Date: Tue, 8 Oct 2024 15:18:44 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=B5=E6=B5=81=E9=87=87?=
=?UTF-8?q?=E9=9B=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.settings/language.settings.xml | 2 +-
App/src/collect_Conversion.c | 19 +-
App/src/mppt_control.c | 240 +-
App/src/task.c | 162 +-
Hardware/inc/adc.h | 26 +
Hardware/inc/gpio.h | 3 +-
Hardware/inc/pwm.h | 3 +
Hardware/src/adc.c | 237 +-
Hardware/src/gpio.c | 1 +
Hardware/src/tim.c | 4 +-
obj/App/src/collect_Conversion.o | Bin 42908 -> 40100 bytes
obj/App/src/mppt_control.o | Bin 74768 -> 71100 bytes
obj/App/src/task.o | Bin 117588 -> 103624 bytes
obj/Hardware/src/adc.o | Bin 23696 -> 53380 bytes
obj/Hardware/src/gpio.o | Bin 44584 -> 44724 bytes
obj/Hardware/src/tim.o | Bin 47248 -> 47352 bytes
obj/mppt_Nos_V0.4.bin | Bin 36984 -> 23344 bytes
obj/mppt_Nos_V0.4.elf | Bin 369656 -> 362448 bytes
obj/mppt_Nos_V0.4.hex | 3664 ++----
obj/mppt_Nos_V0.4.lst | 19964 ++++++++++++-----------------
obj/mppt_Nos_V0.4.map | 2253 ++--
21 files changed, 10850 insertions(+), 15728 deletions(-)
diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
index 7d58227..b8e2615 100644
--- a/.settings/language.settings.xml
+++ b/.settings/language.settings.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/App/src/collect_Conversion.c b/App/src/collect_Conversion.c
index 384ff33..6140686 100644
--- a/App/src/collect_Conversion.c
+++ b/App/src/collect_Conversion.c
@@ -221,7 +221,8 @@ float get_CHG_CURR(void)
uint16_t I_ADC;
// I_ADC = Get_ConversionVal(get_adc(CHG_CURR));
- I_ADC = get_aftercalculationAdc(CHG_CURR);
+// I_ADC = get_aftercalculationAdc(CHG_CURR);
+ I_ADC = g_adcData.total_CHG_CURR / g_adcData.num;
// I_ADC = get_adc(CHG_CURR);
// I = (float)(I_ADC) / 4095 * 3.3 * P_CHG_CURR * 2;
@@ -247,7 +248,8 @@ float get_PV_VOLT_OUT(void)
uint16_t V_ADC;
// V_ADC = Get_ConversionVal(get_adc(PV_VOLT_OUT));
- V_ADC = get_aftercalculationAdc(PV_VOLT_OUT);
+// V_ADC = get_aftercalculationAdc(PV_VOLT_OUT);
+ V_ADC = g_adcData.total_PV_VOLT_OUT / g_adcData.num;
// V_ADC = get_adc(PV_VOLT_OUT);
V = (float)(V_ADC) / 4095 * 2.5 * P_PV_VOLT_OUT;
@@ -276,9 +278,11 @@ float get_DSG_CURR(void)
uint16_t I_ADC;
// I_ADC = Get_ConversionVal(get_adc(DSG_CURR));
- I_ADC = get_aftercalculationAdc(DSG_CURR);
+// I_ADC = get_aftercalculationAdc(DSG_CURR);
+ I_ADC = g_adcData.total_DSG_CURR / g_adcData.num;
// I_ADC = get_adc(DSG_CURR);
+
// I = (float)(I_ADC) / 4095 * 3.3 * P_DSG_CURR * 2;
I = (float)(I_ADC) / 4095 * 2.5 * P_DSG_CURR;
@@ -302,7 +306,8 @@ float get_PV1_VOLT_IN(void)
// GPIO_WriteBit(G_FFMOS_CON1_GPIO, G_FFMOS_CON1_PIN, SET);
// V_ADC = Get_ConversionVal(get_adc(PV1_VOLT_IN));
- V_ADC = get_aftercalculationAdc(PV1_VOLT_IN);
+// V_ADC = get_aftercalculationAdc(PV1_VOLT_IN);
+ V_ADC = g_adcData.total_PV1_VOLT_IN / g_adcData.num;
// V_ADC = get_adc(PV1_VOLT_IN);
// GPIO_WriteBit(G_FFMOS_CON1_GPIO, G_FFMOS_CON1_PIN, RESET);
@@ -328,7 +333,8 @@ float get_PV_VOLT_IN1(void)
uint16_t V_ADC;
// V_ADC = Get_ConversionVal(get_adc(PV_VOLT_IN1));
- V_ADC = get_aftercalculationAdc(PV_VOLT_IN1);
+// V_ADC = get_aftercalculationAdc(PV_VOLT_IN1);
+ V_ADC = g_adcData.total_PV_VOLT_IN1 / g_adcData.num;
// V_ADC = get_adc(PV_VOLT_IN1);
V = (float)(V_ADC) / 4095 * 2.5 * P_PV_VOLT_IN1;
@@ -358,7 +364,8 @@ float get_MOSFET_Temper(void)
uint16_t T_ADC;
// T_ADC = Get_ConversionVal(get_adc(MOSFET_Temper));
- T_ADC = get_aftercalculationAdc(MOSFET_Temper);
+// T_ADC = get_aftercalculationAdc(MOSFET_Temper);
+ T_ADC = g_adcData.total_MOSFET_Temper / g_adcData.num;
// char buffer[30];
// memset(buffer, 0, sizeof(buffer));
diff --git a/App/src/mppt_control.c b/App/src/mppt_control.c
index 348bc14..3f7be52 100644
--- a/App/src/mppt_control.c
+++ b/App/src/mppt_control.c
@@ -12,6 +12,7 @@
#include "gpio.h"
#include "sl_protocol.h"
#include "task.h"
+#include "adc.h"
#include "uart_dev.h"
@@ -807,119 +808,148 @@ void findMiNDutyRatio(void)
void test(void)
{
-// mppt_readjust();
-// Get_OutputPower();
-
-// mppt_constantVoltage(18);
-
-// findMiNDutyRatio();
-// MpptContorl();
-
-// printf_data();
-// void MpptContorl();
-
-// mppt_constantVoltageO(12);
-
-// FloatingCharge();
-// mppt_readJust();
-
-// mppt_constantCurrentO(1);
-
-
-// if (g_interruptNum < 5) {
-// g_interruptNum++;
-// return;
-// }
-// g_Mppt_Para.Charg_Current = get_capturedata(get_CHG_CURR);
-// g_Mppt_Para.Discharg_Current = get_capturedata(get_DSG_CURR);
-// g_Mppt_Para.Output_Voltage = get_capturedata(get_PV_VOLT_OUT);
-// g_Mppt_Para.Battery_Voltage = g_Mppt_Para.Output_Voltage;
- g_Mppt_Para.Charg_Current = get_CHG_CURR();
+// g_Mppt_Para.Charg_Current = get_CHG_CURR();
g_Mppt_Para.Discharg_Current = get_DSG_CURR();
- g_Mppt_Para.Output_Voltage = get_PV_VOLT_OUT();
- g_Mppt_Para.Input_Voltage = get_PV1_VOLT_IN();
+// g_Mppt_Para.Output_Voltage = get_PV_VOLT_OUT();
+// g_Mppt_Para.Input_Voltage = get_PV1_VOLT_IN();
+// g_Mppt_Para.HighSideMos_Temperature = get_MOSFET_Temper();
-// mppt_constantVoltage(18);
-// return;
+// printf("\n");
+// printf("\n");
+// printf("\n");
+// printf("num = %d \n", g_adcData.num);
+//// printf("Charg_Current = %d/1000 \n", (int)(g_Mppt_Para.Charg_Current * 1000));
+//// printf("Output_Voltage = %d/1000 \n", (int)(g_Mppt_Para.Output_Voltage * 1000));
+// printf("Discharg_Current = %d/1000 \n", (int)(g_Mppt_Para.Discharg_Current * 1000));
+//// printf("Input_Voltage = %d/1000 \n", (int)(g_Mppt_Para.Input_Voltage * 1000));
+//// printf("get_PV_VOLT_IN1 = %d/1000 \n", (int)(get_PV_VOLT_IN1() * 1000));
+//// printf("HighSideMos_Temperature = %d/1000 \n", (int)(g_Mppt_Para.HighSideMos_Temperature * 1000));
+// printf("\n");
+// printf("\n");
+// printf("\n");
+
+ g_adcData.num = 0;
+ g_adcData.total_CHG_CURR = 0;
+ g_adcData.total_PV_VOLT_OUT = 0;
+ g_adcData.total_DSG_CURR = 0;
+ g_adcData.total_PV1_VOLT_IN = 0;
+ g_adcData.total_PV_VOLT_IN1 = 0;
+ g_adcData.total_MOSFET_Temper = 0;
- if (g_Mppt_Para.Discharg_Current == 0 && g_Mppt_Para.Charg_Current == 0) {
- return;
- }
-// g_Mppt_Para.Battery_Voltage = g_Mppt_Para.Output_Voltage;
-
-// static float_t Volt = 0.7;
-// static float_t Curr = 5.5;
-// static float_t loopImpedance;
-// static uint8_t onlyone = 1;
-// if (onlyone) {
-// loopImpedance = (float_t)g_slConfigInfo.loopImpedance / 100;
-// }
-
-
- static float_t inBatteryCurr;
- static float_t outBatteryCurr;
- inBatteryCurr = g_Mppt_Para.Charg_Current - g_Mppt_Para.Discharg_Current;
- outBatteryCurr = g_Mppt_Para.Discharg_Current - g_Mppt_Para.Charg_Current;
- if (inBatteryCurr > 0.1) {
- g_Mppt_Para.Battery_Voltage = g_Mppt_Para.Output_Voltage - inBatteryCurr * g_impedance;
- } else {
- g_Mppt_Para.Battery_Voltage = g_Mppt_Para.Output_Voltage;
- }
-
- if (g_batteryState == 0 && (inBatteryCurr > 0.1 || outBatteryCurr > 0.1) && g_Mppt_Para.Output_Voltage < 14.2) {
-// printf("int g_batteryState : %d\n", g_batteryState);
- g_batteryState = 1;
-// TimeSliceOffset_Register(&m_impedanceCalculation, Task_impedanceCalculation
-// , impedanceCalculation_reloadVal, impedanceCalculation_reloadVal);
- }
-
-// mppt_constantVoltage(18);
-
-// if (g_Mppt_Para.MPPT_Mode == CONSTANTCURRENT
-// || g_Mppt_Para.MPPT_Mode == CONSTANTVOLTAGE) {
+//// mppt_readjust();
+//// Get_OutputPower();
//
-// g_Mppt_Para.Battery_Voltage = get_capturedata(get_PV_VOLT_OUT)
-// - g_impedance * (g_Mppt_Para.Charg_Current - g_Mppt_Para.Discharg_Current);
-// } else {
-// g_Mppt_Para.Battery_Voltage = get_capturedata(get_PV_VOLT_OUT);
-// }
-
-// voltOut = get_capturedata(get_PV_VOLT_OUT);
-// g_Mppt_Para.Battery_Voltage = voltOut - g_impedance * (g_Mppt_Para.Charg_Current - g_Mppt_Para.Discharg_Current);
-
-
-// ConstantVoltageCharge();
-// return;
-
- if (!overTemperature) {
- MpptMode();
- MpptContorl();
- }
-
-
-// mppt_constantVoltageO(12);
-
-// static uint32_t run_num = 0;
-// if (1000 < run_num++) {
-// FloatingCharge();
-// run_num = 1200;
-// printf("in floatcharge \n");
+//// mppt_constantVoltage(18);
+//
+//// findMiNDutyRatio();
+//// MpptContorl();
+//
+//// printf_data();
+//// void MpptContorl();
+//
+//// mppt_constantVoltageO(12);
+//
+//// FloatingCharge();
+//// mppt_readJust();
+//
+//// mppt_constantCurrentO(1);
+//
+//
+//// if (g_interruptNum < 5) {
+//// g_interruptNum++;
+//// return;
+//// }
+//// g_Mppt_Para.Charg_Current = get_capturedata(get_CHG_CURR);
+//// g_Mppt_Para.Discharg_Current = get_capturedata(get_DSG_CURR);
+//// g_Mppt_Para.Output_Voltage = get_capturedata(get_PV_VOLT_OUT);
+//// g_Mppt_Para.Battery_Voltage = g_Mppt_Para.Output_Voltage;
+// g_Mppt_Para.Charg_Current = get_CHG_CURR();
+// g_Mppt_Para.Discharg_Current = get_DSG_CURR();
+// g_Mppt_Para.Output_Voltage = get_PV_VOLT_OUT();
+// g_Mppt_Para.Input_Voltage = get_PV1_VOLT_IN();
+//
+//// mppt_constantVoltage(18);
+//// return;
+//
+//
+// if (g_Mppt_Para.Discharg_Current == 0 && g_Mppt_Para.Charg_Current == 0) {
// return;
// }
-// mppt_readJust();
-// mppt_constantCurrentO(1.2);
-
-
-// int16_t var = 0;
-// char buff[4];
-// for (var = 0; var < 100; ++var) {
-// sprintf(buff, "%3d:", var);
-// uart_dev_write(g_gw485_uart4_handle, buff, sizeof(buff));
-// uart_dev_write(g_gw485_uart4_handle, "1234567890\n", sizeof("1234567890\n"));
-// Delay_Ms(1);
+//// g_Mppt_Para.Battery_Voltage = g_Mppt_Para.Output_Voltage;
+//
+//// static float_t Volt = 0.7;
+//// static float_t Curr = 5.5;
+//// static float_t loopImpedance;
+//// static uint8_t onlyone = 1;
+//// if (onlyone) {
+//// loopImpedance = (float_t)g_slConfigInfo.loopImpedance / 100;
+//// }
+//
+//
+// static float_t inBatteryCurr;
+// static float_t outBatteryCurr;
+// inBatteryCurr = g_Mppt_Para.Charg_Current - g_Mppt_Para.Discharg_Current;
+// outBatteryCurr = g_Mppt_Para.Discharg_Current - g_Mppt_Para.Charg_Current;
+// if (inBatteryCurr > 0.1) {
+// g_Mppt_Para.Battery_Voltage = g_Mppt_Para.Output_Voltage - inBatteryCurr * g_impedance;
+// } else {
+// g_Mppt_Para.Battery_Voltage = g_Mppt_Para.Output_Voltage;
// }
-// uart_dev_write(g_gw485_uart4_handle, "\n\n\n\n\n\n", sizeof("\n\n\n\n\n\n"));
+//
+// if (g_batteryState == 0 && (inBatteryCurr > 0.1 || outBatteryCurr > 0.1) && g_Mppt_Para.Output_Voltage < 14.2) {
+//// printf("int g_batteryState : %d\n", g_batteryState);
+// g_batteryState = 1;
+//// TimeSliceOffset_Register(&m_impedanceCalculation, Task_impedanceCalculation
+//// , impedanceCalculation_reloadVal, impedanceCalculation_reloadVal);
+// }
+//
+//// mppt_constantVoltage(18);
+//
+//// if (g_Mppt_Para.MPPT_Mode == CONSTANTCURRENT
+//// || g_Mppt_Para.MPPT_Mode == CONSTANTVOLTAGE) {
+////
+//// g_Mppt_Para.Battery_Voltage = get_capturedata(get_PV_VOLT_OUT)
+//// - g_impedance * (g_Mppt_Para.Charg_Current - g_Mppt_Para.Discharg_Current);
+//// } else {
+//// g_Mppt_Para.Battery_Voltage = get_capturedata(get_PV_VOLT_OUT);
+//// }
+//
+//// voltOut = get_capturedata(get_PV_VOLT_OUT);
+//// g_Mppt_Para.Battery_Voltage = voltOut - g_impedance * (g_Mppt_Para.Charg_Current - g_Mppt_Para.Discharg_Current);
+//
+//
+//// ConstantVoltageCharge();
+//// return;
+//
+// if (!overTemperature) {
+// MpptMode();
+// MpptContorl();
+// }
+//
+//
+//// mppt_constantVoltageO(12);
+//
+//// static uint32_t run_num = 0;
+//// if (1000 < run_num++) {
+//// FloatingCharge();
+//// run_num = 1200;
+//// printf("in floatcharge \n");
+//// return;
+//// }
+//// mppt_readJust();
+//// mppt_constantCurrentO(1.2);
+//
+//
+//// int16_t var = 0;
+//// char buff[4];
+//// for (var = 0; var < 100; ++var) {
+//// sprintf(buff, "%3d:", var);
+//// uart_dev_write(g_gw485_uart4_handle, buff, sizeof(buff));
+//// uart_dev_write(g_gw485_uart4_handle, "1234567890\n", sizeof("1234567890\n"));
+//// Delay_Ms(1);
+//// }
+//// uart_dev_write(g_gw485_uart4_handle, "\n\n\n\n\n\n", sizeof("\n\n\n\n\n\n"));
}
diff --git a/App/src/task.c b/App/src/task.c
index 81074f3..50f7534 100644
--- a/App/src/task.c
+++ b/App/src/task.c
@@ -78,66 +78,66 @@ void Task_RunLED(void)
// printf(" \n");
// uart_sendstr(g_bat485_uart3_handle, " \n");
- uart_dev_write(g_bat485_uart3_handle, " \n", sizeof(" \n"));
-
- char buffer[80];
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " duty_ratio : %d/1000 \n", (int)(g_duty_ratio * 1000));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " Input_Voltage : %d/100 \n", (int)(g_Mppt_Para.Input_Voltage * 100));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " vout : %d/100 \n", (int)(g_Mppt_Para.Output_Voltage * 100));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " vBattery : %d/100 \n", (int)(g_Mppt_Para.Battery_Voltage * 100));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " Iout : %d/100 \n", (int)(g_Mppt_Para.Charg_Current * 100));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " Idisout : %d/100 \n", (int)(g_Mppt_Para.Discharg_Current * 100));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " mosT : %d/10 \n", (int)(g_Mppt_Para.HighSideMos_Temperature * 10));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " impedance : %d/1000 \n", (int)(g_impedance * 1000));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " g_impedanceStart : %d \n", g_impedanceStart);
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " mosState : %d \n", (int)(g_Mppt_Para.DischargMos_State));
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " batteryState : %d \n", g_batteryState);
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " outputAgainFlag : %d \n", outputAgainFlag);
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " excessiveLoadFlag : %d \n", excessiveLoadFlag);
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, " 0.没有工作; 1.涓流模式; 2.恒流模式; 3.恒压模式; 4.浮充模式; 5.没有电池 : %d \n", g_Mppt_Para.MPPT_Mode);
- uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
-
- uart_dev_write(g_bat485_uart3_handle, " \n", sizeof(" \n"));
+// uart_dev_write(g_bat485_uart3_handle, " \n", sizeof(" \n"));
+//
+// char buffer[80];
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " duty_ratio : %d/1000 \n", (int)(g_duty_ratio * 1000));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " Input_Voltage : %d/100 \n", (int)(g_Mppt_Para.Input_Voltage * 100));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " vout : %d/100 \n", (int)(g_Mppt_Para.Output_Voltage * 100));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " vBattery : %d/100 \n", (int)(g_Mppt_Para.Battery_Voltage * 100));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " Iout : %d/100 \n", (int)(g_Mppt_Para.Charg_Current * 100));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " Idisout : %d/100 \n", (int)(g_Mppt_Para.Discharg_Current * 100));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " mosT : %d/10 \n", (int)(g_Mppt_Para.HighSideMos_Temperature * 10));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " impedance : %d/1000 \n", (int)(g_impedance * 1000));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " g_impedanceStart : %d \n", g_impedanceStart);
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " mosState : %d \n", (int)(g_Mppt_Para.DischargMos_State));
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " batteryState : %d \n", g_batteryState);
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " outputAgainFlag : %d \n", outputAgainFlag);
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " excessiveLoadFlag : %d \n", excessiveLoadFlag);
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// memset(buffer, 0, sizeof(buffer));
+// sprintf(buffer, " 0.没有工作; 1.涓流模式; 2.恒流模式; 3.恒压模式; 4.浮充模式; 5.没有电池 : %d \n", g_Mppt_Para.MPPT_Mode);
+// uart_dev_write(g_bat485_uart3_handle, buffer, sizeof(buffer));
+//
+// uart_dev_write(g_bat485_uart3_handle, " \n", sizeof(" \n"));
@@ -145,6 +145,20 @@ void Task_RunLED(void)
// get_CHG_CURR();
+// printf("\n");
+// printf("\n");
+// printf("\n");
+//// printf("num = %d \n", g_adcData.num);
+//// printf("Charg_Current = %d/1000 \n", (int)(g_Mppt_Para.Charg_Current * 1000));
+//// printf("Output_Voltage = %d/1000 \n", (int)(g_Mppt_Para.Output_Voltage * 1000));
+// printf("Discharg_Current = %d/1000 \n", (int)(g_Mppt_Para.Discharg_Current * 1000));
+//// printf("Input_Voltage = %d/1000 \n", (int)(g_Mppt_Para.Input_Voltage * 1000));
+//// printf("get_PV_VOLT_IN1 = %d/1000 \n", (int)(get_PV_VOLT_IN1() * 1000));
+//// printf("HighSideMos_Temperature = %d/1000 \n", (int)(g_Mppt_Para.HighSideMos_Temperature * 1000));
+// printf("\n");
+// printf("\n");
+// printf("\n");
+
static uint8_t flag = RESET;
flag = !flag;
GPIO_WriteBit(RUN_LED_GPIO, RUN_LED_PIN, flag);
@@ -318,10 +332,10 @@ void Task_refreshRegister(void)
// g_Mppt_Para.Discharg_Current = get_capturedata(get_DSG_CURR);
// g_Mppt_Para.HighSideMos_Temperature = get_capturedata(get_MOSFET_Temper);
// g_Mppt_Para.Battery_Voltage = get_PV_VOLT_OUT();
- g_Mppt_Para.Output_Voltage = get_PV_VOLT_OUT();
- g_Mppt_Para.Charg_Current = get_CHG_CURR();
- g_Mppt_Para.Discharg_Current = get_DSG_CURR();
- g_Mppt_Para.HighSideMos_Temperature = get_MOSFET_Temper();
+// g_Mppt_Para.Output_Voltage = get_PV_VOLT_OUT();
+// g_Mppt_Para.Charg_Current = get_CHG_CURR();
+// g_Mppt_Para.Discharg_Current = get_DSG_CURR();
+// g_Mppt_Para.HighSideMos_Temperature = get_MOSFET_Temper();
g_Mppt_Para.DischargMos_State = GPIO_ReadOutputDataBit(POW_OUT_CON_GPIO, POW_OUT_CON_PIN)
&& GPIO_ReadInputDataBit(DSG_PROT_GPIO, DSG_PROT_PIN);
@@ -785,18 +799,20 @@ void task_Init(void)
TimeSliceOffset_Register(&m_runled, Task_RunLED, runled_reloadVal, runled_offset);
- TimeSliceOffset_Register(&m_usart, Task_usart, usart_reloadVal, usart_offset);
+// TimeSliceOffset_Register(&m_usart, Task_usart, usart_reloadVal, usart_offset);
TimeSliceOffset_Register(&m_wdi, Task_wdi, wdi_reloadVal, wdi_offset);
// TimeSliceOffset_Register(&m_impedanceCalculation, Task_impedanceCalculation
// , impedanceCalculation_reloadVal, impedanceCalculation_reloadVal);
+//
+// TimeSliceOffset_Register(&m_refreshRegister, Task_refreshRegister
+// , refreshRegister_reloadVal, refreshRegister_reloadVal);
+//
+// TimeSliceOffset_Register(&m_startMpptControl, Task_startMpptControl
+// , startMpptControl_reloadVal, startMpptControl_offset);
- TimeSliceOffset_Register(&m_refreshRegister, Task_refreshRegister
- , refreshRegister_reloadVal, refreshRegister_reloadVal);
-
- TimeSliceOffset_Register(&m_startMpptControl, Task_startMpptControl
- , startMpptControl_reloadVal, startMpptControl_offset);
+ ADC_TIM_DMA_Init();
TimeSliceOffset_Start(); /* 启动时间片轮询 */
}
@@ -820,13 +836,17 @@ void hardware_Init(void)
POW_OUT_CON_Init();
DSG_PROT_Init();
WORK_VOLT_INT_Init();
+// ADC_TIM_DMA_Init();
// EnPowerSupply_Init();
// Set_duty_ratio(&g_duty_ratio);
// uart_dev_write(g_bat485_uart3_handle, " hello world \n", sizeof(" hello world \n"));
- TIM3_Init(10);
+// TIM3_Init(10);
// TIM_Cmd(TIM3, ENABLE); //TIM3使能
+
+ g_duty_ratio = 0.8;
+ Set_duty_ratio(&g_duty_ratio);
}
diff --git a/Hardware/inc/adc.h b/Hardware/inc/adc.h
index 293dfbe..79e5d6d 100644
--- a/Hardware/inc/adc.h
+++ b/Hardware/inc/adc.h
@@ -3,8 +3,34 @@
#include "ch32l103.h"
+//typedef struct _ADC_DATA {
+// uint16_t total_CHG_CURR; /* 一个控制周期中,adc采集的值之和 充电电流 */
+// uint16_t num_CHG_CURR; /* 一个控制周期中,adc采集次数之和 */
+// uint16_t total_PV_VOLT_OUT; /* 输出电压 */
+// uint16_t num_PV_VOLT_OUT;
+// uint16_t total_DSG_CURR; /* 放电电流 */
+// uint16_t num_DSG_CURR;
+// uint16_t total_PV1_VOLT_IN; /* 系统输入电压 */
+// uint16_t num_PV1_VOLT_IN;
+// uint16_t total_PV_VOLT_IN1; /* 太阳能板输出电压 */
+// uint16_t num_PV_VOLT_IN1;
+// uint16_t total_MOSFET_Temper; /* mos管温度 */
+// uint16_t num_MOSFET_Temper;
+//}ADC_DATA;
+typedef struct _ADC_DATA {
+ uint16_t num; /* 一个控制周期中,adc采集次数之和 */
+ uint16_t total_CHG_CURR; /* 一个控制周期中,adc采集的值之和 充电电流 */
+ uint16_t total_PV_VOLT_OUT; /* 输出电压 */
+ uint16_t total_DSG_CURR; /* 放电电流 */
+ uint16_t total_PV1_VOLT_IN; /* 太阳能板输出电压 */
+ uint16_t total_PV_VOLT_IN1; /* 系统输入电压 */
+ uint16_t total_MOSFET_Temper; /* mos管温度 */
+}ADC_DATA;
+
+extern ADC_DATA g_adcData;
extern int16_t Calibrattion_Val;
void ADC_all_Init(void);
+void ADC_TIM_DMA_Init(void);
#endif
diff --git a/Hardware/inc/gpio.h b/Hardware/inc/gpio.h
index cec15ae..60ece20 100644
--- a/Hardware/inc/gpio.h
+++ b/Hardware/inc/gpio.h
@@ -20,7 +20,8 @@
void G_FFMOS_CON_Init(void);
/* 运行指示灯 */
-/* RUN_LED --> PA8 */
+///* RUN_LED --> PA8 */
+/* RUN_LED --> PB7 */
#define RUN_LED_GPIO GPIOA
#define RUN_LED_PIN GPIO_Pin_8
void RUN_LED_Init(void);
diff --git a/Hardware/inc/pwm.h b/Hardware/inc/pwm.h
index d8d409f..822ee53 100644
--- a/Hardware/inc/pwm.h
+++ b/Hardware/inc/pwm.h
@@ -15,7 +15,10 @@
#define Prescaler 0
/* 输出频率为240k */
//#define Period 200 - 1
+/* 输出频率为100k */
#define Period 480 - 1
+/* 输出频率为10k */
+//#define Period 4800 - 1
void PWM_TIM_Configuration(void);
void Set_duty_ratio(float *duty_ratio);
diff --git a/Hardware/src/adc.c b/Hardware/src/adc.c
index 47fae23..3f91607 100644
--- a/Hardware/src/adc.c
+++ b/Hardware/src/adc.c
@@ -1,7 +1,8 @@
#include
-
+#include
int16_t Calibrattion_Val = 0;
+ADC_DATA g_adcData;
//ADC对应GPIO初始化配置以及ADC初始化配置
void ADC_all_Init(void)
@@ -43,3 +44,237 @@ void ADC_all_Init(void)
ADC_Sample_ModeConfig(ADC1,ADC_Sample_Over_1M_Mode);
}
+
+
+
+
+
+void DMA1_Channel1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+
+
+
+/*
+ * 初始化ADC的DMA
+ *
+ *
+ */
+void DMA_Tx_Init(u32 memadr, u16 bufsize)
+{
+ DMA_InitTypeDef DMA_InitStructure = {0};
+ NVIC_InitTypeDef NVIC_InitStructure = {0};
+
+ RCC_HBPeriphClockCmd(RCC_HBPeriph_DMA1, ENABLE);
+
+ DMA_DeInit(DMA1_Channel1);
+ DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->RDATAR; //ADC1地址
+ DMA_InitStructure.DMA_MemoryBaseAddr = memadr; //内存地址
+ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //方向(从外设到内存)
+ DMA_InitStructure.DMA_BufferSize = bufsize; //传输内容的大小
+ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定
+ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增
+ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据单位
+ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存数据单位
+ DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA模式:循环传输
+ DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //优先级:高
+ DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止内存到内存的传输
+ DMA_Init(DMA1_Channel1, &DMA_InitStructure);
+
+ DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); //使能传输完成中断
+
+ //初始化TIM NVIC,设置中断优先级分组
+ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; //
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //设置抢占优先级0
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //设置响应优先级3
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道中断
+ NVIC_Init(&NVIC_InitStructure); //初始化NVIC
+
+ DMA_Cmd(DMA1_Channel1,ENABLE);
+
+}
+
+void TIM1_Init1(u16 arr,u16 psc)
+{
+// /* 初始化PA8为模拟通道输入引脚 */
+// GPIO_InitTypeDef GPIO_InitStructure={0};
+// RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOA, ENABLE);
+//// RCC_APB2PeriphClockCmd(RCC_PB2Periph_AFIO, ENABLE); //打开管脚复用AFIO时钟
+//// GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);
+// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
+// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
+// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+// GPIO_Init( GPIOA, &GPIO_InitStructure );
+
+ TIM_OCInitTypeDef TIM_OCInitStructure={0};
+ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};
+
+ RCC_PB2PeriphClockCmd(RCC_PB2Periph_TIM1, ENABLE);
+
+// TIM_TimeBaseInitStructure.TIM_Period = 30000 - 1;
+// TIM_TimeBaseInitStructure.TIM_Prescaler = 48000 - 1;
+ TIM_TimeBaseInitStructure.TIM_Period = arr - 1;
+ TIM_TimeBaseInitStructure.TIM_Prescaler = psc - 1;
+ TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
+ TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
+ TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
+
+ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
+ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
+ TIM_OCInitStructure.TIM_Pulse = 10;
+ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
+ TIM_OC1Init(TIM1, &TIM_OCInitStructure);
+
+ TIM_CtrlPWMOutputs(TIM1, ENABLE);
+ TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
+ TIM_ARRPreloadConfig(TIM1, ENABLE);
+ TIM_Cmd(TIM1, ENABLE);
+}
+
+
+
+/*
+ * 通过定时器和DMA完成adc的采集
+ * 定时器采用定时器1的cc1完成ADC的外部触发 PA8 --> TIM1_CH1
+ * ADC通过DMA的通道1完成数据的传输
+ *
+ * */
+volatile uint16_t ADC_ConvertedValue[6]; //ADC采样的数据
+void ADC_TIM_DMA_Init(void)
+{
+ ADC_InitTypeDef ADC_InitStructure = {0};
+ GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+ RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOA, ENABLE);
+ RCC_PB2PeriphClockCmd(RCC_PB2Periph_ADC1, ENABLE);
+ RCC_ADCCLKConfig(RCC_PCLK2_Div2);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; //PA1~7对应ADC通道1~7
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+ ADC_DeInit(ADC1);
+ Calibrattion_Val=Get_CalibrationValue(ADC1);
+ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
+ ADC_InitStructure.ADC_ScanConvMode = ENABLE;
+// ADC_InitStructure.ADC_ScanConvMode = DISABLE;
+ ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
+ ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
+ ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
+// ADC_InitStructure.ADC_NbrOfChannel = 1;
+ ADC_InitStructure.ADC_NbrOfChannel = 6;
+ ADC_Init(ADC1, &ADC_InitStructure);
+
+ //使能ADC、DMA
+ ADC_DMACmd(ADC1,ENABLE);
+ ADC_Cmd(ADC1, ENABLE);
+
+// ADC_InjectedSequencerLengthConfig(ADC1, 1);
+// ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_CyclesMode5);
+// ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);
+
+ ADC_FIFO_Cmd(ADC1, ENABLE);
+ ADC_BufferCmd(ADC1, DISABLE); //disable buffer
+ ADC_ResetCalibration(ADC1);
+ while(ADC_GetResetCalibrationStatus(ADC1));
+ ADC_StartCalibration(ADC1);
+ while(ADC_GetCalibrationStatus(ADC1));
+
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_CyclesMode5);
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_CyclesMode5);
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_CyclesMode5);
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_CyclesMode5);
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_CyclesMode5);
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 6, ADC_SampleTime_CyclesMode5);
+
+// /* 设置定时器输出的周期为1S */
+// TIM1_Init1(1000, 48000);
+ /* 设置定时器输出的周期为30mS */
+ TIM1_Init1(30, 48000);
+ /* 设置定时器输出的周期为30uS */
+// TIM1_Init1(30, 48);
+ DMA_Tx_Init((u32)&ADC_ConvertedValue, 6);
+
+
+
+// ADC_DeInit(ADC1);
+// Calibrattion_Val = Get_CalibrationValue(ADC1);
+// printf("Calibrattion_Val : %d\n", Calibrattion_Val);
+// ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
+// ADC_InitStructure.ADC_ScanConvMode = DISABLE;
+// ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
+// ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
+// ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
+// ADC_InitStructure.ADC_NbrOfChannel = 1;
+// ADC_Init(ADC1, &ADC_InitStructure);
+//
+// ADC_Cmd(ADC1, ENABLE);
+//
+// ADC_FIFO_Cmd(ADC1, ENABLE);
+// ADC_BufferCmd(ADC1, DISABLE); //disable buffer
+//
+// ADC_ResetCalibration(ADC1);
+// while(ADC_GetResetCalibrationStatus(ADC1));
+// ADC_StartCalibration(ADC1);
+// while(ADC_GetCalibrationStatus(ADC1));
+//
+// RCC_ADCCLKConfig(RCC_HCLK_ADC);
+// ADC_DutyDelayCmd(ADC1,ENABLE);
+// ADC_Sample_ModeConfig(ADC1,ADC_Sample_Over_1M_Mode);
+
+}
+
+/**
+ * @brief 将采集的adc进行校准
+ * @param val 采集的adc数据
+ * @retval 校准后的adc数据
+ */
+uint16_t Get_ConversionVal1(int16_t val)
+{
+ if((val + Calibrattion_Val) < 0 || val == 0)
+ return 0;
+ if((Calibrattion_Val + val) > 4095 || val == 4095)
+ return 4095;
+ return (val + Calibrattion_Val);
+}
+
+void DMA1_Channel1_IRQHandler(void)
+{
+// printf("\r\nEnter DMA interrupt\r\n");
+ if(DMA_GetITStatus(DMA1_IT_TC1)!=RESET)
+ {
+ DMA_ClearITPendingBit(DMA1_IT_TC1);
+ //中断处理代码
+// g_adcData.num++;
+// g_adcData.total_CHG_CURR += Get_ConversionVal1(ADC_ConvertedValue[0]);
+// g_adcData.total_PV_VOLT_OUT += Get_ConversionVal1(ADC_ConvertedValue[1]);
+// g_adcData.total_DSG_CURR += Get_ConversionVal1(ADC_ConvertedValue[2]);
+// g_adcData.total_PV1_VOLT_IN += Get_ConversionVal1(ADC_ConvertedValue[3]);
+// g_adcData.total_PV_VOLT_IN1 += Get_ConversionVal1(ADC_ConvertedValue[4]);
+// g_adcData.total_MOSFET_Temper += Get_ConversionVal1(ADC_ConvertedValue[5]);
+
+// g_adcData.num++;
+
+// g_adcData.total_CHG_CURR += Get_ConversionVal1(ADC_ConvertedValue[0]);
+ printf("%d\n", ADC_ConvertedValue[2]);
+
+// g_adcData.total_PV_VOLT_OUT += Get_ConversionVal1(ADC_ConvertedValue[1]);
+// g_adcData.total_DSG_CURR += Get_ConversionVal1(ADC_ConvertedValue[2]);
+// g_adcData.total_PV1_VOLT_IN += Get_ConversionVal1(ADC_ConvertedValue[3]);
+// g_adcData.total_PV_VOLT_IN1 += Get_ConversionVal1(ADC_ConvertedValue[4]);
+// g_adcData.total_MOSFET_Temper += Get_ConversionVal1(ADC_ConvertedValue[5]);
+
+// printf("\r\n The current ADCH1 value = %d \r\n", ADC_ConvertedValue[0]);
+// printf("\r\n The current ADCH2 value = %d \r\n", ADC_ConvertedValue[1]);
+// printf("\r\n The current ADCH3 value = %d \r\n", ADC_ConvertedValue[2]);
+// printf("\r\n The current ADCH4 value = %d \r\n", ADC_ConvertedValue[3]);
+// printf("\r\n The current ADCH5 value = %d \r\n", ADC_ConvertedValue[4]);
+// printf("\r\n The current ADCH5 value = %d \r\n", ADC_ConvertedValue[5]);
+// ADC_ConvertedValue[0] = 0;
+// ADC_ConvertedValue[1] = 0;
+// ADC_ConvertedValue[2] = 0;
+// ADC_ConvertedValue[3] = 0;
+// ADC_ConvertedValue[4] = 0;
+// ADC_ConvertedValue[5] = 0;
+ }
+}
+
+
diff --git a/Hardware/src/gpio.c b/Hardware/src/gpio.c
index d8c446a..993a145 100644
--- a/Hardware/src/gpio.c
+++ b/Hardware/src/gpio.c
@@ -30,6 +30,7 @@ void G_FFMOS_CON_Init(void)
void RUN_LED_Init(void)
{
RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOA, ENABLE);
+ RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = RUN_LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
diff --git a/Hardware/src/tim.c b/Hardware/src/tim.c
index 68cd54d..0df6e20 100644
--- a/Hardware/src/tim.c
+++ b/Hardware/src/tim.c
@@ -23,7 +23,7 @@ void TIM3_Init(uint16_t delay_ms)
/* 分频系数 */
uint16_t psc = (SystemCoreClock / 10000) - 1;
/* 周期数 */
- uint16_t arr = delay_ms * 1 - 1;
+ uint16_t arr = delay_ms * 10 - 1;
TIM3_Int_Init(arr, psc);
}
@@ -135,7 +135,7 @@ void SysTick_Handler(void)
void TIM1_Init(uint16_t delay_ms)
{
/* 分频系数 */
- uint16_t psc = (SystemCoreClock / 10000) - 1;
+ uint16_t psc = (SystemCoreClock / 10) - 1;
/* */
uint16_t arr = delay_ms * 10 - 1;
// uint16_t arr = 10 - 1;
diff --git a/obj/App/src/collect_Conversion.o b/obj/App/src/collect_Conversion.o
index 1626abaf8afb85f9601ecf1ce69356803216bc5e..99349d9bf9b3bbdf631aa295fc0778d3fca0737e 100644
GIT binary patch
literal 40100
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
I*2naJ09Lm3`2YX_
literal 42908
zcmeHw349#I`DOK7IxUYR8g)zRHE-J|0duUO)Fp0dePe^mifs^K!Fd95~>s_Im&x;;m!@C7;Q#HG_NXkL}0
z@*a=2o*R4b)7!qVL?9IFG^hK&P
z&+|$nk$Jy7rTmm{E{QI=0KQ*8L8(&~m!D$s=??CHF3=Z5=VxrbcKPX%S0`Td(QZpm
zTv~T|>G`A7h}=_h>d(*3Js0@8^S7^C@@e?#C7(8Ly;W6=z50`ii*NhnXF2z6fA!JV
z|9lu(I`yF1B^CTef@qRXNIXyVdcyI!A54dTAza
zXPULoE-CL{R?@J4SxLqJvXXZDmz6XoQxbdk+^^;+Z|S+Q`0#TonwuYt?0t&u-<|dS
z&NORp$3ryd^qg16KJ!s&RH?t+ZpYz-OsUqMzP`wDsNOk#vCRL-JlU3+?JN5Uuhsll
zOX`j8bGxavb?m$erNc`@rSF#fq2!s8hfD4(xvu2mlCPBO#orzN
z!tkFBzh?MZ!~2FGJbb_5lZWRGf2-&>MYk1QTy$JfQ_+&5J&Fp8-Wm4fu-k@RIP5FK
z4jVRaSoyH%u-6NJQFwjfnT6ej2Nu>8?pFAI!E*(76b>5C9=!nUhnIQ;_r5*bA`-V&9LQA3HwQ7F!dW6Z2#7*vHX7M1LK<
zJNmuoxzXdJM?^P77e}k3yGIM7A4T4X{72-0$PXh|M0P}uk90>;k(H6Tk-Z|jN8%AL
z@|W|O6&3<@
z7|ch1&mXA2MZc7)nqO1%YPxnW|2s=y{ixAnrWxu@-erAZOsEwk!uQH!$$D6rPNhEn^FN(
zK>M&N%#D0EZz=dNP!+i)QxwrGHc~fpICmT!+bj1W
z>n)ZnC06m&5h_-#Jx6pgvFZXAlWWKbl0rkqk;LPv0Trt$cpSTrKtwvR&2PlpOL*y;
zE2Ybu9GjWDDP$@fo1GWbKDM_eroeqPF$K=i#1y!%CUGf!t|lXd?5D|SA@ejDFJ!(Z
zWvUoeRk>d5OSxBN>ac%4u|zPoB9G*R657R9>J}(Z*nyg1T;`|HrdwgA+qJtm-QmT)
zoclq>>0u?r#%U_XR+@%2=6!-3)3BzAjKygP82#lJp?ml;j-!zgAf-BPxv~D-eZizX
zTZ@Se*(UDcex-E8V?x~m_@zfR-yRAeU$5TBjcDrG4#5lZyRPyRHI3HGie6IST~!d_tEqNA`KLcmVs%6Y^B?X&?*ZsSY@JMmty}InV2T
zRtR|^|6a6bwUFPIT!~;b2>D&%TJ+xrA+Hs2Ds2?Aj`FEB3YrZ1)*F$
zlY}h{<-UgHYlN^R;tuQ2q)P~jwa
zeK91tr-tHJp~0^hdRi!d26F!t!qEK$1(-E_Bylvt@vD0xfnA)Q(A4xq6j{+o9Pc9@
zLv=XL97{^J&-SJb_u}viY_RuX5b_T|4#$pFBKZj
z@R;GSDKz~&Ff#xeLu3CFb>1MBO`(yTG;P9~g>4bmB5XidIuzf4@=g%e8j81pohEFv
zly|wXHrek=VeP_h5O%n*9|=1`*xkZ9ggqdvQ>M^kDxX7$Me87q5zfLj&k;Ug`6xB+
zomfvO=Q0T5s6RB0#IUWQ(Kmt(sC+J@gxbvnmCs0XG8jJoo!CL4Fz4+AWT;qIsDM2s
zWLv0!B}&=v+MPzri9<9(Wg@4p9-J5@pF)U6cs!oSIb;WNC2%w{67TsONBaWk(nD%@
zU1m;r6qhC;x#0=df$&(Naz>ZV$3}2jX+s829l(7b!9f;hLdm}Z3ydA)g0=9?o@UVrHs5asZcw^b84`sHoYM2(Wv?g*`&-;oda?Hs)MiV*a5vI7FJ{;US2+6Q02jpK&9E6c9TA<(m`5X=sD&qmVk-)innLM#w`Vjq!=doZ
zP(>N6bP2;uF*|2fI
zQSD5W$wL%>h%$AEGGmC6bd>zBpdOP7O+DUGBa4BhxVAWTsX(Q!(wSZkgJhF;$)zxu
zx?XwT@Ct0k9?bQ2ctwmm)3gh5&0!NRTZZjb}1uvRm!McmBPd1UU(_*
z-KvcL@jZOl@}8WNk)ymd?8<
z%k(r1{MnM@(>qfY#_P8-)vh`mEN-Vx)e&GNmPrsV32b}&J5heA&EK2uyl)q=l+f7?
z`^a?-MaY+r-g7c4$~1>>`&Jn?m+Us|QjZrVVrT&GhlaM}eWRD0;eFYwQ`+Wd$Y15!
zcuC3lCB(Kt8P$^UJj7!%8A^XJ#Q-Dez;F=g29hL6&|shS2;#%v0D_iz=6%z
zn^74LXbUTe1HKM}ZW_xNGf05Tv6*U_UB;Q_7&_iW!%(c#fkT{Cu_i2N_gY8aZw$j)
zR;TMUDdNp7V8nxVl~0B7c+{rC?4^52_L>|)m@+$pA7{EM-M`!_Kd2eHl2R@NghU7
z63v_OwUay*8h!Qx6qqRR){SDD_sW!v`VT3&%9O0z#)6V=-6>Q%B^R*dngrS|VWPV-
z-G#MLiL4pPb*@{?=$+T$0%`qB?3)>4EOOT15+qc{c(z**jrSf@VYGZ7R(K6sk5K6f
z&tWLA(A1iU&9xC@c=iKP625r}#op~Ivdy!T9os$C(dzx0_ou%*J;G1C$Gt!0-6@!+
zOp$pL4d!Ru6W^bHndrg0rw$2-ppcq5#4M&R#Tk5%vboK1+&R$ZhE!F?v!@QTvIDIY
zQuP^2t9`C^VuXMGcGmrKW&D?7S^LkGf!Y80+fnmRm7%}q_}pWn`kyKTefM8zM{-CR
z&LE1Yzj}xK*A3h;7g9reBdY3-Q{yv!qpIGecIlA)$=|s8isfM)jd9S@Dho==5N`u
zS8q?VYT0|^mfnGlJ%?}X?C$UCY2TXeN%i*ix3qU}?Cb9CXl`q4@7mbY-rGE5YgxLp
zDc#bNZYkT`+^n^&GrGFF(lfNavAwIgqrWA+v9qzct-UM#zrl0wQN91X*N*n4jXSOP
ztVDI9%GO>jl6V}jdUeCb&Fy^~*Y&1*hKQ@vJ?&fC(mjnG+;2$sqI6UL<{|2`#-5gK
zjXi0-%NHK@A;qDCcUrlH-92fgn!7tX(#?ITh234~@!t0Cu0*rK&`7nUTO0d3`ci#I
zZAteg+Bj1>x|@#x!sh`Q6}Yz#L!lKqW>HT%-PLDIpySA?UEabZ4r$t){voSyclO
z=XMUmr(7+J6*6*^YHVo+z^LtP>}vzUbqbuJ-vswJ_Vl58Tfy*gl=YI5z2K=C4NGyP
z(gNo#D(b1Ip6KDbJTDpzdvNGQhsDD5>_y{N2p_L`j?t&!n?TRtXe=C(%B^5Di!BtruQ7i07fqa4g&)B1w2p
zVvTgQG}5gIv}mq6(ew4|J(jnN@a2V?yDhb-9c|rpL4{^~#Hdi)dh+M@{WeP09DdVX1fc
zSiK!?40h2|&kyM-y?gj3>G4c>5U{885DVu@^~6MG%+`)PFPuj^yatVs
zcXv_l`9sTnOUf;@<@SBfa)<4#+_OWOS!2eewD&`ap4;B9>)tWL0AWAsbC#3Xk5xNV%Jha@azsPbQ98#{d_ram%{^W}+_tjmL`@Ny%{x@B2)K1nSI~(v>sg5{8
zFBX~3!C)69Gbiz#ueP;wE@OeUrbOpV({tzujiVaN9tB|;PZ;23I@6W{GN=d73}=rV
z>A}CtJhQt+;pjA(@3MgWb0a6!(%YSCYwT+2NUKzPZ>o8qQT4WU_w<$VwvJS)cggY<
zi&d(%tFdQuuS)g6vUV2qRvueAQv=;w(p@T*?o9V=PIomQrPeH(-!Oj-4EnMEtW=*m
zXwkBUHEMIZFSTgx($vCrYmnL4mmX;Et5Q9^wX^C{-Ti&3rvBDemD<+a)7RbEgmWlZ
zkoIccYlJmx4_uQ}e6PlFwQF;ke(Ue*ZQtC56Dz5(so0k8-u3~taM|+J%NHqpDc;)K
zeso$jtWB-QM}w&p4$F-lX;iNvHGk1URC0x>CW%Zf)hJxud%`txWZBHrS(5O^s0W4sG4|Mjru2
zySuwm3`k01+}z!LM0;A%{nB(_aFT(V_jBLg&D<{671t5a4R7seLwh7BuCKalR
zGYafv!qU67y+z?BgMO6SlkVlo$`NYu%J~b>$w5fzko~6{)6(7Fgu$U(i}RXAY3$m(
zwNJZ1JA2c8y41$jzH|?Q+T7pK*oRZ1`7O;17<&-?XhODp)e`g|kF=U<#CvsW;W9hK7<3Hi&Mo~ovDwmxNFx&I
z9&8u1Z)W?}&Ocyv11cliYKEh+Md6HV3taZGQ@1s@HL11wER5%U3wbK1-C)4#5TFeb
zv_X|mwYDQ%>vi{}S{nNrRjRAKyQx<#UAeAo;q2LE`kc9JMrUJBbKAZ>TWhM@an?Vu
zjY?DdzU>`bYN~;II~zMXW^n%*9qpa%efyTpqT0AMJp&!rhYFR=*jzSaRd3l0v~1ta
zUHx!9qqQ^L+uOJ~Jp*;y+}E~m6(kvdGdTXhTKl`28PORSu-sz*R$Yq2ySisIcXxJn
zBZ8dpsjl=upIVN2r+a#EkQ+NVc`>JZ;jS~SNpOj@*G|us&Crt=>yfo4y&2=CXCYRi
zu5<^+d~5q=m0GcC;r=Pi!>;r;wQBWzGuxyeIx%+D!iE*-LcUj{_cIF&$LiYd);?Y_
ztnI_8FDKE$PK^9*J?&gsIAM=Ub3S%4%-zjqOeNvPP9LrSGSX^QXLoM{Mn<{^o`+m4
zbT=K&Dh~9uDtw{PFCoxH=m^SUr+WLFy0@S%XjZDXr5&@f9iwP-V`pb$iai9Rwqamm
z9B)o--o}NIC+)R%ac=GCZp03)xLoLH@9oo3GvU(nj7uihoNdj{61o}dO`mmDV_jv2
zt1L-+aHiT)m>pf+D1q^%Cmp1g#-kKgA?I30FQ9t0!K6v)!vlksly!6Y%1mttf@z-O
z#U9>T)S~5U^?G9#VK`~-NH=!jW~UTtwk6%%-rAmSu}gG&S1T&j**LJRg~uOWEMXF+
z)9B1pGp@Q>Q5g{_9etgNdCJ;vW9?I|I2N!y(mrW(Q^yhdfPm2Bu#gD|7Y12S^wKA*
zY0xrzObZ5yUSsw2!1{uv?ub-JBRZ$Ey#)u<`8aT3E-q>Bz|zRoN?#YMwGH!eu)(!g
ziym#&LEuvBR^YIPQIYP$luWb6sE%2>Ge@D#9oN&1pM&I9gL&MeGr3
z364CNWqtizjO|e))umSjDIPj{qrJBUp^<*gEEN)BHwLimIrLI>W
z{%hc{m;Tuydg+(x#_m>27cShpZ0f-3#^xi+xa6)`zINe^^<|6g=P$^gURF~*qp7`b
z4_S+G`;bzfB6-R?#v2yW98xAt%^(5G&W)ZEIUT28CwfI?3yP{j=NGBfPyXf?58qcR
zHxW7Z%U}}^HQk4Au;jj(|KoX^@==)reE2^ox%C{B0fNsqGAW||{Aq>&ga_r4%jbjE
zCd|)1oD{}q9wQx&?*#rSZoW`}C)pn#YnUXQeJV*fzMUMz_1&vlk^F2P#7FY=ooSB!
zMC;C!UzWx7Jt>ZTHlLPdpKy2v0)%lV)HoyDgl!0XaQt@8gZN1P7tMosi~nrS@h(a7
zgE|Wj;`#Y_5HGRUU+e1vJ|ACTt7GD~=rj1rto&>qd`l(eXTCf#{#&y4Z~F}1m6g9G
zi}z&lqqF#NS^T6de(Habe=W;Co1c}He@+&^FpFROzsN7m+W+#;;NQv0zdDO^E=iL9
zbGgmoHjEEdgRx6x=RBBSlK(~XV0{w*pT&duCHB>eGo6in8Lha~{M;^1o;v#7F#p77yYj
z_CdUa2k{af#7lS(FX2JFhVsGjif6@Z=RAmy!UHEFQ#5?1Oj-58@>}h?npn
zUc!TT4dsL5Rgx92o%0|*lK(~XAU@(hn+Nfc{PCGa2rv5#?q}s^^WgkQ{B6jx-}D*0
zEh|5pcVy)U=Q~nfUsirL-|FONAV3%o+6_Mb?3@SvCHY@85Bf{|e-;n=Q|zlVjS?P=
zcj3W!7aojv;lX$x$}_HYyaq=L&*i(>h-Yvm#Eh`Qjet%H%QHI}C7iih5h<+3%MHgF
zi(sTu3d?gKncT1nuB;?~_e`GfvMfF+iwPs74YoygY4s9_WCaCmplFk`tj`$4)O_Gz
z{KeE_@N=B}F9Eyf`>Vi%`5aRX;O_O#!I^ytMg}+5X?>Kw!zh?n)6}Db_;mFgczMW*3H1u#wa)&pgP-K&zYX5(;Z3K6
z`Wv
zy#wIKI{r@p$6XQ`f2V=p<@nnH{)odb1b@)+cR6^mlYb5P8BTj{0{^qq{yV@II{Ej4
zU+wJwF!(c${S)ASa_pZ4=QGTbFdo1c;br+7z&o7wzXRUyEtg1|BAy`gZH}q55C>W-vr+8w66{PBd2~_z;AHkHvoR4tUnfZyTN{{!%&9RD8jUUqms_;QDrf-iIS9}j$_
z)7~lI$2sv#fbZ_u&jh~6v7ZON(W&2Z@JpTiHQ-M;{tg8n>*Tk9&%w*aqZ9Z%r@mXk
z`<(te9(=kJ|I@&~?Bt&feuj02NL~z{d6W?RyWqJ_eQy9?>eTO6@K5ow_4x_#VNQJ?
z0_QQ<=05@cl2iV3;I}yS{~h=YhyM}$0H^-%f{$_b{|ER_obqC*Tdz~!;ouR+el&O)
z#(=HQB-%UWO#^2eY(CFb9&q>^@DCk-i@|ZDU&ekVc$brZ5cq?R|4rcEbn@H5pL6ni
zz#FYQ#Q!VcF{k|}gWurf^VrUFDoF`-KKRW}JT3#D=G6ZhaQPJ)?vYS8gWurP=f~hb
za`^q=6Y-LiP>%txwiNq64ZeqC|6A~Do$_7>-^Z!{JK#J=lax>&g8$Z1_~YFEmgBDg
z{0b*NBfuYZ_yq7jIR1U`;QTzH_5%Nv<9`gAg{^1O!lMRX~_g9r63QS-o`
za_pC7<>RLU)vuiLHh>2yu2SGZJmabr{Edu(ue!jeWcK&fR`8%cadj+sP@lLu8GM#w
z&vR!t|6K41cu7jAOEQ>Bk@_xpP@f`o9ry~zAJ^8?9sXnRpgu+FKJcKtBK0u%C64_Q
zS^3X^Z#K2z`tb^QkP6l7;6Z%~)!X2_29V^d_rUMW@Pzsl{H+Z4RSqf_)UQw#fdus{
zRJ$=VGrxQ_AuFGAw=m-`p=QuNlk!z9cu>E5wGa3R$KOKm10B9UIR2ZIuhxJB^~qNU
zgSR;Ljam8piIBaV`5v4*&}FXT4|oLi$yLXL4>&SSKsgi3(tTZ-?W>%i}E?B{^<98{987J^T+6!y!(gX2w1tpZ=*F`6rgU=shstJ5?ru_-UyPvl^SZBG6=@GTDC
z2!4*ko59`h_YVg@)yY2+{49qLfCtCxm^uzTNEPY~@S=NfCAnfwxU4|vet67>Lh(B5EA?h?-WG(3!v_9*O`xF(gL|6VejS{$#p
zv-m%<_((pnWfJZA8wNI!&(Go;viRXyd?1UTn8m-5#V^d_R~ddd$}Yjkx+N?BzAXOa
zAp3mv>L6aI-WkNvvxU++@gG-l!>O{pO>Ht%i0rG^wU5{Ul+kv8kyi
zy_Grh*DguUrkw^XP=mk}Hc(ZV+GZH9Nn8C)?Zr{Gsb95mTx}fN{i{vos*U4n6f3u9gS;pUN<8QX{H{1A|ZT!tP{$?A0vyDGHeP$bfvyH!Gm2sG?
zG9Hsv#w8x}HG>^LHDYFg@tUkMZj)7}p2;fXI9X*q2Xn@H&di$3w8_ky%*07r&zTvM
zw4RgJvz;_aJ8P15+9d6KN!kgMv@<4IZL4bMO43f2q@68EJFSv--Xv>m5bVrJ+NqPY
zb0=A2J=@unw9_YP=TFj3proBaNjrs-b`B-&BuduWAlPY?wDTxwCsNYRq@uWDVDTzENLfM
z($2D^on}cp&ysecCGAX0+NqYbb1i8nTT;)mB@1+Lmn_zs6>A$Z{i-J;1rC@63v_2J
zSgbctb!V?%5tKu#C1SNCW0e_5dIr-O$3D00Y&a!_Q>(Ja*00FKN6&XS<=BN&Zn!UJ
z0=JxE@WHVKAKXyocKwP>r|Gosd`}-I@gwpT&AZm1_rl*kwj9
zaPUDHKDdDu+d^Ynp&InOV6lz3KIpDrk(uLm?MvFlF{xKeIAvJjlpA<6MON#T4Y>>v
za!sUcz{J*cfnDhIatjxxiHr`9?t1lIut0|%xu!?hx#%|iPD_j}{VsZD8MI4v(yrA>
zyI3dfYMs=}HTIXF={bQx#j0W>{`4FIGbScahK`G~Bil8k}gNs1IB9fS39!iSBx(_<5i9e|Col$hv68=^STBXGSwag&N|e
z`P3dWmZtlh=ZuUp^x0Vb6Bc~DkPk?rFgz2*=jQl;7az1uwX|>TZRO)bcw8^t)zaJA
z(#i*?@GxPEmiv0}U{gzLFH}C66g=wawxJ4p3@)fjTf0vVa_`LZh$QY4a>DI%Uw9x^
zYT4V~!aCwfK~{!FLm$yvy*_wWYS2@Od?qc(8vKOX;OFz42PFeDKJDl{KZ^?=q_G<^
zAL^(Yk#Kd2J9LarY;|7Z#Qz~iyatDn;B)0k*>IaEEvDL4kewgUQR$l--{S&+)9fnujJpI%PJi~mbe-d@`
zw|&kb4#|gE{7hszZ_Y8PBrX0)t$$w1mzZ1Xh^@{~4N6jCPi%F@b8JL>5?g&D@HnFr
zTfH2(WRv(Iw)!;cjiM7Y<_KSeW7Kndht1kl{XLMq#uP{1&5?lYPflE51{>0XP19fv8C${<~>gG63Z1r;B
zxcSn&gLs(Kjons
z7``5-lZZ!%&hhWWvc2`+~gDf)@~v5zMjYjTO9(c%0y7Vso=q8}S6u
zw-Qej{1sx}M2~bjahc#9#FGSHKwK{PD&h*k*AY(^d^fSV@#a2aU-ZX`D+Tje0&l8d
zE(hKof%*w2U|*xPf>t!A-4b64wjSGY})&4;w7U0mUyY)KN6d=
zM&kYok3mJMAYLxGiug-{7ZL9-xS!bE#<{zCK8(mE@lz07kx4DL4tYDuD3yOiuho`9mIzSK8pBI!8Z|a
z6#P@-FAIL0_%OjQ5T^vcNxVt$`^1fcqfuZEIwbx*PW(Ycjd@S2*CKc?;iCYEl
zPrO<1!NhHXHxsuD?k7H6@OI)O1fNaZA(;1i{Lkj
zj}+`-A@h0!Uqsw1n9qiIeS&{PY{u2kh|Pl?PY`bv8{UuTZ4>+<@qpkQ+>_)TC3rXD
zqXo|;<^)ArL41thLx_(R+(vwyVBXK?nH$=9@1A#p=;sihDEM;XlLY^Oc)Q@ciBA^%
z2=OU`pCvw3@E?f3D)?RE(*%cdfln74C;pn?iNs$QJe~Lq!Fv;*DR?{aS%S|d{)XU3
zh|M^BhIohQeQc#f^Q)HzTi8Fx!5B;
zMSP>+SBP&C{3qg@1%E(%i{J?E49
z0P&9nA3}VW;8xP9xeD;V)KC1OT=SEe}{OS;CG3!KIjw&9xr;7*yu&X6GSg1o+x-GF)uQZ
zRuh*AZYQ23_*mj{!50x%2)>TkwD)%6$)exo;QNWEi2jg+e?{zz{-lFnAg&bsWe2l<
zc8$d;Gp_qW`gaQTHLO{C=R5jpV)GzVgR^f7@ig(@M!ctBem3Iq0t;z?_(_T98N_DI
z+(A4;Z1gp(vFG!3UPAQi9Qz*-?U$6yeHL-G)M1Wevx3;Hb*qVM#LwxDex{>eLR>3;cv@!ny@}YYQ9OO|
z>ckISTb;|I)wz6l_2P%ifwkfEuxks4zBg0+9O&rl9KD5j7T%EB9Gd}RvnJ^4TwEyg
z_bhL9^gD@-&SxvUz43kj@Su~|d-%!9YD*zoy5Z?5262Nx2X
zb%W1Dc>9S>xnqOBbb#w<(G!k6pPBIHi@tz(f#3rid?4{c(fLe;w@7ds@nXT<#QeYj
zsh4=EV13=aOz^4HmkZ{z7Pg)j5u3VQ;oz%?O}qH4g>CzN#Ae;l*XCwDd5Zd%#6K?S
z@Hv2BO!v(CJObFR&%}0p9!(pw-j1h@DVNx;!)3HF$DPTvF~=ifdpw#-8*{9jP8)L!
zCAP=VD%zOido69uai7>8_h-?@oRjb~VSBDZY|mBZ(Z-xdEuxJ%zaqBhSIcN)&Iwo0
z#;gOx_FPe~Y34k(fi~v+me`)(0%nd25#kjR+g#!U1Q!yobYi|r@CfRw1(y+X@*y#9
z-WtI=Zv2o5iLvq;1nW4MV<_8h=fyl?(_d__9VfcIrjOW0&-9UQqv;p6%QOA5f!OrL
zMq<+!n}|*PTZqlMVjHoEc?YqH`4(am=RRT+=K*39+hd4LY-1d&xNc|q4)Hj_EBILl
zzidZ(fH*C9j{b~7u>O4G>w>5A+W%6)R}$YWcq=-_dt7iS{Fj3>5&Ndx@zil`%tY)P
zo5|F1J;_Au8=L9WaZSZU%x7GfYN@mH4fc)AJnA^FWg_;C&2s8E-(n*6jSYW4q8#TO
zOvJviIfQy#bYkDwG*RaV*hs{_vFW1DFLscKePeSp^-|G^ePgqoItM8dv2Se7pw17)
zk%)a`a~^emL4-u?8=DKM|5bEi-`LzpeS+x3zUk{*sq;n>Bx2v#+(q5|Bonc3Y`E@~
zmuYiF>>Ha$s814|*f%!6p=5S`dJHe;wy6P?&MHj}9DDLS!lZ1|jd`E=2VePdHieTL}7
zzOmVddO~z!-`FgozL)64zOgxgdX?zJzOh+PJt;b|Z)^^uUM)JYZ){qrn=j9ZePh!_
zy;kgrePgqYdY$OR_`97toj|=lz`n8JZ#0z86rI>NHanuvdB(TROy
zGmQEY(TROygFhpy%9n~x>>C^Y4np}d(TROy!{_nKmy1s98=D06{Y5ACjZHoE6`~XS
z#%3<{14JkGjm-k;?}|?B8ykLZU)~@(vA;%eiu$?$`^F|seZA=6LD{i%#qtn^UOs#xW#f-`Jc*{ZP?~ePhGlswn5d8Hw08HkVTWvgpLV
zvALT1VWJcJ#^wjqQ=$|5#^yHan?xt}jSYX}qWo{76Z^*I*VH$QPVA=zKSRAOz`n70
ziF&)}#J;h4jr!rD6Z^*IE$T;zPV5_-_o;V?PV5_-e^Bofo!B=vu^99&(TROyQ$)R6
zbYkDwjHJFrbYkDwOr(CK=)}IU;csY^_lQpH8=D06UeSqtV^dB2J<*AMW3!z4(V`Rk
z1AF`^Uu#)iMSQGTrG#J;iNZ*PuOTqUglFu{o9cNum?`#^x;Q+eIh#jm`PgPZpinH#V12KSgw6-`HGD{Z!G3ePeSS
z_4h?5_KnSb)Xx;1*#ElVhp3+wVBgq0PW>CA6Z^*IDe5~!C-#jEf9s?CY|)8*WAi%o
zb3`Zhjm=xs&lR26H#YB4KTmXG-`IRY{hOi_`^F}g1O0r_iG5>JMEwHMiG5=;lKO?B
z6Z^(yBK30@~1JQ|nW5eGDDZgBFV*gUX`%%9lz`n6rO#M5e6Z^)7-y4>H
zS9D_E*sP;|rRc=IvEgrslwTz}v2SeB)UOtu*f%y^)W0V>v2SenU1a$+q7(bZhQAk6
zey!-lzOgx#`gNic`^M%h>eq`->>Hc&sox+vv2ScHrv9Pm#J;h)nfeb!C-!d^d^`0Y
z1=u$>_fWr8bYkDwJV5<6(TROy^Ema}MJM)+4S$oQ{0`BHePi=7^*co;_KnRO)PF2G
zv2SeNp?;U>#J;ilkow)C6Z^)7-^rHWBRa8fYznCVM08@`*o>h5Q_+ciV>6!my`mHQ
z#)iLTQhuN4#J;iNZ<>_dY&xiaBs#HgZ1{b2`L9GL_8%8~I`t<4>>HbJQ2({)
z#J;gPpZae^C-#laWz?S(o!B=v*HV8
zEjABhQ}KfUR~r3A+L-#hLVT0hyoOE1BLS{7`UkWz_S|@ni48uWRuwM=xYFoVkm|;Z
zPF!o^JRi9JOQI7`DHps5o4S<&t~E9rsjn5CxYop%*KLCOcNe=)#QjEze49@W{`*n}V)&K
zULXY_%~(10!H}@~4ho2)W~w*HR#ZMBC~*y*AH`_m-yk=?95N`Ie^t>nZfuNb!~!M{YwKl#q%h>rX+r5VrKkI9PwD0K5K<*@eFo%s%t5WxB9E
z@Rtv6{ap_1`r}s~JF6cLmu~&4@Y#c{ALC~I-I3*wU;FIL-w(6=J=_uaD{}nt)XS~k
zk9XmZOS4m
z4?E5eA1_<(Ia&UGK2g@)>~hb{@>h5&?i)g-=x?gy@9Hdn{0{6i>kM1ljw`bKZNzz~
z^*7D&r|;Qt_WuF=z3B{8>+eTd{%$~_edrI?Z@S~}K~ujf660=u}a6u2EP&t=uG>>@mWV)}!1vHihaVVX%dpaGk3u&sf@NA_vQ
jVU~xN)9tG85PVO~fn<`cLNT~&*LI0gynn?eYxh3@lvuXW
diff --git a/obj/App/src/mppt_control.o b/obj/App/src/mppt_control.o
index 8d1023ecad8523ef91b3f6fd6780c941919065e4..f83bc9f03f9d44d71b743512eca797a25089dc37 100644
GIT binary patch
literal 71100
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