update ARDUINO_MPPT_FIRMWARE_V2.1/4_Charging_Algorithm.ino.

更改算法说明
pull/1/head
慕炎 2022-08-11 02:48:19 +00:00 committed by Gitee
parent 7c2310acc7
commit 858d911e06
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
1 changed files with 35 additions and 19 deletions

View File

@ -11,7 +11,7 @@ void buck_Disable(){
}
void predictivePWM(){ //预测PWM 算法
if(voltageInput<=0){PPWM=0;} ///当电压输入为零时防止不确定答案
else if(voltageOutput>voltageBatteryMax){PPWM =(PPWM_margin*pwmMax*voltageBatteryMax)/(100.00*voltageInput)*0.98;} //计算预测 PWM Floor 并存储在变量中
else if(voltageOutput>voltageBatteryMax){PPWM =(PPWM_margin*pwmMax*voltageBatteryMax)/(100.00*voltageInput)*0.98;} //输出电压过大则以电池最大电压为计算基准,防止错误重启充电 20220707
else{PPWM =(PPWM_margin*pwmMax*voltageOutput)/(100.00*voltageInput);} //计算预测 PWM Floor 并存储在变量中
PPWM = constrain(PPWM,0,pwmMaxLimited);
}
@ -32,8 +32,10 @@ void Charging_Algorithm(){
if(REC==1){ // IUV RECOVERY - (仅对充电模式有效)
REC=0; //重置 IUV 恢复布尔标识符
buck_Disable(); //在 PPWM 初始化之前禁用降压
lcd.setCursor(0,0);lcd.print("POWER SOURCE "); //显示液晶信息
lcd.setCursor(0,1);lcd.print("DETECTED "); //显示液晶信息
//lcd.setCursor(0,0);lcd.print("POWER SOURCE "); //显示液晶信息
//lcd.setCursor(0,1);lcd.print("DETECTED "); //显示液晶信息
//tft.fillScreen(TFT_BLACK);
tft.drawString("POWER SOURCE DETECTED", 10, 40, 3);
Serial.println("> Solar Panel Detected"); //显示串口信息
Serial.print("> Computing For Predictive PWM "); //显示串口信息
for(int i = 0; i<40; i++){Serial.print(".");delay(30);} //For loop "loading... 效果
@ -41,30 +43,44 @@ void Charging_Algorithm(){
Read_Sensors();
predictivePWM();
PWM = PPWM;
lcd.clear();
//lcd.clear();
}
else{ //NO ERROR PRESENT - 继续电源转换
/////////////////////// CC-CV BUCK PSU ALGORITHM //////////////////////////////
/*
PSUcc-cvpwm
*/
if(MPPT_Mode==0){ // CC-CV PSU 模式
if(currentOutput>currentCharging) {PWM--;} //电流高于 → 降低占空比
if(PSUcurrentMax>=currentCharging || PSUcurrentMax==0.0000 || currentOutput<0.02){PSUcurrentMax = currentCharging;} //初始化psu输入最大电流
if(currentOutput>currentCharging) {PWM--;} //电流高于限定值 → 降低占空比
//psu模式和psu充电模式还是要区别一下充电模式为了充电可以榨干输入源psu模式则并不一定需要所以暂时关闭此判断 20220811
//if(currentOutput>PSUcurrentMax) {PWM--;} //电流高于外部最大值 → 降低占空比
else if(voltageOutput>voltageBatteryMax){PWM--;} //电压高于 → 降低占空比
else if(voltageInput<voltageInputMax-1){PWM--;PSUcurrentMax=PSUcurrentMax-0.02;} //当带载输入电压与空载电压相差1v降低占空比及降低额定电流以保证能获得外部电源最大电流20220806
else if(voltageOutput<voltageBatteryMax){PWM++;} //当输出低于充电电压时增加占空比(仅用于 CC-CV 模式)
else{} //当达到设定的输出电压时什么都不做
PWM_Modulation(); //将 PWM 信号设置为 Buck PWM GPIO
voltageInputPrev = voltageInput; // 存储先前记录的电压
}
/////////////////////// MPPT & CC-CV 充电算法 ///////////////////////
/////////////////////// MPPT & CC-CV 充电算法 /////////////////////// mppt模式只要防止电压拉低到电池电压保护再进行重启的多余动作
else{
if(currentOutput>currentCharging){PWM--;} //电流高于 → 降低占空比
else if(voltageOutput>voltageBatteryMax){PWM--;} //电压高于 → 降低占空比
else{ //MPPT 算法
if(powerInput>powerInputPrev && voltageInput>voltageInputPrev) {PWM--;} // ↑P ↑V ; →MPP //D--
else if(powerInput>powerInputPrev && voltageInput<voltageInputPrev){PWM++;} // ↑P ↓V ; MPP← //D++
else if(powerInput<powerInputPrev && voltageInput>voltageInputPrev){PWM++;} // ↓P ↑V ; MPP→ //D++
else if(powerInput<powerInputPrev && voltageInput<voltageInputPrev){PWM--;} // ↓P ↓V ; ←MPP //D--
else if(voltageOutput>voltageBatteryMax) {PWM--;} // MP MV ; 达到 MPP
else if(voltageOutput<voltageBatteryMax) {PWM++;} // MP MV ; 达到 MPP
if(currentOutput>currentCharging){PWM--;} //电流高于 → 降低占空比
else if(voltageOutput>voltageBatteryMax){PWM--;} //电压高于 → 降低占空比
else{ //MPPT 算法
if( voltageInput>=(voltageBatteryMax+voltageDropout+1) && voltageInput>=(voltageOutput+voltageDropout+1)){ //输入大于电池最大电压设定及当前电池电压的条件下进行pwm处理否则抬高电压阻止过分拉低电压 20220803
if(powerInput>powerInputPrev && voltageInput>voltageInputPrev) {PWM--;} // ↑P ↑V ; →MPP //D-- 功率上升且电压上升,继续 抬高电压
else if(powerInput>powerInputPrev && voltageInput<voltageInputPrev){PWM++;} // ↑P ↓V ; MPP← //D++ 功率上升且电压降低,继续 拉低电压
else if(powerInput<powerInputPrev && voltageInput>voltageInputPrev){PWM++;} // ↓P ↑V ; MPP→ //D++ 功率下降,电压上升,尝试 拉低电压
else if(powerInput<powerInputPrev && voltageInput<voltageInputPrev){PWM--;} // ↓P ↓V ; ←MPP //D-- 功率下降,电压下降,尝试 抬高电压
else if(voltageOutput>voltageBatteryMax) {PWM--;} // MP MV ; 达到 MPP
else if(voltageOutput<voltageBatteryMax) {PWM++;} // MP MV ; 达到 MPP
}else{
PWM--;
}
powerInputPrev = powerInput; // 存储以前记录的功率
voltageInputPrev = voltageInput; //存储先前记录的电压
voltageInputPrev = voltageInput; // 存储先前记录的电压
}
PWM_Modulation(); //将 PWM 信号设置为 Buck PWM GPIO
}