简陋检验,几种充电状态的切换
This commit is contained in:
parent
b7e1572375
commit
de2f325604
|
@ -19,8 +19,7 @@ typedef struct _SL_Mppt_para{
|
||||||
uint16_t Battery_Voltage; /* µç³Øµçѹ */
|
uint16_t Battery_Voltage; /* µç³Øµçѹ */
|
||||||
uint16_t Battery_temperature; /* µç³ØÎÂ¶È */
|
uint16_t Battery_temperature; /* µç³ØÎÂ¶È */
|
||||||
uint16_t Remaining_Battery_Bower; /* µç³ØÊ£ÓàµçÁ¿ */
|
uint16_t Remaining_Battery_Bower; /* µç³ØÊ£ÓàµçÁ¿ */
|
||||||
uint16_t Solar_Open_Circuit_Voltage1; /* 太阳能开路电压1 */
|
uint16_t Solar_Open_Circuit_Voltage; /* 太阳能开路电压 */
|
||||||
uint16_t Solar_Open_Circuit_Voltage2; /* 太阳能开路电压2 */
|
|
||||||
}SL_Mppt_para;
|
}SL_Mppt_para;
|
||||||
extern SL_Mppt_para g_Mppt_Para;
|
extern SL_Mppt_para g_Mppt_Para;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
@ -48,5 +47,6 @@ void mppt_readJust(void);
|
||||||
void MpptMode(void);
|
void MpptMode(void);
|
||||||
void mppt_constantVoltage(float InVoltage);
|
void mppt_constantVoltage(float InVoltage);
|
||||||
void test(void);
|
void test(void);
|
||||||
|
void printf_data(void);
|
||||||
|
|
||||||
#endif /* APP_INC_MPPT_CONTROL_H_ */
|
#endif /* APP_INC_MPPT_CONTROL_H_ */
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
extern STR_TimeSliceOffset m_runled;
|
extern STR_TimeSliceOffset m_runled;
|
||||||
void Task_RunLED(void);
|
void Task_RunLED(void);
|
||||||
|
|
||||||
#define mpptControl_reloadVal 2000 /* 任务执行间隔 */
|
#define mpptControl_reloadVal 10 /* 任务执行间隔 */
|
||||||
#define mpptControl_offset 0 /* 任务执行偏移量 */
|
#define mpptControl_offset 0 /* 任务执行偏移量 */
|
||||||
extern STR_TimeSliceOffset m_mpptControl;
|
extern STR_TimeSliceOffset m_mpptControl;
|
||||||
void Task_mpptControl(void);
|
void Task_mpptControl(void);
|
||||||
|
@ -47,7 +47,7 @@ extern uint8_t g_recvBroadcastRegisterNumber; /*
|
||||||
extern STR_TimeSliceOffset m_recvbroadcast;
|
extern STR_TimeSliceOffset m_recvbroadcast;
|
||||||
void Task_recvbroadcast(void);
|
void Task_recvbroadcast(void);
|
||||||
|
|
||||||
#define EnPowerSupply_reloadVal 100 /* 任务执行间隔 */
|
#define EnPowerSupply_reloadVal 1000 /* 任务执行间隔 */
|
||||||
#define EnPowerSupply_offset 0 /* 任务执行偏移量 */
|
#define EnPowerSupply_offset 0 /* 任务执行偏移量 */
|
||||||
extern STR_TimeSliceOffset m_EnPowerSupply;
|
extern STR_TimeSliceOffset m_EnPowerSupply;
|
||||||
extern void Task_EnPowerSupply(void);
|
extern void Task_EnPowerSupply(void);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#define MOSFET_Temper ADC_Channel_6
|
#define MOSFET_Temper ADC_Channel_6
|
||||||
#define PV2_VOLT_IN ADC_Channel_7
|
#define PV2_VOLT_IN ADC_Channel_7
|
||||||
|
|
||||||
#define enable_Printf_VI
|
//#define enable_Printf_VI
|
||||||
|
|
||||||
/* 光伏充电输出电流比例,放大倍数*电阻 */
|
/* 光伏充电输出电流比例,放大倍数*电阻 */
|
||||||
const float P_CHG_CURR = (1.0 / (50 * 0.005));
|
const float P_CHG_CURR = (1.0 / (50 * 0.005));
|
||||||
|
@ -30,9 +30,9 @@ const float P_PV_VOLT_OUT = (47.0 + 10.0) / 10.0;
|
||||||
/* 放电电流采集电流倍数 */
|
/* 放电电流采集电流倍数 */
|
||||||
const float P_DSG_CURR = (1.0 / (50 * 0.005));
|
const float P_DSG_CURR = (1.0 / (50 * 0.005));
|
||||||
///* 光伏1开路输出电压比例 */
|
///* 光伏1开路输出电压比例 */
|
||||||
//const float P_PV1_VOLT_IN = (100 + 4.7) / 4.7;
|
const float P_PV1_VOLT_IN = (100 + 4.7) / 4.7;
|
||||||
/* 光伏1开路输出电压比例 */
|
/* 光伏1开路输出电压比例 */
|
||||||
const float P_PV1_VOLT_IN = (47 + 4.7) / 4.7;
|
//const float P_PV1_VOLT_IN = (47 + 4.7) / 4.7;
|
||||||
/* 系统电源电压比例 */
|
/* 系统电源电压比例 */
|
||||||
const float P_PV_VOLT_IN1 = (47 + 4.7) / 4.7;
|
const float P_PV_VOLT_IN1 = (47 + 4.7) / 4.7;
|
||||||
/* 温度采集比例 */
|
/* 温度采集比例 */
|
||||||
|
@ -166,7 +166,7 @@ float get_DSG_CURR(void)
|
||||||
I_ADC = Get_ConversionVal(get_adc(DSG_CURR));
|
I_ADC = Get_ConversionVal(get_adc(DSG_CURR));
|
||||||
// I_ADC = get_adc(DSG_CURR);
|
// I_ADC = get_adc(DSG_CURR);
|
||||||
|
|
||||||
I = (float)(I_ADC) / 4095 * 3.3 * P_DSG_CURR;
|
I = (float)(I_ADC) / 4095 * 3.3 * P_DSG_CURR * 2;
|
||||||
|
|
||||||
#ifdef enable_Printf_VI
|
#ifdef enable_Printf_VI
|
||||||
printf("\n DSG_CURR ADC : %d \n", I_ADC);
|
printf("\n DSG_CURR ADC : %d \n", I_ADC);
|
||||||
|
|
|
@ -16,10 +16,10 @@ config_info g_slConfigInfo = {
|
||||||
.Communication_Methods = RS485,
|
.Communication_Methods = RS485,
|
||||||
.bat485_Baud = 9600,
|
.bat485_Baud = 9600,
|
||||||
.gw485_Baud = 9600,
|
.gw485_Baud = 9600,
|
||||||
.ConstantCurrentV = 1030,
|
.ConstantCurrentV = 1100,
|
||||||
.ConstantCurrentV = 1300,
|
.ConstantVoltageV = 1400,
|
||||||
.FloatI = 10,
|
.FloatI = 50,
|
||||||
.startSolarOpenCircuitV = 1800,
|
.startSolarOpenCircuitV = 1600,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ static void FloatingCharge(void);
|
||||||
/* 占空比 */
|
/* 占空比 */
|
||||||
float g_duty_ratio = 0.7;
|
float g_duty_ratio = 0.7;
|
||||||
/* 用于确定工作模式 */
|
/* 用于确定工作模式 */
|
||||||
static uint8_t modeFlag = 0;
|
static uint8_t modeFlag = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 得到输出的功率
|
* @brief 得到输出的功率
|
||||||
|
@ -137,13 +137,16 @@ void mppt_readJust(void)
|
||||||
void printf_data(void)
|
void printf_data(void)
|
||||||
{
|
{
|
||||||
printf("\n");
|
printf("\n");
|
||||||
get_CHG_CURR();
|
// get_CHG_CURR();
|
||||||
get_PV_VOLT_OUT();
|
// get_PV_VOLT_OUT();
|
||||||
get_DSG_CURR();
|
// get_DSG_CURR();
|
||||||
// get_PV1_VOLT_IN();
|
// get_PV1_VOLT_IN();
|
||||||
get_PV_VOLT_IN1();
|
// get_PV_VOLT_IN1();
|
||||||
get_MOSFET_Temper();
|
// get_MOSFET_Temper();
|
||||||
get_PV2_VOLT_IN();
|
// get_PV2_VOLT_IN();
|
||||||
|
|
||||||
|
printf("1. 涓流模式; 2. 恒流模式; 3, 恒压模式; 4, 浮充模式modeFlag : %d \n", modeFlag);
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,22 +187,23 @@ void mppt_constantVoltage(float InVoltage)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
static float_t kp = 0.05;
|
static float_t kp = 0.005;
|
||||||
static float_t ki = 0.0001;
|
static float_t ki = 0.00001;
|
||||||
// static float_t allError = 0;
|
// static float_t allError = 0;
|
||||||
|
|
||||||
// float_t error = (get_PV1_VOLT_IN()) - InVoltage;
|
// float_t error = (get_PV1_VOLT_IN()) - InVoltage;
|
||||||
// float_t error = InVoltage - (get_PV2_VOLT_IN());
|
// float_t error = InVoltage - (get_PV2_VOLT_IN());
|
||||||
// allError += error;
|
// allError += error;
|
||||||
|
|
||||||
float_t pv1Volt = get_PV2_VOLT_IN();
|
float_t pv1Volt = get_PV1_VOLT_IN();
|
||||||
float_t error = pv1Volt - InVoltage;
|
float_t error = pv1Volt - InVoltage;
|
||||||
// float_t error = InVoltage - pv1Volt;
|
// float_t error = InVoltage - pv1Volt;
|
||||||
float_t stepPwm = kp * error + ki * pv1Volt;
|
float_t stepPwm = kp * error + ki * pv1Volt;
|
||||||
g_duty_ratio += stepPwm;
|
g_duty_ratio += stepPwm;
|
||||||
|
|
||||||
// printf("setPwm : %d/10000 \n", (int)(stepPwm * 10000));
|
// printf("setPwm : %d/10000 \n", (int)(stepPwm * 10000));
|
||||||
|
// printf("setPwm : %d/10000 \n", (int)(stepPwm * 10000));
|
||||||
|
// printf("g_duty_ratio : %d/10000 \n", (int)(g_duty_ratio * 10000));
|
||||||
|
|
||||||
Set_duty_ratio(&g_duty_ratio);
|
Set_duty_ratio(&g_duty_ratio);
|
||||||
}
|
}
|
||||||
|
@ -243,6 +247,8 @@ void mppt_constantVoltageO(float OutVoltage)
|
||||||
|
|
||||||
static float_t kp = 0.02;
|
static float_t kp = 0.02;
|
||||||
static float_t ki = 0.00001;
|
static float_t ki = 0.00001;
|
||||||
|
// static float_t kp = 0.1;
|
||||||
|
// static float_t ki = 0.001;
|
||||||
|
|
||||||
float_t outVolt = get_PV_VOLT_OUT();
|
float_t outVolt = get_PV_VOLT_OUT();
|
||||||
// float_t error = outVolt - OutVoltage;
|
// float_t error = outVolt - OutVoltage;
|
||||||
|
@ -250,8 +256,7 @@ void mppt_constantVoltageO(float OutVoltage)
|
||||||
float_t stepPwm = kp * error + ki * outVolt;
|
float_t stepPwm = kp * error + ki * outVolt;
|
||||||
g_duty_ratio += stepPwm;
|
g_duty_ratio += stepPwm;
|
||||||
|
|
||||||
printf("setPwm : %d/10000 \n", (int)(stepPwm * 10000));
|
// printf("setPwm : %d/10000 \n", (int)(stepPwm * 10000));
|
||||||
|
|
||||||
|
|
||||||
Set_duty_ratio(&g_duty_ratio);
|
Set_duty_ratio(&g_duty_ratio);
|
||||||
|
|
||||||
|
@ -296,24 +301,43 @@ void mppt_constantCurrentO(float outCurrent)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
static float_t kp = 0.01;
|
static float_t kp = 0.005;
|
||||||
static float_t ki = 0.0001;
|
static float_t ki = 0.00005;
|
||||||
|
|
||||||
// static float_t last_CHG_CURR = 0;
|
// static float_t last_CHG_CURR = 0;
|
||||||
// static float_t flag = 0;
|
// static float_t flag = 1;
|
||||||
|
// static float_t last_OutputPower = 0;
|
||||||
|
|
||||||
float_t outCurr = get_CHG_CURR();
|
float_t outCurr = get_CHG_CURR();
|
||||||
|
// float_t OutputPower = outCurr * get_PV_VOLT_OUT();
|
||||||
float_t error = outCurrent - outCurr;
|
float_t error = outCurrent - outCurr;
|
||||||
// float_t error = outCurr - outCurrent;
|
// float_t error = outCurr - outCurrent;
|
||||||
float_t stepPwm = kp * error + ki * outCurr;
|
float_t stepPwm = kp * error + ki * outCurr;
|
||||||
|
|
||||||
// if ((last_CHG_CURR > outCurr) && flag) {
|
// if (flag) {
|
||||||
// g_duty_ratio -= stepPwm;
|
// if (OutputPower > last_OutputPower) {
|
||||||
|
// g_duty_ratio += stepPwm;
|
||||||
|
// flag = 1;
|
||||||
|
// } else {
|
||||||
|
// g_duty_ratio -= stepPwm;
|
||||||
|
// flag = 0;
|
||||||
|
// }
|
||||||
// } else {
|
// } else {
|
||||||
g_duty_ratio += stepPwm;
|
// if (OutputPower > last_OutputPower) {
|
||||||
|
// g_duty_ratio -= stepPwm;
|
||||||
|
// flag = 0;
|
||||||
|
// } else {
|
||||||
|
// g_duty_ratio += stepPwm;
|
||||||
|
// flag = 1;
|
||||||
|
// }
|
||||||
// }
|
// }
|
||||||
|
//
|
||||||
|
// last_OutputPower = OutputPower;
|
||||||
|
|
||||||
printf("setPwm : %d/10000 \n", (int)(stepPwm * 10000));
|
g_duty_ratio += stepPwm;
|
||||||
|
|
||||||
|
// printf("setPwm : %d/10000 \n", (int)(stepPwm * 10000));
|
||||||
|
// printf("g_duty_ratio : %d/10000 \n", (int)(g_duty_ratio * 10000));
|
||||||
|
|
||||||
Set_duty_ratio(&g_duty_ratio);
|
Set_duty_ratio(&g_duty_ratio);
|
||||||
|
|
||||||
|
@ -333,7 +357,7 @@ void mppt_constantCurrentO(float outCurrent)
|
||||||
*/
|
*/
|
||||||
void TrickleCharge(void)
|
void TrickleCharge(void)
|
||||||
{
|
{
|
||||||
mppt_constantCurrentO(0.7);
|
mppt_constantCurrentO(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -344,7 +368,9 @@ void TrickleCharge(void)
|
||||||
*/
|
*/
|
||||||
void ConstantCurrentCharge(void)
|
void ConstantCurrentCharge(void)
|
||||||
{
|
{
|
||||||
mppt_readJust();
|
// mppt_readJust();
|
||||||
|
mppt_constantVoltage(18);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -355,7 +381,12 @@ void ConstantCurrentCharge(void)
|
||||||
*/
|
*/
|
||||||
void ConstantVoltageCharge(void)
|
void ConstantVoltageCharge(void)
|
||||||
{
|
{
|
||||||
mppt_constantVoltage(17.5);
|
// mppt_constantVoltage(17.5);
|
||||||
|
// mppt_constantVoltageO((float_t)g_Mppt_Para.Battery_Voltage);
|
||||||
|
|
||||||
|
mppt_constantVoltageO(14.5);
|
||||||
|
// g_duty_ratio = 0.9;
|
||||||
|
// Set_duty_ratio(&g_duty_ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -366,39 +397,57 @@ void ConstantVoltageCharge(void)
|
||||||
*/
|
*/
|
||||||
void FloatingCharge(void)
|
void FloatingCharge(void)
|
||||||
{
|
{
|
||||||
static uint8_t run_num;
|
// static uint32_t run_num;
|
||||||
|
|
||||||
if (get_CHG_CURR() > 0.1) {
|
// if (get_CHG_CURR() > 0.01) {
|
||||||
mppt_constantVoltageO(12);
|
// mppt_constantVoltageO(12);
|
||||||
if (run_num++ > 100) {
|
// if (run_num++ > 100) {
|
||||||
if ((get_PV_VOLT_OUT()) < 14) {
|
// if ((get_PV_VOLT_OUT()) < 14) {
|
||||||
run_num = 0;
|
// run_num = 0;
|
||||||
modeFlag = CONSTANTVOLTAGE;
|
// modeFlag = CONSTANTVOLTAGE;
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// else {
|
||||||
|
// TIM_SetCompare4(TIM4, 0);
|
||||||
|
// if (run_num++) {
|
||||||
|
// if ((get_PV_VOLT_OUT()) < 14) {
|
||||||
|
// run_num = 0;
|
||||||
|
// modeFlag = CONSTANTVOLTAGE;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (run_num > 100) {
|
||||||
|
// run_num = 0;
|
||||||
|
// modeFlag = CONSTANTVOLTAGE;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (run_num > 200) {
|
||||||
|
// run_num = 100;
|
||||||
|
// }
|
||||||
|
|
||||||
|
static uint32_t num = 0;
|
||||||
|
TIM_SetCompare4(TIM4, 0);
|
||||||
|
// mppt_constantVoltageO(12);
|
||||||
|
|
||||||
|
if (500 == num++) {
|
||||||
|
// if ((get_PV_VOLT_OUT()) > 13.5) {
|
||||||
|
num = 0;
|
||||||
|
modeFlag = CONSTANTVOLTAGE;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
// if ((get_PV_VOLT_OUT()) > 13.5) {
|
||||||
TIM_SetCompare4(TIM4, 0);
|
// modeFlag = CONSTANTVOLTAGE;
|
||||||
if (run_num++) {
|
// return;
|
||||||
if ((get_PV_VOLT_OUT()) < 14) {
|
// }
|
||||||
run_num = 0;
|
|
||||||
modeFlag = CONSTANTVOLTAGE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (run_num > 100) {
|
|
||||||
run_num = 0;
|
|
||||||
modeFlag = CONSTANTVOLTAGE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (run_num > 200) {
|
|
||||||
run_num = 100;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -428,38 +477,68 @@ void MpptContorl(void)
|
||||||
|
|
||||||
void MpptMode(void)
|
void MpptMode(void)
|
||||||
{
|
{
|
||||||
static uint8_t temp_flag = 1;
|
// static uint8_t temp_flag = 1;
|
||||||
static float ConstantCurrentV;
|
// static float ConstantCurrentV;
|
||||||
static float ConstantVoltageV;
|
// static float ConstantVoltageV;
|
||||||
static float FloatI;
|
// static float FloatI;
|
||||||
/* ¸³Öµ½öÖ´ÐÐÒ»´Î */
|
// /* 赋值仅执行一次 */
|
||||||
if (temp_flag) {
|
// if (temp_flag) {
|
||||||
ConstantCurrentV = (float)g_slConfigInfo.ConstantCurrentV / 100;
|
// ConstantCurrentV = (float)g_slConfigInfo.ConstantCurrentV / 100;
|
||||||
ConstantVoltageV = (float)g_slConfigInfo.ConstantVoltageV / 100;
|
// ConstantVoltageV = (float)g_slConfigInfo.ConstantVoltageV / 100;
|
||||||
FloatI = (float)g_slConfigInfo.FloatI / 100;
|
// FloatI = (float)g_slConfigInfo.FloatI / 100;
|
||||||
temp_flag = 0;
|
// temp_flag = 0;
|
||||||
}
|
//// printf("g_slConfigInfo.ConstantCurrentV : %d g_slConfigInfo.ConstantVoltageV : %d /100 \n", g_slConfigInfo.ConstantCurrentV, g_slConfigInfo.ConstantVoltageV);
|
||||||
|
//// printf("ConstantCurrentV : %d /100 ConstantVoltageV : %d /100 \n", (int)ConstantCurrentV, (int)ConstantVoltageV);
|
||||||
|
// }
|
||||||
|
|
||||||
if ((ConstantCurrentV < g_Mppt_Para.Battery_Voltage) &&
|
printf("vout : %d /100 \n", g_Mppt_Para.Battery_Voltage);
|
||||||
(ConstantVoltageV > g_Mppt_Para.Battery_Voltage)) {
|
printf("iout : %d /1000 \n", (int)(get_CHG_CURR() * 1000));
|
||||||
modeFlag = CONSTANTCURRENT;
|
printf("in checkSolarOpenCircuitVoltage v: %d/100 \n", g_Mppt_Para.Solar_Open_Circuit_Voltage);
|
||||||
return;
|
// printf("ConstantCurrentV : %d ConstantVoltageV : %d \n", (int)ConstantCurrentV, (int)ConstantVoltageV);
|
||||||
}
|
|
||||||
|
|
||||||
if (!(ConstantVoltageV > g_Mppt_Para.Battery_Voltage) &&
|
// if (((ConstantVoltageV < (float)g_Mppt_Para.Battery_Voltage / 100) &&
|
||||||
(FloatI < get_CHG_CURR())) {
|
// (FloatI > get_CHG_CURR())) || modeFlag == FLOAT) {
|
||||||
modeFlag = CONSTANTVOLTAGE;
|
// modeFlag = FLOAT;
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
// if ((ConstantCurrentV < (float)g_Mppt_Para.Battery_Voltage / 100) &&
|
||||||
|
// (ConstantVoltageV >= (float)g_Mppt_Para.Battery_Voltage / 100)) {
|
||||||
|
// modeFlag = CONSTANTCURRENT;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if ((ConstantVoltageV < (float)g_Mppt_Para.Battery_Voltage / 100) &&
|
||||||
|
// (FloatI <= get_CHG_CURR())) {
|
||||||
|
// modeFlag = CONSTANTVOLTAGE;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
if ((!(ConstantVoltageV > g_Mppt_Para.Battery_Voltage) &&
|
if (((14.3 < (float)g_Mppt_Para.Battery_Voltage / 100) &&
|
||||||
(FloatI > get_CHG_CURR())) || modeFlag == FLOAT) {
|
(0.08 > get_CHG_CURR())) || modeFlag == FLOAT) {
|
||||||
modeFlag = FLOAT;
|
modeFlag = FLOAT;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
modeFlag = TRICKLE;
|
if ((13 < (float)g_Mppt_Para.Battery_Voltage / 100) &&
|
||||||
return;
|
(13.8 >= (float)g_Mppt_Para.Battery_Voltage / 100)) {
|
||||||
|
modeFlag = CONSTANTCURRENT;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((14.3 < (float)g_Mppt_Para.Battery_Voltage / 100) &&
|
||||||
|
(0.2 <= get_CHG_CURR())) {
|
||||||
|
modeFlag = CONSTANTVOLTAGE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (12.5 > (float)g_Mppt_Para.Battery_Voltage / 100) {
|
||||||
|
modeFlag = TRICKLE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// modeFlag = CONSTANTCURRENT;
|
||||||
|
// return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void findMiNDutyRatio(void)
|
void findMiNDutyRatio(void)
|
||||||
|
@ -488,11 +567,13 @@ void test(void)
|
||||||
// printf_data();
|
// printf_data();
|
||||||
// void MpptContorl();
|
// void MpptContorl();
|
||||||
|
|
||||||
// mppt_constantVoltageO(13);
|
// mppt_constantVoltageO(12);
|
||||||
|
|
||||||
// FloatingCharge();
|
// FloatingCharge();
|
||||||
// mppt_readJust();
|
// mppt_readJust();
|
||||||
|
|
||||||
// mppt_constantCurrentO(1.0);
|
// mppt_constantCurrentO(1);
|
||||||
|
MpptContorl();
|
||||||
|
|
||||||
// static uint32_t run_num = 0;
|
// static uint32_t run_num = 0;
|
||||||
// if (1000 < run_num++) {
|
// if (1000 < run_num++) {
|
||||||
|
|
|
@ -30,8 +30,8 @@ static uint16_t SL_ReadRegisterCommunicationMethods(void *pMsg);
|
||||||
static uint16_t SL_ReadRegisterBatteryVoltage(void *pMsg);
|
static uint16_t SL_ReadRegisterBatteryVoltage(void *pMsg);
|
||||||
static uint16_t SL_ReadRegisterBatterytemperature(void *pMsg);
|
static uint16_t SL_ReadRegisterBatterytemperature(void *pMsg);
|
||||||
static uint16_t SL_ReadRegisterRemainingBatteryBower(void *pMsg);
|
static uint16_t SL_ReadRegisterRemainingBatteryBower(void *pMsg);
|
||||||
static uint16_t SL_ReadRegisterSolarOpenCircuitVoltage1(void *pMsg);
|
static uint16_t SL_ReadRegisterSolarOpenCircuitVoltage(void *pMsg);
|
||||||
static uint16_t SL_ReadRegisterSolarOpenCircuitVoltage2(void *pMsg);
|
//static uint16_t SL_ReadRegisterSolarOpenCircuitVoltage2(void *pMsg);
|
||||||
|
|
||||||
//static uint16_t SL_WriteRegisterRegistrationStatus(void *pMsg);
|
//static uint16_t SL_WriteRegisterRegistrationStatus(void *pMsg);
|
||||||
//static uint16_t SL_WriteRegisteraddress(void *pMsg);
|
//static uint16_t SL_WriteRegisteraddress(void *pMsg);
|
||||||
|
@ -82,8 +82,8 @@ SL_RegProcTable g_RegTblR[] =
|
||||||
{SL_Register_Battery_Voltage, SL_ReadRegisterBatteryVoltage},
|
{SL_Register_Battery_Voltage, SL_ReadRegisterBatteryVoltage},
|
||||||
{SL_Register_Battery_temperature, SL_ReadRegisterBatterytemperature},
|
{SL_Register_Battery_temperature, SL_ReadRegisterBatterytemperature},
|
||||||
{SL_Register_Remaining_Battery_Bower, SL_ReadRegisterRemainingBatteryBower},
|
{SL_Register_Remaining_Battery_Bower, SL_ReadRegisterRemainingBatteryBower},
|
||||||
{SL_Register_Solar_Open_Circuit_Voltage1, SL_ReadRegisterSolarOpenCircuitVoltage1},
|
{SL_Register_Solar_Open_Circuit_Voltage1, SL_ReadRegisterSolarOpenCircuitVoltage},
|
||||||
{SL_Register_Solar_Open_Circuit_Voltage2, SL_ReadRegisterSolarOpenCircuitVoltage2},
|
// {SL_Register_Solar_Open_Circuit_Voltage2, SL_ReadRegisterSolarOpenCircuitVoltage2},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 寄存器处理表 */
|
/* 寄存器处理表 */
|
||||||
|
@ -508,24 +508,24 @@ uint16_t SL_ReadRegisterRemainingBatteryBower(void *pMsg)
|
||||||
* @param
|
* @param
|
||||||
* @retval
|
* @retval
|
||||||
*/
|
*/
|
||||||
uint16_t SL_ReadRegisterSolarOpenCircuitVoltage1(void *pMsg)
|
uint16_t SL_ReadRegisterSolarOpenCircuitVoltage(void *pMsg)
|
||||||
{
|
{
|
||||||
log_info(" SL_ReadRegisterSolarOpenCircuitVoltage1 ");
|
log_info(" SL_ReadRegisterSolarOpenCircuitVoltage1 ");
|
||||||
uint16_t value = (uint16_t)g_Mppt_Para.Solar_Open_Circuit_Voltage1 * 10;
|
uint16_t value = (uint16_t)g_Mppt_Para.Solar_Open_Circuit_Voltage * 10;
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 读取太阳能开路电压2寄存器
|
|
||||||
* @param
|
|
||||||
* @retval
|
|
||||||
*/
|
|
||||||
uint16_t SL_ReadRegisterSolarOpenCircuitVoltage2(void *pMsg)
|
|
||||||
{
|
|
||||||
log_info(" SL_ReadRegisterSolarOpenCircuitVoltage2 ");
|
|
||||||
uint16_t value = (uint16_t)g_Mppt_Para.Solar_Open_Circuit_Voltage2 * 10;
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
///**
|
||||||
|
// * @brief 读取太阳能开路电压2寄存器
|
||||||
|
// * @param
|
||||||
|
// * @retval
|
||||||
|
// */
|
||||||
|
//uint16_t SL_ReadRegisterSolarOpenCircuitVoltage2(void *pMsg)
|
||||||
|
//{
|
||||||
|
// log_info(" SL_ReadRegisterSolarOpenCircuitVoltage2 ");
|
||||||
|
// uint16_t value = (uint16_t)g_Mppt_Para.Solar_Open_Circuit_Voltage2 * 10;
|
||||||
|
// return value;
|
||||||
|
//}
|
||||||
|
|
||||||
///**
|
///**
|
||||||
// * @brief 写入注册状态寄存器
|
// * @brief 写入注册状态寄存器
|
||||||
|
@ -770,7 +770,7 @@ static int uart_read_climate_pack(device_handle uart_handle,uint8_t *buff, uint3
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((offset == 14) && (pack->function_Code == SL_Function_Code_Write_Register)) {
|
if ((pack->function_Code == SL_Function_Code_Write_Register) && (offset >= 14)) {
|
||||||
SL_Mppt_Worecv_pack *wpack = (SL_Mppt_Worecv_pack *)buff;
|
SL_Mppt_Worecv_pack *wpack = (SL_Mppt_Worecv_pack *)buff;
|
||||||
uint8_t Register_Number = (wpack->write_Register_Number_H << 8) | wpack->write_Register_Number_L;
|
uint8_t Register_Number = (wpack->write_Register_Number_H << 8) | wpack->write_Register_Number_L;
|
||||||
len = Register_Number * 2 + SL_MPPT_WORECV_PACK_SIZE - 4;
|
len = Register_Number * 2 + SL_MPPT_WORECV_PACK_SIZE - 4;
|
||||||
|
|
111
App/src/task.c
111
App/src/task.c
|
@ -33,7 +33,10 @@ void Task_RunLED(void)
|
||||||
// uart_sendstr(g_gw485_uart4_handle, "\n\n\n\n\n");
|
// uart_sendstr(g_gw485_uart4_handle, "\n\n\n\n\n");
|
||||||
// uart_sendstr(g_gw485_uart4_handle, "is gw485\n");
|
// uart_sendstr(g_gw485_uart4_handle, "is gw485\n");
|
||||||
// uart_sendstr(g_bat485_uart3_handle, "is bat485\n");
|
// uart_sendstr(g_bat485_uart3_handle, "is bat485\n");
|
||||||
// printf("duty_ratio : %d/1000 \n", (int)(g_duty_ratio * 1000));
|
printf("duty_ratio : %d/1000 \n", (int)(g_duty_ratio * 1000));
|
||||||
|
printf_data();
|
||||||
|
|
||||||
|
// get_CHG_CURR();
|
||||||
|
|
||||||
static uint8_t flag = RESET;
|
static uint8_t flag = RESET;
|
||||||
flag = !flag;
|
flag = !flag;
|
||||||
|
@ -50,7 +53,7 @@ void Task_RunLED(void)
|
||||||
STR_TimeSliceOffset m_mpptControl;
|
STR_TimeSliceOffset m_mpptControl;
|
||||||
void Task_mpptControl(void)
|
void Task_mpptControl(void)
|
||||||
{
|
{
|
||||||
// test();
|
test();
|
||||||
|
|
||||||
// static uint8_t test_flag = 0;
|
// static uint8_t test_flag = 0;
|
||||||
// if (5 == ++test_flag) {
|
// if (5 == ++test_flag) {
|
||||||
|
@ -102,8 +105,9 @@ void Task_wdi(void)
|
||||||
* @retval
|
* @retval
|
||||||
*/
|
*/
|
||||||
#define checkRemainingBatteryBower 30 //电池剩余电量30s刷新一次
|
#define checkRemainingBatteryBower 30 //电池剩余电量30s刷新一次
|
||||||
#define checkSolarOpenCircuitVoltage 1800 //太阳能板开路电压30min刷新一次
|
//#define checkSolarOpenCircuitVoltage 1800 //太阳能板开路电压30min刷新一次
|
||||||
#define mpptmodedelay 60 //mppt工作模式60s刷新一次(小于1000S)
|
#define checkSolarOpenCircuitVoltage 100 //太阳能板开路电压刷新一次
|
||||||
|
#define mpptmodedelay 1 //mppt工作模式60s刷新一次(小于1000S)
|
||||||
//#define checkSolarOpenCircuitDelay 500 //检测太阳能板开路电压时,关闭太阳能板的延时时间
|
//#define checkSolarOpenCircuitDelay 500 //检测太阳能板开路电压时,关闭太阳能板的延时时间
|
||||||
STR_TimeSliceOffset m_refreshRegister;
|
STR_TimeSliceOffset m_refreshRegister;
|
||||||
void Task_refreshRegister(void)
|
void Task_refreshRegister(void)
|
||||||
|
@ -114,9 +118,9 @@ void Task_refreshRegister(void)
|
||||||
static uint32_t opencheckFlag = 0;
|
static uint32_t opencheckFlag = 0;
|
||||||
static uint32_t mpptModeFlag = mpptmodedelay -1;
|
static uint32_t mpptModeFlag = mpptmodedelay -1;
|
||||||
|
|
||||||
/* 后续可以添加考虑减少放电电流的影响 */
|
// g_Mppt_Para.Battery_Voltage = 0;
|
||||||
g_Mppt_Para.Battery_Voltage = 0;
|
|
||||||
g_Mppt_Para.Battery_temperature = 0;
|
g_Mppt_Para.Battery_temperature = 0;
|
||||||
|
g_Mppt_Para.Battery_Voltage = (uint16_t)(get_PV_VOLT_OUT() * 100);
|
||||||
|
|
||||||
if (checkRemainingBatteryBower == ++checkFlagTemp1) {
|
if (checkRemainingBatteryBower == ++checkFlagTemp1) {
|
||||||
g_Mppt_Para.Remaining_Battery_Bower = 0;
|
g_Mppt_Para.Remaining_Battery_Bower = 0;
|
||||||
|
@ -124,43 +128,72 @@ void Task_refreshRegister(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkSolarOpenCircuitVoltage == ++checkFlagTemp2 || (opencheckFlag && ++checkFlagTemp2)) {
|
if (checkSolarOpenCircuitVoltage == ++checkFlagTemp2 || (opencheckFlag && ++checkFlagTemp2)) {
|
||||||
if (!opencheckFlag) {
|
|
||||||
Set_duty_ratio(0);
|
|
||||||
|
|
||||||
|
// printf("in checkSolarOpenCircuitVoltage \n");
|
||||||
|
|
||||||
|
if (!opencheckFlag) {
|
||||||
|
TIM_SetCompare4(TIM4, 0);
|
||||||
opencheckFlag = 1;
|
opencheckFlag = 1;
|
||||||
checkFlagTemp2 = 0;
|
checkFlagTemp2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
GPIO_WriteBit(G_FFMOS_CON1_GPIO, G_FFMOS_CON1_PIN, SET);
|
// GPIO_WriteBit(G_FFMOS_CON1_GPIO, G_FFMOS_CON1_PIN, SET);
|
||||||
GPIO_WriteBit(G_FFMOS_CON2_GPIO, G_FFMOS_CON2_PIN, SET);
|
// GPIO_WriteBit(G_FFMOS_CON2_GPIO, G_FFMOS_CON2_PIN, SET);
|
||||||
g_Mppt_Para.Solar_Open_Circuit_Voltage1 = get_PV1_VOLT_IN();
|
// g_Mppt_Para.Solar_Open_Circuit_Voltage1 = get_PV1_VOLT_IN();
|
||||||
g_Mppt_Para.Solar_Open_Circuit_Voltage2 = get_PV2_VOLT_IN();
|
// g_Mppt_Para.Solar_Open_Circuit_Voltage2 = get_PV2_VOLT_IN();
|
||||||
GPIO_WriteBit(G_FFMOS_CON1_GPIO, G_FFMOS_CON1_PIN, RESET);
|
// GPIO_WriteBit(G_FFMOS_CON1_GPIO, G_FFMOS_CON1_PIN, RESET);
|
||||||
GPIO_WriteBit(G_FFMOS_CON2_GPIO, G_FFMOS_CON2_PIN, RESET);
|
// GPIO_WriteBit(G_FFMOS_CON2_GPIO, G_FFMOS_CON2_PIN, RESET);
|
||||||
|
// opencheckFlag = 0;
|
||||||
|
//
|
||||||
|
// if ((g_Mppt_Para.Solar_Open_Circuit_Voltage1
|
||||||
|
// > g_slConfigInfo.startSolarOpenCircuitV)
|
||||||
|
// || (g_Mppt_Para.Solar_Open_Circuit_Voltage2
|
||||||
|
// > g_slConfigInfo.startSolarOpenCircuitV)) {
|
||||||
|
// TimeSliceOffset_Register(&m_mpptControl, Task_mpptControl
|
||||||
|
// , mpptControl_reloadVal, mpptControl_offset);
|
||||||
|
// mpptModeFlag = 0;
|
||||||
|
// Set_duty_ratio(&g_duty_ratio);
|
||||||
|
// } else {
|
||||||
|
// TimeSliceOffset_Unregister(&m_mpptControl);
|
||||||
|
// mpptModeFlag = 100;
|
||||||
|
// }
|
||||||
|
g_Mppt_Para.Solar_Open_Circuit_Voltage = (uint16_t)(get_PV1_VOLT_IN() * 100);
|
||||||
opencheckFlag = 0;
|
opencheckFlag = 0;
|
||||||
|
|
||||||
if ((g_Mppt_Para.Solar_Open_Circuit_Voltage1
|
// printf("in checkSolarOpenCircuitVoltage v: %d/100 \n", g_Mppt_Para.Solar_Open_Circuit_Voltage1);
|
||||||
> g_slConfigInfo.startSolarOpenCircuitV)
|
|
||||||
|| (g_Mppt_Para.Solar_Open_Circuit_Voltage2
|
if (g_Mppt_Para.Solar_Open_Circuit_Voltage
|
||||||
> g_slConfigInfo.startSolarOpenCircuitV)) {
|
> g_slConfigInfo.startSolarOpenCircuitV) {
|
||||||
TimeSliceOffset_Register(&m_mpptControl, Task_mpptControl
|
// TimeSliceOffset_Register(&m_mpptControl, Task_mpptControl
|
||||||
, mpptControl_reloadVal, mpptControl_offset);
|
// , mpptControl_reloadVal, mpptControl_offset);
|
||||||
mpptModeFlag = 0;
|
mpptModeFlag = 0;
|
||||||
|
TIM_Cmd(TIM3, ENABLE);
|
||||||
Set_duty_ratio(&g_duty_ratio);
|
Set_duty_ratio(&g_duty_ratio);
|
||||||
} else {
|
} else {
|
||||||
TimeSliceOffset_Unregister(&m_mpptControl);
|
// TimeSliceOffset_Unregister(&m_mpptControl);
|
||||||
|
TIM_Cmd(TIM3, DISABLE);
|
||||||
|
TIM_SetCompare4(TIM4, 0);
|
||||||
mpptModeFlag = 100;
|
mpptModeFlag = 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if (mpptModeFlag != 100) {
|
||||||
|
// if (mpptmodedelay == ++mpptModeFlag) {
|
||||||
|
//// printf("vout : %d /100", g_Mppt_Para.Battery_Voltage);
|
||||||
|
// MpptMode();
|
||||||
|
// mpptModeFlag = 0;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
if (mpptModeFlag != 100) {
|
if (mpptModeFlag != 100) {
|
||||||
if (mpptmodedelay == ++mpptModeFlag) {
|
// printf("vout : %d /100", g_Mppt_Para.Battery_Voltage);
|
||||||
MpptMode();
|
MpptMode();
|
||||||
mpptModeFlag = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// MpptMode();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,12 +297,12 @@ void Task_recvbroadcast(void)
|
||||||
STR_TimeSliceOffset m_EnPowerSupply;
|
STR_TimeSliceOffset m_EnPowerSupply;
|
||||||
void Task_EnPowerSupply(void)
|
void Task_EnPowerSupply(void)
|
||||||
{
|
{
|
||||||
if (get_PV_VOLT_IN1() > 17 - 0.4) {
|
if (get_PV_VOLT_IN1() > 16.0) {
|
||||||
GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, SET);
|
|
||||||
return;
|
|
||||||
} else if (get_PV_VOLT_IN1() < 14 - 0.4) {
|
|
||||||
GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, RESET);
|
GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, RESET);
|
||||||
return;
|
return;
|
||||||
|
} else if (get_PV_VOLT_IN1() < 14.5) {
|
||||||
|
GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, SET);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -294,8 +327,8 @@ void g_Mppt_Para_Init(void)
|
||||||
g_Mppt_Para.Battery_Voltage = 0;
|
g_Mppt_Para.Battery_Voltage = 0;
|
||||||
g_Mppt_Para.Battery_temperature = 0;
|
g_Mppt_Para.Battery_temperature = 0;
|
||||||
g_Mppt_Para.Remaining_Battery_Bower = 0;
|
g_Mppt_Para.Remaining_Battery_Bower = 0;
|
||||||
g_Mppt_Para.Solar_Open_Circuit_Voltage1 = 0;
|
g_Mppt_Para.Solar_Open_Circuit_Voltage = 0;
|
||||||
g_Mppt_Para.Solar_Open_Circuit_Voltage2 = 0;
|
// g_Mppt_Para.Solar_Open_Circuit_Voltage2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -305,25 +338,26 @@ void g_Mppt_Para_Init(void)
|
||||||
*/
|
*/
|
||||||
void task_Init(void)
|
void task_Init(void)
|
||||||
{
|
{
|
||||||
read_config_info();
|
// read_config_info();
|
||||||
g_Mppt_Para_Init();
|
g_Mppt_Para_Init();
|
||||||
|
|
||||||
|
|
||||||
TimeSliceOffset_Register(&m_runled, Task_RunLED, runled_reloadVal, runled_offset);
|
TimeSliceOffset_Register(&m_runled, Task_RunLED, runled_reloadVal, runled_offset);
|
||||||
|
|
||||||
// m_refreshRegister.runFlag = 1; /* 该启动后立即执行一次 */
|
// m_refreshRegister.runFlag = 1; /* 该启动后立即执行一次 */
|
||||||
// TimeSliceOffset_Register(&m_refreshRegister, Task_refreshRegister
|
TimeSliceOffset_Register(&m_refreshRegister, Task_refreshRegister
|
||||||
// , refreshRegister_reloadVal, refreshRegister_offset);
|
, refreshRegister_reloadVal, refreshRegister_offset);
|
||||||
|
|
||||||
// TimeSliceOffset_Register(&m_mpptControl, Task_mpptControl
|
// TimeSliceOffset_Register(&m_mpptControl, Task_mpptControl
|
||||||
// , mpptControl_reloadVal, mpptControl_offset);
|
// , mpptControl_reloadVal, mpptControl_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_wdi, Task_wdi, wdi_reloadVal, wdi_offset);
|
||||||
|
|
||||||
|
TimeSliceOffset_Register(&m_EnPowerSupply, Task_EnPowerSupply
|
||||||
|
, EnPowerSupply_reloadVal, EnPowerSupply_offset);
|
||||||
|
|
||||||
// TimeSliceOffset_Register(&m_EnPowerSupply, Task_EnPowerSupply
|
|
||||||
// , EnPowerSupply_reloadVal, EnPowerSupply_offset);
|
|
||||||
|
|
||||||
TimeSliceOffset_Start(); /* 启动时间片轮询 */
|
TimeSliceOffset_Start(); /* 启动时间片轮询 */
|
||||||
}
|
}
|
||||||
|
@ -336,7 +370,7 @@ void task_Init(void)
|
||||||
*/
|
*/
|
||||||
void hardware_Init(void)
|
void hardware_Init(void)
|
||||||
{
|
{
|
||||||
TIM3_Init();
|
Systick_Init();
|
||||||
TIM2_Init();
|
TIM2_Init();
|
||||||
uart_dev_init();
|
uart_dev_init();
|
||||||
PWM_TIM_Configuration();
|
PWM_TIM_Configuration();
|
||||||
|
@ -353,10 +387,13 @@ void hardware_Init(void)
|
||||||
|
|
||||||
// GPIO_WriteBit(POW_OUT_CON_GPIO, POW_OUT_CON_PIN, SET);
|
// GPIO_WriteBit(POW_OUT_CON_GPIO, POW_OUT_CON_PIN, SET);
|
||||||
// TIM_SetCompare4(TIM4, 5000);
|
// TIM_SetCompare4(TIM4, 5000);
|
||||||
|
GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, RESET);
|
||||||
Set_duty_ratio(&g_duty_ratio);
|
Set_duty_ratio(&g_duty_ratio);
|
||||||
// Set_duty_ratio(0);
|
// Set_duty_ratio(0);
|
||||||
// Delay_Ms(100);
|
// Delay_Ms(100);
|
||||||
// TIM_SetCompare2(TIM4, 50);
|
// TIM_SetCompare2(TIM4, 50);
|
||||||
|
|
||||||
|
// TIM1_Init(20);
|
||||||
|
TIM3_Init(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ void DSG_PROT_Init(void);
|
||||||
/* ¸ø±Ãµç·µçÈݳäµç */
|
/* ¸ø±Ãµç·µçÈݳäµç */
|
||||||
/* EnPowerSupply --> PB7 */
|
/* EnPowerSupply --> PB7 */
|
||||||
#define EnPowerSupply_GPIO GPIOB
|
#define EnPowerSupply_GPIO GPIOB
|
||||||
#define EnPowerSupply_PIN GPIO_Pin_7
|
#define EnPowerSupply_PIN GPIO_Pin_3
|
||||||
void EnPowerSupply_Init(void);
|
void EnPowerSupply_Init(void);
|
||||||
|
|
||||||
#endif /* HARDWARE_INC_GPIO_H_ */
|
#endif /* HARDWARE_INC_GPIO_H_ */
|
||||||
|
|
|
@ -14,11 +14,16 @@
|
||||||
|
|
||||||
extern uint8_t run_Broadcast;
|
extern uint8_t run_Broadcast;
|
||||||
|
|
||||||
void TIM3_Init(void);
|
void TIM3_Init(uint16_t delay_ms);
|
||||||
void TIM3_Int_Init(uint16_t arr,uint16_t psc);
|
void TIM3_Int_Init(uint16_t arr,uint16_t psc);
|
||||||
|
|
||||||
void TIM2_Init(void);
|
void TIM2_Init(void);
|
||||||
void TIM2_Int_Init(uint16_t arr,uint16_t psc);
|
void TIM2_Int_Init(uint16_t arr,uint16_t psc);
|
||||||
|
|
||||||
|
void Systick_Init(void);
|
||||||
|
|
||||||
|
|
||||||
|
void TIM1_Init(uint16_t delay_ms);
|
||||||
|
void TIM1_Int_Init(uint16_t arr,uint16_t psc);
|
||||||
|
|
||||||
#endif /* HARDWARE_INC_TIM_H_ */
|
#endif /* HARDWARE_INC_TIM_H_ */
|
||||||
|
|
|
@ -63,6 +63,8 @@ void POW_OUT_CON_Init(void)
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
|
||||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
GPIO_Init(POW_OUT_CON_GPIO, &GPIO_InitStructure);
|
GPIO_Init(POW_OUT_CON_GPIO, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
GPIO_WriteBit(POW_OUT_CON_GPIO, POW_OUT_CON_PIN, SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EXTI2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
void EXTI2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||||
|
@ -110,7 +112,7 @@ void EnPowerSupply_Init(void)
|
||||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
GPIO_Init(EnPowerSupply_GPIO, &GPIO_InitStructure);
|
GPIO_Init(EnPowerSupply_GPIO, &GPIO_InitStructure);
|
||||||
|
|
||||||
GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, RESET);
|
GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,12 +57,12 @@ void PWM_TIM_Configuration(void)
|
||||||
|
|
||||||
void Set_duty_ratio(float *duty_ratio)
|
void Set_duty_ratio(float *duty_ratio)
|
||||||
{
|
{
|
||||||
if (*duty_ratio < 0.4) {
|
if (*duty_ratio < 0.5) {
|
||||||
*duty_ratio = 0.4;
|
*duty_ratio = 0.5;
|
||||||
return;
|
// return;
|
||||||
} else if (*duty_ratio > 0.9) {
|
} else if (*duty_ratio > 0.9) {
|
||||||
*duty_ratio = 0.9;
|
*duty_ratio = 0.9;
|
||||||
return;
|
// return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t pulse = *duty_ratio * (Period + 1);
|
uint16_t pulse = *duty_ratio * (Period + 1);
|
||||||
|
|
|
@ -8,9 +8,7 @@
|
||||||
#include "tim.h"
|
#include "tim.h"
|
||||||
#include "timeSliceOffset.h"
|
#include "timeSliceOffset.h"
|
||||||
#include "pwm.h"
|
#include "pwm.h"
|
||||||
|
#include "mppt_control.h"
|
||||||
/* 时间基准为1ms,1ms切换一次任务 */
|
|
||||||
#define delayms 1
|
|
||||||
|
|
||||||
/* 延时时间 */
|
/* 延时时间 */
|
||||||
#define delays 20
|
#define delays 20
|
||||||
|
@ -20,13 +18,18 @@ uint8_t run_Broadcast = 1;
|
||||||
|
|
||||||
void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||||
void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||||
|
void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||||
|
|
||||||
void TIM3_Init(void)
|
void TIM1_UP_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void TIM3_Init(uint16_t delay_ms)
|
||||||
{
|
{
|
||||||
/* 分频系数 */
|
/* 分频系数 */
|
||||||
uint16_t psc = (SystemCoreClock / 10000) - 1;
|
uint16_t psc = (SystemCoreClock / 10000) - 1;
|
||||||
/* 分频系数 */
|
/* 分频系数 */
|
||||||
uint16_t arr = delayms * 10 - 1;
|
uint16_t arr = delay_ms * 10 - 1;
|
||||||
|
|
||||||
TIM3_Int_Init(arr, psc);
|
TIM3_Int_Init(arr, psc);
|
||||||
}
|
}
|
||||||
|
@ -49,11 +52,11 @@ void TIM3_Int_Init(uint16_t arr, uint16_t psc)
|
||||||
//初始化TIM NVIC,设置中断优先级分组
|
//初始化TIM NVIC,设置中断优先级分组
|
||||||
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
|
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
|
||||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0
|
||||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //设置响应优先级3
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //设置响应优先级3
|
||||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道1中断
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道1中断
|
||||||
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
|
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
|
||||||
|
|
||||||
TIM_Cmd(TIM3, ENABLE); //TIM3使能
|
// TIM_Cmd(TIM3, ENABLE); //TIM3使能
|
||||||
}
|
}
|
||||||
|
|
||||||
void TIM3_IRQHandler(void)
|
void TIM3_IRQHandler(void)
|
||||||
|
@ -63,7 +66,7 @@ void TIM3_IRQHandler(void)
|
||||||
// static int flag1 = 0;
|
// static int flag1 = 0;
|
||||||
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { //检查TIM3中断是否发生。
|
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { //检查TIM3中断是否发生。
|
||||||
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIM3的中断挂起位。
|
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIM3的中断挂起位。
|
||||||
TimeSliceOffset_Produce();
|
test();
|
||||||
// flag1++;
|
// flag1++;
|
||||||
// if (flag1 == 20) {
|
// if (flag1 == 20) {
|
||||||
// if (flag) {
|
// if (flag) {
|
||||||
|
@ -129,3 +132,70 @@ void TIM2_IRQHandler(void)
|
||||||
run_Broadcast = 1;
|
run_Broadcast = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//SysTick初始化配置 1MS进入一次中断
|
||||||
|
static void SysTick_Config(uint32_t ticks)
|
||||||
|
{
|
||||||
|
SysTick->SR = 0;
|
||||||
|
SysTick->CNT = 0;
|
||||||
|
SysTick->CMP = ticks;
|
||||||
|
SysTick->CTLR =0xF;
|
||||||
|
|
||||||
|
NVIC_SetPriority(SysTicK_IRQn, 15);
|
||||||
|
NVIC_EnableIRQ(SysTicK_IRQn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Systick_Init(void)
|
||||||
|
{
|
||||||
|
SysTick_Config((SystemCoreClock / 1000) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SysTick_Handler(void)
|
||||||
|
{
|
||||||
|
SysTick->SR = 0;
|
||||||
|
TimeSliceOffset_Produce();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIM1_Init(uint16_t delay_ms)
|
||||||
|
{
|
||||||
|
/* 分频系数 */
|
||||||
|
uint16_t psc = (SystemCoreClock / 10000) - 1;
|
||||||
|
/* */
|
||||||
|
uint16_t arr = delay_ms * 10 - 1;
|
||||||
|
// uint16_t arr = 10 - 1;
|
||||||
|
|
||||||
|
TIM1_Int_Init(arr, psc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIM1_Int_Init(uint16_t arr, uint16_t psc)
|
||||||
|
{
|
||||||
|
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
||||||
|
NVIC_InitTypeDef NVIC_InitStructure;
|
||||||
|
|
||||||
|
RCC_PB2PeriphClockCmd(RCC_PB2Periph_TIM1, ENABLE); //使能TIM1时钟
|
||||||
|
|
||||||
|
TIM_TimeBaseStructure.TIM_Period = arr; //指定下次更新事件时要加载到活动自动重新加载寄存器中的周期值。
|
||||||
|
TIM_TimeBaseStructure.TIM_Prescaler = psc; //指定用于划分TIM时钟的预分频器值。
|
||||||
|
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频因子
|
||||||
|
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM计数模式,向上计数模式
|
||||||
|
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
|
||||||
|
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //使能TIM1中断,允许更新中断
|
||||||
|
|
||||||
|
//初始化TIM NVIC,设置中断优先级分组
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1中断
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //设置响应优先级3
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道中断
|
||||||
|
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
|
||||||
|
|
||||||
|
TIM_Cmd(TIM1, ENABLE); //TIM1使能
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIM1_UP_IRQHandler(void)
|
||||||
|
{
|
||||||
|
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { //检查TIM1中断是否发生。
|
||||||
|
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除TIM1的中断挂起位。
|
||||||
|
printf("in tim1 irq \n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -29,7 +29,8 @@ Hardware/src/tim.o: ../Hardware/src/tim.c \
|
||||||
D:\psx\MPPT\git\Drivers\TimeSliceOffset/timeSliceOffset.h \
|
D:\psx\MPPT\git\Drivers\TimeSliceOffset/timeSliceOffset.h \
|
||||||
D:\psx\MPPT\git\App\inc/uart_dev.h \
|
D:\psx\MPPT\git\App\inc/uart_dev.h \
|
||||||
D:\psx\MPPT\git\Drivers\RingQueue/ring_queue.h \
|
D:\psx\MPPT\git\Drivers\RingQueue/ring_queue.h \
|
||||||
D:\psx\MPPT\git\Hardware\inc/rs485.h D:\psx\MPPT\git\Hardware\inc/pwm.h
|
D:\psx\MPPT\git\Hardware\inc/rs485.h D:\psx\MPPT\git\Hardware\inc/pwm.h \
|
||||||
|
D:\psx\MPPT\git\App\inc/mppt_control.h
|
||||||
|
|
||||||
D:\psx\MPPT\git\Hardware\inc/tim.h:
|
D:\psx\MPPT\git\Hardware\inc/tim.h:
|
||||||
|
|
||||||
|
@ -98,3 +99,5 @@ D:\psx\MPPT\git\Drivers\RingQueue/ring_queue.h:
|
||||||
D:\psx\MPPT\git\Hardware\inc/rs485.h:
|
D:\psx\MPPT\git\Hardware\inc/rs485.h:
|
||||||
|
|
||||||
D:\psx\MPPT\git\Hardware\inc/pwm.h:
|
D:\psx\MPPT\git\Hardware\inc/pwm.h:
|
||||||
|
|
||||||
|
D:\psx\MPPT\git\App\inc/mppt_control.h:
|
||||||
|
|
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
16343
obj/mppt_Nos_V0.4.lst
16343
obj/mppt_Nos_V0.4.lst
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue