]> jspc29.x-matter.uni-frankfurt.de Git - avr.git/commitdiff
adapted PID constants to new CPU cooler and fixed the PID overflow bug
authorMichael Wiebusch <m.wiebusch@gsi.de>
Thu, 16 Apr 2015 13:02:52 +0000 (15:02 +0200)
committerMichael Wiebusch <m.wiebusch@gsi.de>
Thu, 16 Apr 2015 13:02:52 +0000 (15:02 +0200)
atmega32u4/cooler/cooler.c

index 635f52e8015469e165f0a79a20835730f19a3a60..72f47707f97e3c871b15a9e10a6602d8e8eb9b4b 100644 (file)
@@ -3,7 +3,7 @@
 #include "main.h"
 
 #define SET_VAL_UPPER  30*16 //upper limit to set value
-#define SET_VAL_LOWER -10*16 //lower limit to set value
+#define SET_VAL_LOWER -20*16 //lower limit to set value
 
 #define MAX(x,y)               (((x) > (y)) ? (x) : (y))
 #define MIN(x,y)               (((x) < (y)) ? (x) : (y)) 
@@ -349,37 +349,39 @@ void new_set_value(int16_t value){
 // all constants in x/10
 #define PID_CONST_PROP         800
 #define PID_CONST_INT          15
-#define PID_CONST_DIFF         0
+#define PID_CONST_DIFF         1600
 #define PID_ACTOR_OUTPUT_LIMIT 1023
 #define PID_INTEGRAL_LIMIT     600
 #define PID_FINE_INTERVAL      2*16 // within 2 degrees
 
 uint16_t pid_calculation(int16_t error) {
-  static int16_t intg_error     = 0;
+  static int16_t intg_error   = 0;
   static int16_t last_error   = 0;
-  int16_t diff_error = error-last_error;
+  int16_t        diff_error   = error-last_error;
   
-  if( abs(error)<PID_FINE_INTERVAL ) { // use integral only inside a fine interval
+  if( abs(error)<PID_FINE_INTERVAL ) { // use integral/differential only inside a fine interval
     intg_error += error;
-    intg_error = MAX(-PID_INTEGRAL_LIMIT,intg_error);
-    intg_error = MIN(PID_INTEGRAL_LIMIT,intg_error);
-  } 
-  
-  int32_t actor = 
-      ((intg_error * PID_CONST_INT )/10)
-    + ((diff_error * PID_CONST_DIFF)/10)
-    + ((error      * PID_CONST_PROP)/10);
+    intg_error  = MAX(-PID_INTEGRAL_LIMIT,intg_error);
+    intg_error  = MIN( PID_INTEGRAL_LIMIT,intg_error);
+  } else {
+    diff_error  = 0;
+  }
+  
+  int32_t actuator = 
+      (( ((int32_t) intg_error) * PID_CONST_INT )/10)
+    + (( ((int32_t) diff_error) * PID_CONST_DIFF)/10)
+    + (( ((int32_t) error     ) * PID_CONST_PROP)/10);
   // allow only positive values;
-  actor = MAX(0,actor);
+  actuator = MAX(0,actuator);
   // output is limited
-  actor = MIN(PID_ACTOR_OUTPUT_LIMIT,actor);
+  actuator = MIN(PID_ACTOR_OUTPUT_LIMIT,actuator);
   last_error = error;
   
 //   //for debug
 //   uart_puts("integral: ");
 //   uart_print_signed_number(intg_error,6);
 //   uart_puts("\n\r");
-  return actor;
+  return actuator;
 }
 
 void showPower(void){
@@ -401,28 +403,28 @@ void showPower(void){
 
 
 void uartReport(void){
-  uart_puts("Setpoint: ");
+  uart_puts("Setpoint:     ");
   uart_print_sign(set_value);
   uart_print_number(abs(set_value)/16,2);
   usb_serial_putchar('.');
   usb_serial_putchar('0'+lut[abs(set_value)%16]); // print post comma
   uart_puts(" deg C\n\r");
   
-  uart_puts("Temperature: ");
+  uart_puts("Temperature:  ");
   uart_print_sign(temps[MAINSENSOR]);
   uart_print_number(abs(temps[MAINSENSOR])/16,2);
   usb_serial_putchar('.');
   usb_serial_putchar('0'+lut[abs(temps[MAINSENSOR])%16]); // print post comma
   uart_puts(" deg C\n\r");
 
-  uart_puts("2nd temp:    ");
+  uart_puts("2nd temp:     ");
   uart_print_sign(temps[SUPPSENSOR]);
   uart_print_number(abs(temps[SUPPSENSOR])/16,2);
   usb_serial_putchar('.');
   usb_serial_putchar('0'+lut[abs(temps[SUPPSENSOR])%16]); // print post comma
   uart_puts(" deg C\n\r");
 
-  uart_puts("PWM Output: ");
+  uart_puts("PWM Output:   ");
   uart_print_number(output_power_percent,3);
   uart_puts("%\n\r");
   
@@ -456,6 +458,7 @@ __attribute__((naked)) int main(void) {
   new_set_value(12*16);
   
   
+  // the main loop
   
   while (1) {    
     int n = usb_serial_getchar();