#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))
// 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){
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");
new_set_value(12*16);
+ // the main loop
while (1) {
int n = usb_serial_getchar();