|
|
|
|
@ -82,15 +82,15 @@ void set_heater_power(int percent) {
|
|
|
|
|
/**
|
|
|
|
|
* heater power calc
|
|
|
|
|
*/
|
|
|
|
|
int calc_hp(float t_t, float t_c, float error, int p_b, float pid_p, float pid_i) {
|
|
|
|
|
int p = p_b + pid_p * (t_t - t_c) + pid_i * error;
|
|
|
|
|
if (p > 100) {
|
|
|
|
|
int calc_hp(float t_t, float t_c, float Error_calc, int p_hb, float pid_hp, float pid_hi) {
|
|
|
|
|
int p_h = p_hb + pid_hp * (t_t - t_c) + pid_hi * Error_calc;
|
|
|
|
|
if (p_h > 100) {
|
|
|
|
|
return 100;
|
|
|
|
|
}
|
|
|
|
|
if (p < 0) {
|
|
|
|
|
if (p_h < 0) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return p;
|
|
|
|
|
return p_h;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -124,13 +124,14 @@ int calc_compressor_speed(int percent, int v_min, int v_max) {
|
|
|
|
|
void PID_Calc() // pid calc
|
|
|
|
|
{
|
|
|
|
|
float Kp = 19.2;
|
|
|
|
|
float Ki = 0.02;
|
|
|
|
|
int p_base = 52;
|
|
|
|
|
float Ki = 0.08;
|
|
|
|
|
int p_hb = 52;
|
|
|
|
|
float DelEk; // The difference between the last two deviations
|
|
|
|
|
// float td;
|
|
|
|
|
float out;
|
|
|
|
|
// if (pid.C1ms < (pid.t)) // The calculation cycle has not yet arrived
|
|
|
|
|
// {
|
|
|
|
|
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
@ -139,9 +140,16 @@ void PID_Calc() // pid calc
|
|
|
|
|
|
|
|
|
|
pid.SEk += pid.Ek; // Total historical deviation
|
|
|
|
|
|
|
|
|
|
// SEk limit
|
|
|
|
|
if (pid.SEk < - p_base / Ki) {
|
|
|
|
|
pid.SEk = - p_base / Ki;
|
|
|
|
|
// SEk limit, updated func
|
|
|
|
|
float delta_t = pid.set_tem - pid.now_tem;
|
|
|
|
|
float pid_hp = Kp;
|
|
|
|
|
float pid_hi = Ki;
|
|
|
|
|
if (pid.SEk < - p_hb / pid_hi) {
|
|
|
|
|
pid.SEk = - p_hb / pid_hi;
|
|
|
|
|
}
|
|
|
|
|
float Error_calc = pid.SEk;
|
|
|
|
|
if (Error_calc < - (p_hb + pid_hp * delta_t) / pid_hi) {
|
|
|
|
|
Error_calc = - (p_hb + pid_hp * delta_t) / pid_hi;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -179,7 +187,7 @@ void PID_Calc() // pid calc
|
|
|
|
|
pid.C1ms = 0;
|
|
|
|
|
|
|
|
|
|
// heater percent
|
|
|
|
|
int heater_percent = calc_hp(pid.set_tem, pid.now_tem, pid.SEk, p_base, Kp, Ki);
|
|
|
|
|
int heater_percent = calc_hp(pid.set_tem, pid.now_tem, Error_calc, p_hb, pid_hp, pid_hi);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int p_c = calc_cp(pid.set_tem, pid.now_tem, 32, Kp);
|
|
|
|
|
|