From 021d746ab7cfdb97b6fcc92192dd5535cde81d0e Mon Sep 17 00:00:00 2001 From: Bernhard Tittelbach Date: Fri, 11 Oct 2013 16:10:29 +0000 Subject: bugfixes git-svn-id: https://svn.spreadspace.org/avr/trunk@241 aa12f405-d877-488e-9caf-2d797e2a1cc7 --- pcr-controller/pcr-controller.c | 19 ++++++++++++++++--- pcr-controller/pid_control.c | 30 +++++++++++++++++++----------- pcr-controller/pid_control.h | 9 ++++++--- 3 files changed, 41 insertions(+), 17 deletions(-) (limited to 'pcr-controller') diff --git a/pcr-controller/pcr-controller.c b/pcr-controller/pcr-controller.c index ac064e0..1aed20c 100644 --- a/pcr-controller/pcr-controller.c +++ b/pcr-controller/pcr-controller.c @@ -59,7 +59,8 @@ #define TOPHEAT_PIN PIND7 uint8_t num_temp_sensors_ = 0; -uint16_t raw_temp_ = 0; +int16_t raw_temp_ = 0; +uint8_t debug_ = 0; void queryAndSaveTemperature(uint8_t bit_resolution) { @@ -90,7 +91,10 @@ void queryAndSaveTemperature(uint8_t bit_resolution) void printRawTemp(int16_t raw_temp) { - printf("%d.%02d", raw_temp / 16, 100 * (raw_temp % 16) / 16); + int16_t decimals = 100 * (raw_temp % 16) / 16; + if (decimals < 0) + decimals *= -1; + printf("%d.%02d", raw_temp / 16, decimals); } void printTemperature(void) @@ -150,6 +154,8 @@ void setPeltierCoolingDirectionPower(int16_t value) PIN_HIGH(PORTB, PELTIER_INB); pwm_set((uint8_t) (-1 * value)); } + if (debug_) + printf("Peltier value: %d, INA: %d, INB: %d\r\n", value, (PORTF & _BV(PELTIER_INA)) > 0, (PORTB & _BV(PELTIER_INB)) > 0); } void handle_cmd(uint8_t cmd) @@ -161,6 +167,9 @@ void handle_cmd(uint8_t cmd) return; case 'R': case 'r': reset2bootloader(); break; + case '?': debug_ = ~debug_; break; + case '=': pid_setTargetValue(raw_temp_); break; + case '#': pid_setTargetValue(PID_DISABLED); break; case 's': printTemperature(); return; case 'L': led_toggle(); break; case 't': @@ -207,6 +216,7 @@ int main(void) PINMODE_OUTPUT(DDRD, TOPHEAT_PIN); pwm_init(); + pwm_set(0); pid_loadFromEEPROM(); @@ -232,7 +242,10 @@ int main(void) // that's bad, since the routing requires that it be called at exact intervalls // maybe we should use a interrupt routine - setPeltierCoolingDirectionPower(pid_calc(raw_temp_)); + if (pid_isEnabled()) + { + setPeltierCoolingDirectionPower(pid_calc(raw_temp_)); + } anyio_task(); } diff --git a/pcr-controller/pid_control.c b/pcr-controller/pid_control.c index ee1d4f6..4ab3a99 100644 --- a/pcr-controller/pid_control.c +++ b/pcr-controller/pid_control.c @@ -24,52 +24,60 @@ int32_t pid_i_ = 512; int32_t pid_d_ = 24576; int32_t pid_i_integralsum_ = 0; -int32_t pid_d_last_error_ = 0; +int32_t pid_last_input_ = 0; -uint16_t pid_target_value_ = 0; +int16_t pid_target_value_ = PID_DISABLED; void pid_setP(int16_t p) { - pid_p_ = (int32_t) p * PID_SCALE; + pid_p_ = (int32_t) p; pid_saveToEEPROM(); } void pid_setI(int16_t i) { - pid_i_ = (int32_t) i * PID_SCALE; + pid_i_ = (int32_t) i; pid_saveToEEPROM(); } void pid_setD(int16_t d) { - pid_d_ = (int32_t) d * PID_SCALE; + pid_d_ = (int32_t) d; pid_saveToEEPROM(); } void pid_printVars(void) { - printf("PID P: %d\r\nPID I: %d\r\nPID D: %d\r\n", (int16_t) (pid_p_ / PID_SCALE), (int16_t) (pid_i_ / PID_SCALE), (int16_t) (pid_d_ / PID_SCALE)); + printf("PID P: %d /%d\r\nPID I: %d /%d\r\nPID D: %d /%d\r\n", (int16_t) (pid_p_), (int16_t) PID_SCALE, (int16_t) (pid_i_), (int16_t) PID_SCALE, (int16_t) (pid_d_), (int16_t) PID_SCALE); } -void pid_setTargetValue(uint16_t v) +void pid_setTargetValue(int16_t v) { pid_target_value_ = v; } -uint16_t pid_getTargetValue(void) +int16_t pid_getTargetValue(void) { return pid_target_value_; } +int pid_isEnabled(void) +{ + return pid_target_value_ != PID_DISABLED; +} + // PRE-CONDITION: call pid_calc at exactly regular intervals !! -int16_t pid_calc(uint16_t current_value) +int16_t pid_calc(int16_t current_value) { + if (pid_target_value_ == PID_DISABLED) + return PID_DISABLED; + int32_t error = pid_target_value_ - current_value; // derivative // instead of derivative of error we take derivative on measurement // since dError/dt = - dInput/dt (note the - ) - int32_t d_measure = current_value - pid_d_last_error_; - pid_d_last_error_ = error; + int32_t d_measure = current_value - pid_last_input_; + pid_last_input_ = current_value; // integral (bring pid_i_ into integral, so we get smooth transfer if pid_i_ suddenly changes) pid_i_integralsum_ += pid_i_ * error; diff --git a/pcr-controller/pid_control.h b/pcr-controller/pid_control.h index 4304565..4cff977 100644 --- a/pcr-controller/pid_control.h +++ b/pcr-controller/pid_control.h @@ -10,13 +10,16 @@ #include +#define PID_DISABLED (1<<15) + void pid_setP(int16_t p); void pid_setI(int16_t i); void pid_setD(int16_t d); void pid_printVars(void); -void pid_setTargetValue(uint16_t v); -uint16_t pid_getTargetValue(void); -int16_t pid_calc(uint16_t current_value); +void pid_setTargetValue(int16_t v); +int pid_isEnabled(void); +int16_t pid_getTargetValue(void); +int16_t pid_calc(int16_t current_value); void pid_loadFromEEPROM(void); void pid_saveToEEPROM(void); -- cgit v1.2.3