Move main loop implementation torwards target

This commit is contained in:
Mario Hüttel 2020-05-05 18:55:55 +02:00
parent 2187c1a712
commit 8a0572d698
3 changed files with 82 additions and 45 deletions

View File

@ -21,4 +21,10 @@
#ifndef __OVEN_DRIVER_H__ #ifndef __OVEN_DRIVER_H__
#define __OVEN_DRIVER_H__ #define __OVEN_DRIVER_H__
#include <stdint.h>
void oven_driver_init(void);
void oven_driver_set_power(uint8_t power);
#endif /* __OVEN_DRIVER_H__ */ #endif /* __OVEN_DRIVER_H__ */

View File

@ -34,18 +34,19 @@
#include <reflow-controller/systick.h> #include <reflow-controller/systick.h>
#include <reflow-controller/adc-meas.h> #include <reflow-controller/adc-meas.h>
#include <reflow-controller/shell.h> #include <reflow-controller/shell.h>
#include <reflow-controller/pid-controller.h>
#include <reflow-controller/ui/lcd.h> #include <reflow-controller/ui/lcd.h>
#include <reflow-controller/digio.h> #include <reflow-controller/digio.h>
#include "fatfs/shimatta_sdio_driver/shimatta_sdio.h" #include "fatfs/shimatta_sdio_driver/shimatta_sdio.h"
#include <reflow-controller/temp-converter.h> #include <reflow-controller/temp-converter.h>
#include <reflow-controller/rotary-encoder.h> #include <reflow-controller/rotary-encoder.h>
#include <reflow-controller/pid-controller.h>
#include <stm-periph/stm32-gpio-macros.h> #include <stm-periph/stm32-gpio-macros.h>
#include <stm-periph/clock-enable-manager.h> #include <stm-periph/clock-enable-manager.h>
#include <stm-periph/uart.h> #include <stm-periph/uart.h>
#include <reflow-controller/shell-uart-config.h> #include <reflow-controller/shell-uart-config.h>
#include <helper-macros/helper-macros.h> #include <helper-macros/helper-macros.h>
#include <reflow-controller/button.h> #include <reflow-controller/button.h>
#include <reflow-controller/oven-driver.h>
#include <fatfs/ff.h> #include <fatfs/ff.h>
static void setup_nvic_priorities() static void setup_nvic_priorities()
@ -59,11 +60,13 @@ static void setup_nvic_priorities()
NVIC_SetPriority(DMA2_Stream7_IRQn, 3); 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 float pt1000_value;
static volatile int pt1000_value_status; static volatile int pt1000_value_status;
static uint32_t rot; static uint32_t rot;
static volatile float pid_out; static float target_temperature;
static volatile float current_temperature; static struct pid_controller pid;
static volatile enum button_state button;
FATFS fs; FATFS fs;
FATFS *fs_ptr = &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_tx_buff[128];
static char shell_uart_rx_buff[32]; static char shell_uart_rx_buff[48];
struct stm_uart shell_uart; struct stm_uart shell_uart;
static shellmatta_retCode_t write_shell_callback(const char *data, uint32_t len) 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; return mounted;
} }
const char *oven_controller_hello_world = "Hello world :)\n"; static inline int32_t handle_pid_controller(struct pid_controller *pid, float target_temperature,
static volatile enum button_state button; float current_pt1000_resistance)
static volatile uint32_t main_loops_per_ms;
int main()
{ {
char disp[4][21] = {0}; float current_temperature;
bool sd_card_mounted = false; int32_t pid_out;
FIL test_file;
const char *uart_input;
size_t uart_input_len;
shellmatta_handle_t shell_handle;
int uart_receive_status;
uint32_t main_loop_cnt = 0UL; (void)temp_converter_convert_resistance_to_temp(current_pt1000_resistance, (float *)&current_temperature);
uint64_t ms_stamp = 0ULL; pid_out = (int32_t)pid_sample(pid, target_temperature - current_temperature);
static struct pid_controller pid; /* Blink green LED */
uint64_t pid_timestamp = 0ULL; led_set(1, !led_get(1));
uint64_t display_timestamp = 0ULL;
return pid_out;
}
const char *oven_controller_hello_world = "Hello world :)\n";
static inline void setup_system()
{
setup_nvic_priorities(); setup_nvic_priorities();
systick_setup(); systick_setup();
adc_pt1000_setup_meas(); adc_pt1000_setup_meas();
oven_driver_init();
digio_setup_default_all(); digio_setup_default_all();
led_setup(); led_setup();
loudspeaker_setup(); loudspeaker_setup();
@ -167,9 +170,26 @@ int main()
uart_gpio_config(); uart_gpio_config();
setup_sell_uart(&shell_uart); setup_sell_uart(&shell_uart);
}
lcd_home(); int main()
lcd_string("Reflow"); {
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_handle = shell_init(write_shell_callback);
shell_print_motd(shell_handle); shell_print_motd(shell_handle);
@ -185,42 +205,43 @@ int main()
pid_zero(&pid); pid_zero(&pid);
while (1) { 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); sd_card_mounted = mount_sd_card_if_avail(sd_card_mounted);
pt1000_value_status = adc_pt1000_get_current_resistance(&pt1000_value); 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 *)&current_temperature);
if (systick_ticks_have_passed(pid_timestamp, 250)) {
pid_out = pid_sample(&pid, 100.0 - current_temperature); if (systick_ticks_have_passed(pid_timestamp, 250)) {
pid_timestamp = systick_get_global_tick(); pid_timestamp = systick_get_global_tick();
snprintf(&disp[2][0], 21, "Temp: %.1f C", current_temperature); if (pt1000_value_status >= 0 && pid_controller_active)
led_set(1, !led_get(1)); 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(); 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); uart_receive_status = uart_receive_data_with_dma(&shell_uart, &uart_input, &uart_input_len);
if (uart_receive_status >= 1) if (uart_receive_status >= 1)
shell_handle_input(shell_handle, uart_input, uart_input_len); 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)) { if (systick_ticks_have_passed(display_timestamp, 1)) {
display_timestamp = systick_get_global_tick(); display_timestamp = systick_get_global_tick();
lcd_fsm_write_buffer(disp); lcd_fsm_write_buffer(disp);

View File

@ -19,3 +19,13 @@
*/ */
#include <reflow-controller/oven-driver.h> #include <reflow-controller/oven-driver.h>
void oven_driver_init()
{
}
void oven_driver_set_power(uint8_t power)
{
}