Browse Source

Isolate current/target temperature in pid_heater/bed functions

Yuri D'Elia 2 năm trước cách đây
mục cha
commit
65cf8e541a
1 tập tin đã thay đổi với 24 bổ sung23 xóa
  1. 24 23
      Firmware/temperature.cpp

+ 24 - 23
Firmware/temperature.cpp

@@ -417,6 +417,7 @@ void __attribute__((noinline)) PID_autotune(float temp, int extruder, int ncycle
 
 void updatePID()
 {
+  // TODO: iState_sum_max and PID values should be synchronized for temp_mgr_isr
 #ifdef PIDTEMP
   for(uint_least8_t e = 0; e < EXTRUDERS; e++) {
      iState_sum_max[e] = PID_INTEGRAL_DRIVE_MAX / cs.Ki;  
@@ -1876,24 +1877,24 @@ void temp_mgr_init()
 	CRITICAL_SECTION_END;
 }
 
-static void pid_heater(uint8_t e)
+static void pid_heater(uint8_t e, const float current, const int target)
 {
     float pid_input;
     float pid_output;
 
 #ifdef TEMP_RUNAWAY_EXTRUDER_HYSTERESIS
-    temp_runaway_check(e+1, target_temperature[e], current_temperature[e], (int)soft_pwm[e], false);
+    temp_runaway_check(e+1, target, current, (int)soft_pwm[e], false);
 #endif
 
 #ifdef PIDTEMP
-    pid_input = current_temperature[e];
+    pid_input = current;
 
 #ifndef PID_OPENLOOP
-    if(target_temperature[e] == 0) {
+    if(target == 0) {
         pid_output = 0;
         pid_reset[e] = true;
     } else {
-        pid_error[e] = target_temperature[e] - pid_input;
+        pid_error[e] = target - pid_input;
         if(pid_reset[e]) {
             iState_sum[e] = 0.0;
             dTerm[e] = 0.0;                       // 'dState_last[e]' initial setting is not necessary (see end of if-statement)
@@ -1926,7 +1927,7 @@ static void pid_heater(uint8_t e)
     }
     dState_last[e] = pid_input;
 #else //PID_OPENLOOP
-    pid_output = constrain(target_temperature[e], 0, PID_MAX);
+    pid_output = constrain(target[e], 0, PID_MAX);
 #endif //PID_OPENLOOP
 
 #ifdef PID_DEBUG
@@ -1947,25 +1948,25 @@ static void pid_heater(uint8_t e)
 
 #else /* PID off */
     pid_output = 0;
-    if(current_temperature[e] < target_temperature[e]) {
+    if(current[e] < target[e]) {
         pid_output = PID_MAX;
     }
 #endif
 
     // Check if temperature is within the correct range
-    if((current_temperature[e] < maxttemp[e]) && (target_temperature[e] != 0))
+    if((current < maxttemp[e]) && (target != 0))
         soft_pwm[e] = (int)pid_output >> 1;
     else
         soft_pwm[e] = 0;
 }
 
-static void pid_bed()
+static void pid_bed(const float current, const int target)
 {
     float pid_input;
     float pid_output;
 
 #ifdef TEMP_RUNAWAY_BED_HYSTERESIS
-    temp_runaway_check(0, target_temperature_bed, current_temperature_bed, (int)soft_pwm_bed, true);
+    temp_runaway_check(0, target, current, (int)soft_pwm_bed, true);
 #endif
 
 #ifndef PIDTEMPBED
@@ -1977,10 +1978,10 @@ static void pid_bed()
 #if TEMP_SENSOR_BED != 0
 
 #ifdef PIDTEMPBED
-    pid_input = current_temperature_bed;
+    pid_input = current;
 
 #ifndef PID_OPENLOOP
-    pid_error_bed = target_temperature_bed - pid_input;
+    pid_error_bed = target - pid_input;
     pTerm_bed = cs.bedKp * pid_error_bed;
     temp_iState_bed += pid_error_bed;
     temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed);
@@ -2001,10 +2002,10 @@ static void pid_bed()
     }
 
 #else
-    pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER);
+    pid_output = constrain(target, 0, MAX_BED_POWER);
 #endif //PID_OPENLOOP
 
-    if(current_temperature_bed < BED_MAXTEMP)
+    if(current < BED_MAXTEMP)
     {
         soft_pwm_bed = (int)pid_output >> 1;
         timer02_set_pwm0(soft_pwm_bed << 1);
@@ -2017,9 +2018,9 @@ static void pid_bed()
 
 #elif !defined(BED_LIMIT_SWITCHING)
     // Check if temperature is within the correct range
-    if(current_temperature_bed < BED_MAXTEMP)
+    if(current < BED_MAXTEMP)
     {
-        if(current_temperature_bed >= target_temperature_bed)
+        if(current >= target)
         {
             soft_pwm_bed = 0;
             timer02_set_pwm0(soft_pwm_bed << 1);
@@ -2038,14 +2039,14 @@ static void pid_bed()
     }
 #else //#ifdef BED_LIMIT_SWITCHING
     // Check if temperature is within the correct band
-    if(current_temperature_bed < BED_MAXTEMP)
+    if(current < BED_MAXTEMP)
     {
-        if(current_temperature_bed > target_temperature_bed + BED_HYSTERESIS)
+        if(current > target + BED_HYSTERESIS)
         {
             soft_pwm_bed = 0;
             timer02_set_pwm0(soft_pwm_bed << 1);
         }
-        else if(current_temperature_bed <= target_temperature_bed - BED_HYSTERESIS)
+        else if(current <= target - BED_HYSTERESIS)
         {
             soft_pwm_bed = MAX_BED_POWER>>1;
             timer02_set_pwm0(soft_pwm_bed << 1);
@@ -2059,7 +2060,7 @@ static void pid_bed()
     }
 #endif //BED_LIMIT_SWITCHING
 
-    if(target_temperature_bed==0)
+    if(target==0)
     {
         soft_pwm_bed = 0;
         timer02_set_pwm0(soft_pwm_bed << 1);
@@ -2073,13 +2074,13 @@ static void temp_mgr_isr()
     setTemperaturesFromRawValues();
 
     // TODO: this is now running inside an isr and cannot directly manipulate the lcd,
-    // this needs to disable temperatures and flag the error to be shown in manage_heaters!
+    // this needs to disable temperatures and flag the error to be shown in manage_heater!
     check_max_temp();
     check_min_temp();
 
     for(uint8_t e = 0; e < EXTRUDERS; e++)
-        pid_heater(e);
-    pid_bed();
+        pid_heater(e, current_temperature[e], target_temperature[e]);
+    pid_bed(current_temperature_bed, target_temperature_bed);
 }
 
 ISR(TIMER5_COMPA_vect)