Move main loop implementation torwards target
This commit is contained in:
parent
2187c1a712
commit
8a0572d698
@ -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__ */
|
||||||
|
@ -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 *)¤t_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 *)¤t_temperature);
|
|
||||||
if (systick_ticks_have_passed(pid_timestamp, 250)) {
|
if (systick_ticks_have_passed(pid_timestamp, 250)) {
|
||||||
|
|
||||||
pid_out = pid_sample(&pid, 100.0 - current_temperature);
|
|
||||||
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);
|
||||||
|
@ -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)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user