adjustments to calib procedure, now with PID used

master
Ondřej Hruška 1 year ago
parent 991802b894
commit d9f09c8ccb
  1. 5
      Core/Src/Gui/app_gui.c
  2. 66
      Core/Src/Gui/screen_calibration.c
  3. 8
      Core/Src/app_heater.c
  4. 5
      Core/Src/app_heater.h
  5. 19
      Core/Src/app_temp.c
  6. 8
      Core/Src/app_temp.h
  7. 1
      Lib/ufb/Src/font_57.inc.c
  8. 9
      Lib/ufb/Src/fontedit_57.c

@ -13,6 +13,7 @@
#include "ufb/framebuffer.h" #include "ufb/framebuffer.h"
#include "ufb/fb_text.h" #include "ufb/fb_text.h"
#include "app_safety.h" #include "app_safety.h"
#include "app_heater.h"
struct State s_app = {}; struct State s_app = {};
@ -134,10 +135,10 @@ void switch_screen(screen_t pScreen, bool init) {
/** Draw GUI common to all screens */ /** Draw GUI common to all screens */
static void draw_common_overlay() { static void draw_common_overlay() {
SPRINTF(stmp, "%5.1f°C →%3d°C", s_app.oven_temp, s_app.set_temp); SPRINTF(stmp, "%5.1f°C →%3d°C", app_temp_read_oven(), (int) app_heater_get_target());
fb_text(3, 3, stmp, FONT_3X5, 1); fb_text(3, 3, stmp, FONT_3X5, 1);
if (s_app.heater_enabled) { if (app_heater_get_state()) {
fb_frame(0, 0, FBW, 11, 1, 1); fb_frame(0, 0, FBW, 11, 1, 1);
} }
} }

@ -30,6 +30,17 @@ enum Phase {
PH_DONE, PH_DONE,
}; };
static void stop_heater() {
app_heater_set_target(0);
app_heater_enable(false);
}
static void calib_abort() {
app_temp_restore_calib();
stop_heater();
switch_screen(screen_home, true);
}
static void next_phase() { static void next_phase() {
PUTS("Phase++\r\n"); PUTS("Phase++\r\n");
s_calib.phase++; s_calib.phase++;
@ -47,11 +58,12 @@ static void hello_menu_cb(int opt) {
// Continue // Continue
next_phase(); next_phase();
request_paint(); request_paint();
app_heater_manual_override(100); app_heater_set_target(100);
app_heater_enable(true);
break; break;
case 1: case 1:
switch_screen(screen_home, true); calib_abort();
break; break;
} }
} }
@ -70,12 +82,11 @@ static void sample1_menu_cb(int opt) {
next_phase(); next_phase();
request_paint(); request_paint();
s_calib.sample1 = app_temp_read_oven_raw(); s_calib.sample1 = app_temp_read_oven_raw();
app_heater_manual_override(0); app_heater_enable(false);
break; break;
case 1: case 1:
app_heater_manual_override(-1); calib_abort();
switch_screen(screen_home, true);
break; break;
} }
} }
@ -94,12 +105,11 @@ static void sample2_menu_cb(int opt) {
next_phase(); next_phase();
request_paint(); request_paint();
s_calib.sample2 = app_temp_read_oven_raw(); s_calib.sample2 = app_temp_read_oven_raw();
app_heater_manual_override(0); app_heater_enable(false);
break; break;
case 1: case 1:
app_heater_manual_override(-1); calib_abort();
switch_screen(screen_home, true);
break; break;
} }
} }
@ -107,6 +117,8 @@ static void sample2_menu_cb(int opt) {
void screen_calibration(GuiEvent event) void screen_calibration(GuiEvent event)
{ {
if (event == GUI_EVENT_SCREEN_INIT) { if (event == GUI_EVENT_SCREEN_INIT) {
app_temp_backup_calib();
app_temp_set_calib_temporary(1, 0);
memset(&s_calib, 0, sizeof(s_calib)); memset(&s_calib, 0, sizeof(s_calib));
// continue to the rest - so the menu can be inited // continue to the rest - so the menu can be inited
} }
@ -121,17 +133,20 @@ void screen_calibration(GuiEvent event)
screen_menu_offset(event, hello_menu_opts, hello_menu_cb, 30); screen_menu_offset(event, hello_menu_opts, hello_menu_cb, 30);
break; break;
case PH_SAMPLE1: // Heater is active, waiting for mark case PH_SAMPLE1:
case PH_SAMPLE2:
if (event == GUI_EVENT_PAINT) { if (event == GUI_EVENT_PAINT) {
fb_text(FBW/2, 16, "Zapiš", TEXT_CENTER, 1); fb_text(FBW/2, 16, "Vyčkej", TEXT_CENTER, 1);
fb_text(FBW/2, 26, "teplotu", TEXT_CENTER, 1); fb_text(FBW/2, 26, "ustálení", TEXT_CENTER, 1);
} }
if (s_calib.phase == PH_SAMPLE1) { screen_menu_offset(event, sample1_menu_opts, sample1_menu_cb, 30);
screen_menu_offset(event, sample1_menu_opts, sample1_menu_cb, 30); break;
} else {
screen_menu_offset(event, sample2_menu_opts, sample2_menu_cb, 30); case PH_SAMPLE2:
if (event == GUI_EVENT_PAINT) {
fb_text(FBW/2, 16, "Vyčkej", TEXT_CENTER, 1);
fb_text(FBW/2, 26, "ustálení", TEXT_CENTER, 1);
} }
screen_menu_offset(event, sample2_menu_opts, sample2_menu_cb, 30);
break; break;
case PH_TEMP1: case PH_TEMP1:
@ -144,8 +159,7 @@ void screen_calibration(GuiEvent event)
if (push_time() > pdMS_TO_TICKS(500)) { if (push_time() > pdMS_TO_TICKS(500)) {
input_sound_effect(); input_sound_effect();
app_heater_manual_override_clear(); calib_abort();
switch_screen(screen_home, true);
return; return;
} }
@ -184,7 +198,9 @@ void screen_calibration(GuiEvent event)
request_paint(); request_paint();
if (s_calib.phase == PH_DONE) { if (s_calib.phase == PH_DONE) {
app_heater_manual_override(-1); app_heater_set_target(0);
app_heater_enable(false);
// TODO do the math // TODO do the math
PRINTF("Sample 1 %f, T1 %d\r\n", s_calib.sample1, s_calib.temp1); PRINTF("Sample 1 %f, T1 %d\r\n", s_calib.sample1, s_calib.temp1);
PRINTF("Sample 2 %f, T2 %d\r\n", s_calib.sample2, s_calib.temp2); PRINTF("Sample 2 %f, T2 %d\r\n", s_calib.sample2, s_calib.temp2);
@ -195,10 +211,13 @@ void screen_calibration(GuiEvent event)
float a = (corrected1 - corrected2) / (s_calib.sample1 - s_calib.sample2); float a = (corrected1 - corrected2) / (s_calib.sample1 - s_calib.sample2);
float b = corrected1 - a * s_calib.sample1; float b = corrected1 - a * s_calib.sample1;
app_temp_set_calib(a, b); app_temp_set_persistent_calib(a, b);
} else { } else if (s_calib.phase == PH_SAMPLE1) {
// for the next phase app_heater_set_target(100);
app_heater_manual_override(100); app_heater_enable(true);
} else if (s_calib.phase == PH_SAMPLE2) {
app_heater_set_target(200);
app_heater_enable(true);
} }
break; break;
} }
@ -211,6 +230,7 @@ void screen_calibration(GuiEvent event)
fb_text(FBW/2, 36, "→Hlavní menu", TEXT_CENTER, 1); fb_text(FBW/2, 36, "→Hlavní menu", TEXT_CENTER, 1);
} }
if (event == GUI_EVENT_KNOB_RELEASE) { if (event == GUI_EVENT_KNOB_RELEASE) {
stop_heater();
switch_screen(screen_home, 1); switch_screen(screen_home, 1);
} }
break; break;

@ -98,6 +98,14 @@ void app_heater_set_target(float target) {
heaterExitCritical(); heaterExitCritical();
} }
bool app_heater_get_state() {
return state.pid.ctlMode == PID_AUTOMATIC;
}
float app_heater_get_target() {
return state.pid.Setpoint;
}
// emergency shutdown, this must not block use RTOS since it can be called from fault handlers or interrupt // emergency shutdown, this must not block use RTOS since it can be called from fault handlers or interrupt
void app_heater_emergency_shutdown() { void app_heater_emergency_shutdown() {
// Stop pwm // Stop pwm

@ -36,4 +36,9 @@ void app_heater_set_target(float target);
/// Shutdown the heater; This function does not use mutex and just disables the PWM via register access. /// Shutdown the heater; This function does not use mutex and just disables the PWM via register access.
void app_heater_emergency_shutdown(); void app_heater_emergency_shutdown();
bool app_heater_get_state();
float app_heater_get_target();
#endif //BLUEPILLTROUBA_APP_HEATER_H #endif //BLUEPILLTROUBA_APP_HEATER_H

@ -30,6 +30,8 @@ static struct App {
float soc_temp; float soc_temp;
float cal_a; float cal_a;
float cal_b; float cal_b;
float saved_cal_a;
float saved_cal_b;
float oventemp_history[OVENTEMP_HISTORY_DEPTH]; // raw temp float oventemp_history[OVENTEMP_HISTORY_DEPTH]; // raw temp
uint16_t adc_averagebuf[AVERAGEBUF_DEPTH * 4]; uint16_t adc_averagebuf[AVERAGEBUF_DEPTH * 4];
uint8_t averagebuf_ptr; uint8_t averagebuf_ptr;
@ -158,7 +160,7 @@ static void correct_invalid_calib() {
} }
/// Set and persist calibration constants /// Set and persist calibration constants
void app_temp_set_calib(float a, float b) { void app_temp_set_persistent_calib(float a, float b) {
s_analog.cal_a = a; s_analog.cal_a = a;
s_analog.cal_b = b; s_analog.cal_b = b;
correct_invalid_calib(); correct_invalid_calib();
@ -177,6 +179,21 @@ void app_temp_set_calib(float a, float b) {
} }
} }
void app_temp_backup_calib() {
s_analog.saved_cal_a = s_analog.cal_a;
s_analog.saved_cal_b = s_analog.cal_b;
}
void app_temp_set_calib_temporary(float a, float b) {
s_analog.cal_a = a;
s_analog.cal_b = b;
}
void app_temp_restore_calib() {
s_analog.cal_a = s_analog.saved_cal_a;
s_analog.cal_b = s_analog.saved_cal_b;
}
void app_analog_init() void app_analog_init()
{ {
// read calibration constants // read calibration constants

@ -10,7 +10,13 @@ void app_analog_init();
float val_to_c(float val); float val_to_c(float val);
float c_to_val(float c); float c_to_val(float c);
void app_temp_set_calib(float a, float b); void app_temp_set_persistent_calib(float a, float b);
void app_temp_backup_calib();
void app_temp_set_calib_temporary(float a, float b);
void app_temp_restore_calib();
/** /**
* Update temperature measurement. * Update temperature measurement.

@ -106,5 +106,6 @@ static const struct utf_glyph5x PROGMEM font57_extra[] = {
{.utf={.symbol="í"}, {{0x00, 0x44, 0x7d, 0x41, 0x00}}}, {.utf={.symbol="í"}, {{0x00, 0x44, 0x7d, 0x41, 0x00}}},
{.utf={.symbol="ž"}, {{0x44, 0x65, 0x56, 0x4d, 0x44}}}, {.utf={.symbol="ž"}, {{0x44, 0x65, 0x56, 0x4d, 0x44}}},
{.utf={.symbol="ď"}, {{0x38, 0x44, 0x45, 0x48, 0x7f}}}, {.utf={.symbol="ď"}, {{0x38, 0x44, 0x45, 0x48, 0x7f}}},
{.utf={.symbol="á"}, {{0x20, 0x54, 0x54, 0x55, 0x79}}},
{.utf={.symbol="»"}, {{0x22, 0x14, 0x2a, 0x14, 0x08}}}, {.utf={.symbol="»"}, {{0x22, 0x14, 0x2a, 0x14, 0x08}}},
}; };

@ -935,6 +935,14 @@ const char *font_extras[] = {
"# #", "# #",
"# #", "# #",
" ####", " ####",
// 97 "a"
" xx",
" ",
" ### ",
" #",
" ####",
"# #",
" ####",
// » // »
" ", " ",
"x x ", "x x ",
@ -967,6 +975,7 @@ const char *font_extras_utf[] = {
"í", "í",
"ž", "ž",
"ď", "ď",
"á",
"»", "»",
}; };

Loading…
Cancel
Save