From 8e977d50ce1d4ff46f32c5097655961064d12522 Mon Sep 17 00:00:00 2001 From: Robert Konklewski Date: Mon, 18 Apr 2016 12:59:10 +0200 Subject: [PATCH] Temp: have heater update on 250ms intervals. Thermal managers (PID, bang-bang, etc.) assume they're being ticked on 250ms intervals. In reality, they were being updated on each temperature reading, which was between 10ms and 250ms. This caused thermal management to malfunction. https://github.com/Traumflug/Teacup_Firmware/issues/211 --- clock.c | 2 ++ temp.c | 19 +++++++++++++++---- temp.h | 2 ++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/clock.c b/clock.c index f6b7913..93eb9e3 100644 --- a/clock.c +++ b/clock.c @@ -84,6 +84,8 @@ static void clock_250ms(void) { } } + temp_heater_tick(); + ifclock(clock_flag_1s) { #ifdef DISPLAY display_clock(); diff --git a/temp.c b/temp.c index 3bf5d80..779d707 100644 --- a/temp.c +++ b/temp.c @@ -393,10 +393,6 @@ void temp_sensor_tick() { temp_sensors_runtime[i].temp_residency = 0; } - if (temp_sensors[i].heater < NUM_HEATERS) { - heater_tick(temp_sensors[i].heater, temp_sensors[i].temp_type, temp_sensors_runtime[i].last_read_temp, temp_sensors_runtime[i].target_temp); - } - if (DEBUG_PID && (debug_flags & DEBUG_PID)) sersendf_P(PSTR("DU temp: {%d %d %d.%d}"), i, temp_sensors_runtime[i].last_read_temp, @@ -407,6 +403,21 @@ void temp_sensor_tick() { sersendf_P(PSTR("\n")); } +/** + Called every 250ms from clock.c. Update heaters for all sensors. +*/ +void temp_heater_tick() { + temp_sensor_t i; + + for (i = 0; i < NUM_TEMP_SENSORS; i++) { + if (temp_sensors[i].heater < NUM_HEATERS) { + heater_tick(temp_sensors[i].heater, temp_sensors[i].temp_type, + temp_sensors_runtime[i].last_read_temp, + temp_sensors_runtime[i].target_temp); + } + } +} + /** * Report whether all temp sensors in use are reading their target * temperatures. Used for M116 and friends. diff --git a/temp.h b/temp.h index de96bd3..8c6e0e4 100644 --- a/temp.h +++ b/temp.h @@ -36,6 +36,8 @@ void temp_init(void); void temp_sensor_tick(void); +void temp_heater_tick(void); + uint8_t temp_achieved(void); void temp_set(temp_sensor_t index, uint16_t temperature);