From 8a0572d698cdbc7f764c3ae3c63a8e91ab108fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Tue, 5 May 2020 18:55:55 +0200 Subject: [PATCH] Move main loop implementation torwards target --- .../include/reflow-controller/oven-driver.h | 6 + stm-firmware/main.c | 111 +++++++++++------- stm-firmware/oven-driver.c | 10 ++ 3 files changed, 82 insertions(+), 45 deletions(-) diff --git a/stm-firmware/include/reflow-controller/oven-driver.h b/stm-firmware/include/reflow-controller/oven-driver.h index 0ba0610..4f6f317 100644 --- a/stm-firmware/include/reflow-controller/oven-driver.h +++ b/stm-firmware/include/reflow-controller/oven-driver.h @@ -21,4 +21,10 @@ #ifndef __OVEN_DRIVER_H__ #define __OVEN_DRIVER_H__ +#include + +void oven_driver_init(void); + +void oven_driver_set_power(uint8_t power); + #endif /* __OVEN_DRIVER_H__ */ diff --git a/stm-firmware/main.c b/stm-firmware/main.c index 4d8a0b2..fffdb84 100644 --- a/stm-firmware/main.c +++ b/stm-firmware/main.c @@ -34,18 +34,19 @@ #include #include #include -#include #include #include #include "fatfs/shimatta_sdio_driver/shimatta_sdio.h" #include #include +#include #include #include #include #include #include #include +#include #include static void setup_nvic_priorities() @@ -59,11 +60,13 @@ static void setup_nvic_priorities() NVIC_SetPriority(DMA2_Stream7_IRQn, 3); } +/* Process parameters are defined static globally to be watched in debugger from any context */ static float pt1000_value; static volatile int pt1000_value_status; static uint32_t rot; -static volatile float pid_out; -static volatile float current_temperature; +static float target_temperature; +static struct pid_controller pid; +static volatile enum button_state button; FATFS fs; FATFS *fs_ptr = &fs; @@ -81,7 +84,7 @@ static inline void uart_gpio_config() static char shell_uart_tx_buff[128]; -static char shell_uart_rx_buff[32]; +static char shell_uart_rx_buff[48]; struct stm_uart shell_uart; static shellmatta_retCode_t write_shell_callback(const char *data, uint32_t len) @@ -133,31 +136,31 @@ static bool mount_sd_card_if_avail(bool mounted) return mounted; } -const char *oven_controller_hello_world = "Hello world :)\n"; -static volatile enum button_state button; -static volatile uint32_t main_loops_per_ms; -int main() +static inline int32_t handle_pid_controller(struct pid_controller *pid, float target_temperature, + float current_pt1000_resistance) { - char disp[4][21] = {0}; - bool sd_card_mounted = false; - FIL test_file; - const char *uart_input; - size_t uart_input_len; - shellmatta_handle_t shell_handle; - int uart_receive_status; + float current_temperature; + int32_t pid_out; - uint32_t main_loop_cnt = 0UL; - uint64_t ms_stamp = 0ULL; + (void)temp_converter_convert_resistance_to_temp(current_pt1000_resistance, (float *)¤t_temperature); + pid_out = (int32_t)pid_sample(pid, target_temperature - current_temperature); - static struct pid_controller pid; - uint64_t pid_timestamp = 0ULL; - uint64_t display_timestamp = 0ULL; + /* Blink green LED */ + led_set(1, !led_get(1)); + + return pid_out; +} + +const char *oven_controller_hello_world = "Hello world :)\n"; + +static inline void setup_system() +{ setup_nvic_priorities(); systick_setup(); adc_pt1000_setup_meas(); - + oven_driver_init(); digio_setup_default_all(); led_setup(); loudspeaker_setup(); @@ -167,9 +170,26 @@ int main() uart_gpio_config(); setup_sell_uart(&shell_uart); +} - lcd_home(); - lcd_string("Reflow"); +int main() +{ + bool sd_card_mounted = false; + FIL test_file; + const char *uart_input; + size_t uart_input_len; + shellmatta_handle_t shell_handle; + int uart_receive_status; + + uint64_t pid_timestamp = 0ULL; + bool pid_controller_active = false; + int32_t pid_controller_output; + uint64_t display_timestamp = 0ULL; + char disp[4][21] = {0}; + + target_temperature = 25.0f; + + setup_system(); shell_handle = shell_init(write_shell_callback); shell_print_motd(shell_handle); @@ -185,42 +205,43 @@ int main() pid_zero(&pid); while (1) { - if (systick_get_global_tick() - ms_stamp >= 1) { - ms_stamp = systick_get_global_tick(); - main_loops_per_ms = main_loop_cnt; - main_loop_cnt = 0UL; - } sd_card_mounted = mount_sd_card_if_avail(sd_card_mounted); pt1000_value_status = adc_pt1000_get_current_resistance(&pt1000_value); - if (pt1000_value_status >= 0) { - (void)temp_converter_convert_resistance_to_temp(pt1000_value, (float *)¤t_temperature); - if (systick_ticks_have_passed(pid_timestamp, 250)) { - pid_out = pid_sample(&pid, 100.0 - current_temperature); - pid_timestamp = systick_get_global_tick(); - snprintf(&disp[2][0], 21, "Temp: %.1f C", current_temperature); - led_set(1, !led_get(1)); - } + if (systick_ticks_have_passed(pid_timestamp, 250)) { + pid_timestamp = systick_get_global_tick(); + if (pt1000_value_status >= 0 && pid_controller_active) + pid_controller_output = handle_pid_controller(&pid, target_temperature, pt1000_value); + + /* Blink red led in case of temp error */ + if (pt1000_value_status < 0) + led_set(0, !led_get(0)); } - //pid_timestamp = systick_get_global_tick(); + /* Handle error in case PID controller should be active, but temperature measurement failed */ + if (pid_controller_active && pt1000_value_status < 0) { + /* Disable the oven controller */ + oven_driver_set_power(0U); + + /* Activate loundspeaker permanently */ + loudspeaker_set(1); + } else if (pid_controller_active) { + /* In case temperature measuremnt is okay and controlelr is working, write output power */ + oven_driver_set_power(pid_controller_output < 0 ? 0U : pid_controller_output); + } button = button_read_event(); + rot = rotary_encoder_get_abs_val(); + /* TODO: handle gui */ + + /* Handle uart input for shell */ uart_receive_status = uart_receive_data_with_dma(&shell_uart, &uart_input, &uart_input_len); if (uart_receive_status >= 1) shell_handle_input(shell_handle, uart_input, uart_input_len); - main_loop_cnt++; - - - rot = rotary_encoder_get_abs_val(); - snprintf(&disp[0][0], 21U, "Rot-Enc: %" PRIu32, rot); - strcpy(&disp[1][0], "Line 2"); - strcpy(&disp[3][0], "Shimatta Reflow"); - if (systick_ticks_have_passed(display_timestamp, 1)) { display_timestamp = systick_get_global_tick(); lcd_fsm_write_buffer(disp); diff --git a/stm-firmware/oven-driver.c b/stm-firmware/oven-driver.c index 27a7564..beb356b 100644 --- a/stm-firmware/oven-driver.c +++ b/stm-firmware/oven-driver.c @@ -19,3 +19,13 @@ */ #include + +void oven_driver_init() +{ + +} + +void oven_driver_set_power(uint8_t power) +{ + +}