summaryrefslogtreecommitdiff
path: root/pcr-controller
diff options
context:
space:
mode:
authorBernhard Tittelbach <xro@realraum.at>2013-10-11 16:10:29 +0000
committerBernhard Tittelbach <xro@realraum.at>2013-10-11 16:10:29 +0000
commit021d746ab7cfdb97b6fcc92192dd5535cde81d0e (patch)
tree972d814c84e171551c687a649ff04bc9dfcd613e /pcr-controller
parentcopyright (diff)
bugfixes
git-svn-id: https://svn.spreadspace.org/avr/trunk@241 aa12f405-d877-488e-9caf-2d797e2a1cc7
Diffstat (limited to 'pcr-controller')
-rw-r--r--pcr-controller/pcr-controller.c19
-rw-r--r--pcr-controller/pid_control.c30
-rw-r--r--pcr-controller/pid_control.h9
3 files changed, 41 insertions, 17 deletions
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 <stdio.h>
+#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);