Reworked measurement ADC to use safety controller
This commit is contained in:
parent
a9e300bf5b
commit
da96daa767
@ -24,14 +24,13 @@
|
|||||||
#include <stm-periph/stm32-gpio-macros.h>
|
#include <stm-periph/stm32-gpio-macros.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stm-periph/clock-enable-manager.h>
|
#include <stm-periph/clock-enable-manager.h>
|
||||||
|
#include <reflow-controller/safety/safety-controller.h>
|
||||||
|
|
||||||
static float pt1000_offset;
|
static float pt1000_offset;
|
||||||
static float pt1000_sens_dev;
|
static float pt1000_sens_dev;
|
||||||
static bool calibration_active;
|
static bool calibration_active;
|
||||||
static float filter_alpha;
|
static float filter_alpha;
|
||||||
static volatile float pt1000_res_raw_lf;
|
static volatile float pt1000_res_raw_lf;
|
||||||
static volatile bool filter_ready;
|
|
||||||
static volatile enum adc_pt1000_error pt1000_error = ADC_PT1000_INACTIVE;
|
|
||||||
static volatile int * volatile streaming_flag_ptr = NULL;
|
static volatile int * volatile streaming_flag_ptr = NULL;
|
||||||
static uint32_t filter_startup_cnt;
|
static uint32_t filter_startup_cnt;
|
||||||
static volatile float adc_pt1000_raw_reading_hf;
|
static volatile float adc_pt1000_raw_reading_hf;
|
||||||
@ -73,7 +72,7 @@ static inline void adc_pt1000_disable_adc()
|
|||||||
ADC_PT1000_PERIPH->CR2 &= ~ADC_CR2_ADON;
|
ADC_PT1000_PERIPH->CR2 &= ~ADC_CR2_ADON;
|
||||||
DMA2_Stream0->CR = 0;
|
DMA2_Stream0->CR = 0;
|
||||||
|
|
||||||
pt1000_error |= ADC_PT1000_INACTIVE;
|
safety_controller_report_error_with_key(ERR_FLAG_MEAS_ADC_OFF, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
|
|
||||||
rcc_manager_disable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(RCC_APB2ENR_ADC3EN));
|
rcc_manager_disable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(RCC_APB2ENR_ADC3EN));
|
||||||
rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(ADC_PT1000_PORT_RCC_MASK));
|
rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(ADC_PT1000_PORT_RCC_MASK));
|
||||||
@ -166,13 +165,13 @@ void adc_pt1000_setup_meas()
|
|||||||
|
|
||||||
adc_pt1000_setup_sample_frequency_timer();
|
adc_pt1000_setup_sample_frequency_timer();
|
||||||
|
|
||||||
pt1000_error &= ~ADC_PT1000_INACTIVE;
|
safety_controller_ack_flag_with_key(ERR_FLAG_MEAS_ADC_OFF, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void adc_pt1000_set_moving_average_filter_param(float alpha)
|
void adc_pt1000_set_moving_average_filter_param(float alpha)
|
||||||
{
|
{
|
||||||
filter_alpha = alpha;
|
filter_alpha = alpha;
|
||||||
filter_ready = false;
|
safety_controller_report_error_with_key(ERR_FLAG_MEAS_ADC_UNSTABLE, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
filter_startup_cnt = ADC_FILTER_STARTUP_CYCLES;
|
filter_startup_cnt = ADC_FILTER_STARTUP_CYCLES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,6 +180,12 @@ void adc_pt1000_set_resistance_calibration(float offset, float sensitivity_devia
|
|||||||
pt1000_offset = offset;
|
pt1000_offset = offset;
|
||||||
pt1000_sens_dev = sensitivity_deviation;
|
pt1000_sens_dev = sensitivity_deviation;
|
||||||
calibration_active = active;
|
calibration_active = active;
|
||||||
|
|
||||||
|
if (calibration_active) {
|
||||||
|
safety_controller_report_error_with_key(ERR_FLAG_UNCAL, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
|
} else {
|
||||||
|
safety_controller_ack_flag_with_key(ERR_FLAG_UNCAL, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void adc_pt1000_get_resistance_calibration(float *offset, float *sensitivity_deviation, bool *active)
|
void adc_pt1000_get_resistance_calibration(float *offset, float *sensitivity_deviation, bool *active)
|
||||||
@ -205,18 +210,23 @@ static inline float adc_pt1000_apply_calibration(float raw_resistance)
|
|||||||
int adc_pt1000_get_current_resistance(float *resistance)
|
int adc_pt1000_get_current_resistance(float *resistance)
|
||||||
{
|
{
|
||||||
int ret_val = 0;
|
int ret_val = 0;
|
||||||
|
bool flag = true;
|
||||||
|
|
||||||
|
|
||||||
if (!resistance)
|
if (!resistance)
|
||||||
return -1001;
|
return -1001;
|
||||||
|
|
||||||
*resistance = adc_pt1000_apply_calibration(pt1000_res_raw_lf);
|
*resistance = adc_pt1000_apply_calibration(pt1000_res_raw_lf);
|
||||||
|
|
||||||
if (adc_pt1000_check_error()) {
|
if (safety_controller_get_flags_by_mask(ERR_FLAG_MEAS_ADC_OFF | ERR_FLAG_MEAS_ADC_OVERFLOW |
|
||||||
|
ERR_FLAG_MEAS_ADC_WATCHDOG)) {
|
||||||
ret_val = -100;
|
ret_val = -100;
|
||||||
goto return_value;
|
goto return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!filter_ready) {
|
(void)safety_controller_get_flag(ERR_FLAG_MEAS_ADC_UNSTABLE, &flag, false);
|
||||||
|
|
||||||
|
if (flag) {
|
||||||
ret_val = 2;
|
ret_val = 2;
|
||||||
goto return_value;
|
goto return_value;
|
||||||
}
|
}
|
||||||
@ -260,25 +270,15 @@ void adc_pt1000_convert_raw_value_array_to_resistance(float *resistance_dest, fl
|
|||||||
resistance_dest[i] = ADC_TO_RES(raw_source[i]);
|
resistance_dest[i] = ADC_TO_RES(raw_source[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum adc_pt1000_error adc_pt1000_check_error()
|
|
||||||
{
|
|
||||||
return pt1000_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
void adc_pt1000_clear_error()
|
|
||||||
{
|
|
||||||
pt1000_error &= ~ADC_PT1000_OVERFLOW & ~ADC_PT1000_WATCHDOG_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
void adc_pt1000_disable()
|
void adc_pt1000_disable()
|
||||||
{
|
{
|
||||||
adc_pt1000_disable_adc();
|
adc_pt1000_disable_adc();
|
||||||
adc_pt1000_stop_sample_frequency_timer();
|
adc_pt1000_stop_sample_frequency_timer();
|
||||||
adc_pt1000_disable_dma_stream();
|
adc_pt1000_disable_dma_stream();
|
||||||
|
|
||||||
filter_ready = false;
|
|
||||||
pt1000_res_raw_lf = 0.0f;
|
pt1000_res_raw_lf = 0.0f;
|
||||||
pt1000_error |= ADC_PT1000_INACTIVE;
|
safety_controller_report_error_with_key(ERR_FLAG_MEAS_ADC_OFF, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
|
safety_controller_report_error_with_key(ERR_FLAG_MEAS_ADC_UNSTABLE, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
|
|
||||||
if (streaming_flag_ptr) {
|
if (streaming_flag_ptr) {
|
||||||
*streaming_flag_ptr = -3;
|
*streaming_flag_ptr = -3;
|
||||||
@ -288,8 +288,12 @@ void adc_pt1000_disable()
|
|||||||
|
|
||||||
static inline __attribute__((optimize("O3"))) void adc_pt1000_filter(float adc_prefiltered_value)
|
static inline __attribute__((optimize("O3"))) void adc_pt1000_filter(float adc_prefiltered_value)
|
||||||
{
|
{
|
||||||
if (!filter_ready && --filter_startup_cnt <= 0)
|
if (filter_startup_cnt > 0) {
|
||||||
filter_ready = true;
|
filter_startup_cnt--;
|
||||||
|
if (filter_startup_cnt == 0) {
|
||||||
|
safety_controller_ack_flag_with_key(ERR_FLAG_MEAS_ADC_UNSTABLE, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pt1000_res_raw_lf = (1.0f-filter_alpha) * pt1000_res_raw_lf + filter_alpha * ADC_TO_RES(adc_prefiltered_value);
|
pt1000_res_raw_lf = (1.0f-filter_alpha) * pt1000_res_raw_lf + filter_alpha * ADC_TO_RES(adc_prefiltered_value);
|
||||||
}
|
}
|
||||||
@ -328,7 +332,7 @@ void ADC_IRQHandler(void)
|
|||||||
|
|
||||||
if (adc1_sr & ADC_SR_OVR) {
|
if (adc1_sr & ADC_SR_OVR) {
|
||||||
ADC_PT1000_PERIPH->SR &= ~ADC_SR_OVR;
|
ADC_PT1000_PERIPH->SR &= ~ADC_SR_OVR;
|
||||||
pt1000_error |= ADC_PT1000_OVERFLOW;
|
safety_controller_report_error(ERR_FLAG_MEAS_ADC_OVERFLOW);
|
||||||
/* Disable ADC in case of overrrun*/
|
/* Disable ADC in case of overrrun*/
|
||||||
adc_pt1000_disable();
|
adc_pt1000_disable();
|
||||||
}
|
}
|
||||||
@ -337,7 +341,7 @@ void ADC_IRQHandler(void)
|
|||||||
ADC_PT1000_PERIPH->SR &= ~ADC_SR_AWD;
|
ADC_PT1000_PERIPH->SR &= ~ADC_SR_AWD;
|
||||||
adc_watchdog_counter++;
|
adc_watchdog_counter++;
|
||||||
if (adc_watchdog_counter >= ADC_PT1000_WATCHDOG_SAMPLE_COUNT)
|
if (adc_watchdog_counter >= ADC_PT1000_WATCHDOG_SAMPLE_COUNT)
|
||||||
pt1000_error |= ADC_PT1000_WATCHDOG_ERROR;
|
safety_controller_report_error(ERR_FLAG_MEAS_ADC_WATCHDOG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <arm_math.h>
|
#include <arm_math.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <reflow-controller/safety/safety-controller.h>
|
||||||
|
|
||||||
enum calibration_shell_state {CAL_START = 0, CAL_WAIT_RES1, CAL_MEAS_RES1, CAL_WAIT_RES2, CAL_MEAS_RES2};
|
enum calibration_shell_state {CAL_START = 0, CAL_WAIT_RES1, CAL_MEAS_RES1, CAL_WAIT_RES2, CAL_MEAS_RES2};
|
||||||
|
|
||||||
@ -121,6 +122,8 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
|
|||||||
{
|
{
|
||||||
(void)arg;
|
(void)arg;
|
||||||
(void)len;
|
(void)len;
|
||||||
|
bool error_occured;
|
||||||
|
const enum safety_flag meas_adc_err_mask = ERR_FLAG_MEAS_ADC_OFF | ERR_FLAG_MEAS_ADC_WATCHDOG;
|
||||||
|
|
||||||
/* This stores the current state of the calibration process */
|
/* This stores the current state of the calibration process */
|
||||||
static enum calibration_shell_state cal_state = CAL_START;
|
static enum calibration_shell_state cal_state = CAL_START;
|
||||||
@ -139,7 +142,7 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
|
|||||||
switch (cal_state) {
|
switch (cal_state) {
|
||||||
case CAL_START:
|
case CAL_START:
|
||||||
/* Clear errors of PT1000 reading */
|
/* Clear errors of PT1000 reading */
|
||||||
adc_pt1000_clear_error();
|
safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
|
||||||
shellmatta_printf(shell, "Starting calibration: Insert 1000 Ohm calibration resistor and press ENTER\r\n");
|
shellmatta_printf(shell, "Starting calibration: Insert 1000 Ohm calibration resistor and press ENTER\r\n");
|
||||||
cal_state = CAL_WAIT_RES1;
|
cal_state = CAL_WAIT_RES1;
|
||||||
ret_val = SHELLMATTA_CONTINUE;
|
ret_val = SHELLMATTA_CONTINUE;
|
||||||
@ -154,7 +157,7 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
|
|||||||
cal_state = CAL_MEAS_RES1;
|
cal_state = CAL_MEAS_RES1;
|
||||||
ret_val = SHELLMATTA_BUSY;
|
ret_val = SHELLMATTA_BUSY;
|
||||||
shellmatta_printf(shell, "Measurement...\r\n");
|
shellmatta_printf(shell, "Measurement...\r\n");
|
||||||
adc_pt1000_clear_error();
|
safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
|
||||||
data_buffer = calibration_acquire_data_start(512UL, &flag);
|
data_buffer = calibration_acquire_data_start(512UL, &flag);
|
||||||
break;
|
break;
|
||||||
} else if (stdin_data[i] == '\x03') {
|
} else if (stdin_data[i] == '\x03') {
|
||||||
@ -179,8 +182,9 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
|
|||||||
cal_state = CAL_MEAS_RES1;
|
cal_state = CAL_MEAS_RES1;
|
||||||
} else if (res == 0) {
|
} else if (res == 0) {
|
||||||
shellmatta_printf(shell, "R=%.2f, Noise peak-peak: %.2f\r\n", mu, dev);
|
shellmatta_printf(shell, "R=%.2f, Noise peak-peak: %.2f\r\n", mu, dev);
|
||||||
if (adc_pt1000_check_error() != ADC_PT1000_NO_ERR) {
|
error_occured = safety_controller_get_flags_by_mask(meas_adc_err_mask);
|
||||||
shellmatta_printf(shell, "Error in resistance measurement: %d", adc_pt1000_check_error());
|
if (error_occured) {
|
||||||
|
shellmatta_printf(shell, "Error in resistance measurement");
|
||||||
ret_val = SHELLMATTA_OK;
|
ret_val = SHELLMATTA_OK;
|
||||||
cal_state = CAL_START;
|
cal_state = CAL_START;
|
||||||
} else {
|
} else {
|
||||||
@ -189,7 +193,7 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
|
|||||||
cal_state = CAL_WAIT_RES2;
|
cal_state = CAL_WAIT_RES2;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
shellmatta_printf(shell, "Error in resistance measurement: %d", adc_pt1000_check_error());
|
shellmatta_printf(shell, "Error in resistance measurement");
|
||||||
ret_val = SHELLMATTA_OK;
|
ret_val = SHELLMATTA_OK;
|
||||||
cal_state = CAL_START;
|
cal_state = CAL_START;
|
||||||
}
|
}
|
||||||
@ -204,7 +208,7 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
|
|||||||
cal_state = CAL_MEAS_RES2;
|
cal_state = CAL_MEAS_RES2;
|
||||||
ret_val = SHELLMATTA_BUSY;
|
ret_val = SHELLMATTA_BUSY;
|
||||||
shellmatta_printf(shell, "Measurement...\r\n");
|
shellmatta_printf(shell, "Measurement...\r\n");
|
||||||
adc_pt1000_clear_error();
|
safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
|
||||||
data_buffer = calibration_acquire_data_start(512UL, &flag);
|
data_buffer = calibration_acquire_data_start(512UL, &flag);
|
||||||
break;
|
break;
|
||||||
} else if (stdin_data[i] == '\x03') {
|
} else if (stdin_data[i] == '\x03') {
|
||||||
@ -229,8 +233,9 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
|
|||||||
cal_state = CAL_MEAS_RES2;
|
cal_state = CAL_MEAS_RES2;
|
||||||
} else if (res == 0) {
|
} else if (res == 0) {
|
||||||
shellmatta_printf(shell, "R=%.2f, Noise peak-peak: %.2f\r\n", mu2, dev2);
|
shellmatta_printf(shell, "R=%.2f, Noise peak-peak: %.2f\r\n", mu2, dev2);
|
||||||
if (adc_pt1000_check_error() != ADC_PT1000_NO_ERR) {
|
error_occured = safety_controller_get_flags_by_mask(meas_adc_err_mask);
|
||||||
shellmatta_printf(shell, "Error in resistance measurement: %d", adc_pt1000_check_error());
|
if (error_occured) {
|
||||||
|
shellmatta_printf(shell, "Error in resistance measurement");
|
||||||
ret_val = SHELLMATTA_OK;
|
ret_val = SHELLMATTA_OK;
|
||||||
cal_state = CAL_START;
|
cal_state = CAL_START;
|
||||||
} else {
|
} else {
|
||||||
@ -250,7 +255,7 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
|
|||||||
adc_pt1000_set_resistance_calibration(offset, sens_dev, true);
|
adc_pt1000_set_resistance_calibration(offset, sens_dev, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
shellmatta_printf(shell, "Error in resistance measurement: %d", adc_pt1000_check_error());
|
shellmatta_printf(shell, "Error in resistance measurement");
|
||||||
ret_val = SHELLMATTA_OK;
|
ret_val = SHELLMATTA_OK;
|
||||||
cal_state = CAL_START;
|
cal_state = CAL_START;
|
||||||
}
|
}
|
||||||
|
@ -90,8 +90,6 @@
|
|||||||
*/
|
*/
|
||||||
#define ADC_PT1000_WATCHDOG_SAMPLE_COUNT 25U
|
#define ADC_PT1000_WATCHDOG_SAMPLE_COUNT 25U
|
||||||
|
|
||||||
enum adc_pt1000_error {ADC_PT1000_NO_ERR= 0, ADC_PT1000_WATCHDOG_ERROR=(1UL<<0), ADC_PT1000_OVERFLOW=(1UL<<1), ADC_PT1000_INACTIVE = (1UL<<2)};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function sets up the ADC measurement fo the external PT1000 temperature sensor
|
* @brief This function sets up the ADC measurement fo the external PT1000 temperature sensor
|
||||||
*
|
*
|
||||||
@ -162,18 +160,6 @@ int adc_pt1000_stream_raw_value_to_memory(volatile float *adc_array, uint32_t le
|
|||||||
|
|
||||||
void adc_pt1000_convert_raw_value_array_to_resistance(float *resistance_dest, float *raw_source, uint32_t count);
|
void adc_pt1000_convert_raw_value_array_to_resistance(float *resistance_dest, float *raw_source, uint32_t count);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Check if the ADC measurement experienced any kind of error (DMA, Analog Watchdog, etc...)
|
|
||||||
*
|
|
||||||
* In case of an error, it may be necessary to call adc_pt1000_setup_meas() again in order to recover from the error
|
|
||||||
*/
|
|
||||||
enum adc_pt1000_error adc_pt1000_check_error();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Clear the error status of the PT1000 measurement
|
|
||||||
*/
|
|
||||||
void adc_pt1000_clear_error();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Disable the PT1000 measurement
|
* @brief Disable the PT1000 measurement
|
||||||
*/
|
*/
|
||||||
|
@ -35,6 +35,7 @@ enum safety_flag {
|
|||||||
ERR_FLAG_SAFETY_ADC = (1<<9),
|
ERR_FLAG_SAFETY_ADC = (1<<9),
|
||||||
ERR_FLAG_SYSTICK = (1<<10),
|
ERR_FLAG_SYSTICK = (1<<10),
|
||||||
ERR_FLAG_WTCHDG_FIRED = (1<<11),
|
ERR_FLAG_WTCHDG_FIRED = (1<<11),
|
||||||
|
ERR_FLAG_UNCAL = (1<<12),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum timing_monitor {
|
enum timing_monitor {
|
||||||
@ -80,4 +81,10 @@ enum analog_value_monitor {
|
|||||||
#define SAFETY_ADC_TEMP_LOW_LIM (0.0f)
|
#define SAFETY_ADC_TEMP_LOW_LIM (0.0f)
|
||||||
#define SAFETY_ADC_TEMP_HIGH_LIM (65.0f)
|
#define SAFETY_ADC_TEMP_HIGH_LIM (65.0f)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Key used to lock the safefety flags from external ack'ing
|
||||||
|
*/
|
||||||
|
#define MEAS_ADC_SAFETY_FLAG_KEY 0xe554dac3UL
|
||||||
|
|
||||||
#endif /* __SAFETY_CONFIG_H__ */
|
#endif /* __SAFETY_CONFIG_H__ */
|
||||||
|
@ -55,6 +55,8 @@ int safety_controller_handle();
|
|||||||
|
|
||||||
int safety_controller_report_error(enum safety_flag flag);
|
int safety_controller_report_error(enum safety_flag flag);
|
||||||
|
|
||||||
|
int safety_controller_report_error_with_key(enum safety_flag flag, uint32_t key);
|
||||||
|
|
||||||
void safety_controller_report_timing(enum timing_monitor monitor);
|
void safety_controller_report_timing(enum timing_monitor monitor);
|
||||||
|
|
||||||
void safety_controller_report_analog_value(enum analog_value_monitor monitor, float value);
|
void safety_controller_report_analog_value(enum analog_value_monitor monitor, float value);
|
||||||
@ -69,6 +71,8 @@ int safety_controller_ack_flag(enum safety_flag flag);
|
|||||||
|
|
||||||
int safety_controller_ack_flag_with_key(enum safety_flag flag, uint32_t key);
|
int safety_controller_ack_flag_with_key(enum safety_flag flag, uint32_t key);
|
||||||
|
|
||||||
|
bool safety_controller_get_flags_by_mask(enum safety_flag mask);
|
||||||
|
|
||||||
#endif /* __SAFETY_CONTROLLER_H__ */
|
#endif /* __SAFETY_CONTROLLER_H__ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -161,7 +161,7 @@ static inline void setup_system(void)
|
|||||||
|
|
||||||
setup_unused_pins();
|
setup_unused_pins();
|
||||||
|
|
||||||
|
safety_controller_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_shell_uart_input(shellmatta_handle_t shell_handle)
|
static void handle_shell_uart_input(shellmatta_handle_t shell_handle)
|
||||||
@ -219,6 +219,8 @@ int main(void)
|
|||||||
menu_wait_request = reflow_menu_handle();
|
menu_wait_request = reflow_menu_handle();
|
||||||
handle_shell_uart_input(shell_handle);
|
handle_shell_uart_input(shell_handle);
|
||||||
|
|
||||||
|
|
||||||
|
safety_controller_handle();
|
||||||
oven_driver_apply_power_level();
|
oven_driver_apply_power_level();
|
||||||
|
|
||||||
if (menu_wait_request)
|
if (menu_wait_request)
|
||||||
|
@ -83,6 +83,7 @@ static volatile struct error_flag flags[] = {
|
|||||||
ERR_FLAG_ENTRY(ERR_FLAG_SAFETY_ADC, true),
|
ERR_FLAG_ENTRY(ERR_FLAG_SAFETY_ADC, true),
|
||||||
ERR_FLAG_ENTRY(ERR_FLAG_SYSTICK, true),
|
ERR_FLAG_ENTRY(ERR_FLAG_SYSTICK, true),
|
||||||
ERR_FLAG_ENTRY(ERR_FLAG_WTCHDG_FIRED, true),
|
ERR_FLAG_ENTRY(ERR_FLAG_WTCHDG_FIRED, true),
|
||||||
|
ERR_FLAG_ENTRY(ERR_FLAG_UNCAL, false),
|
||||||
};
|
};
|
||||||
|
|
||||||
static volatile struct timing_mon timings[] = {
|
static volatile struct timing_mon timings[] = {
|
||||||
@ -183,6 +184,11 @@ static void safety_controller_process_checks()
|
|||||||
}
|
}
|
||||||
|
|
||||||
int safety_controller_report_error(enum safety_flag flag)
|
int safety_controller_report_error(enum safety_flag flag)
|
||||||
|
{
|
||||||
|
return safety_controller_report_error_with_key(flag, 0x0UL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int safety_controller_report_error_with_key(enum safety_flag flag, uint32_t key)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
@ -190,6 +196,7 @@ int safety_controller_report_error(enum safety_flag flag)
|
|||||||
for (i = 0; i < COUNT_OF(flags); i++) {
|
for (i = 0; i < COUNT_OF(flags); i++) {
|
||||||
if (flags[i].flag & flag) {
|
if (flags[i].flag & flag) {
|
||||||
flags[i].error_state = true;
|
flags[i].error_state = true;
|
||||||
|
flags[i].key = key;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -239,8 +246,14 @@ void safety_controller_report_analog_value(enum analog_value_monitor monitor, fl
|
|||||||
|
|
||||||
void safety_controller_init()
|
void safety_controller_init()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/* Init default flag states */
|
||||||
|
safety_controller_report_error_with_key(ERR_FLAG_MEAS_ADC_OFF | ERR_FLAG_MEAS_ADC_UNSTABLE,
|
||||||
|
MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
|
|
||||||
safety_adc_init();
|
safety_adc_init();
|
||||||
watchdog_setup(WATCHDOG_PRESCALER);
|
watchdog_setup(WATCHDOG_PRESCALER);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void safety_controller_check_stack()
|
static void safety_controller_check_stack()
|
||||||
@ -400,7 +413,7 @@ int safety_controller_ack_flag_with_key(enum safety_flag flag, uint32_t key)
|
|||||||
|
|
||||||
found_flag = find_error_flag(flag);
|
found_flag = find_error_flag(flag);
|
||||||
if (found_flag) {
|
if (found_flag) {
|
||||||
if (!found_flag->persistent && found_flag->key == key) {
|
if (!found_flag->persistent && (found_flag->key == key || !key)) {
|
||||||
found_flag->error_state = false;
|
found_flag->error_state = false;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else {
|
} else {
|
||||||
@ -411,4 +424,19 @@ int safety_controller_ack_flag_with_key(enum safety_flag flag, uint32_t key)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool safety_controller_get_flags_by_mask(enum safety_flag mask)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
for (i = 0; i < COUNT_OF(flags); i++) {
|
||||||
|
if (flags[i].flag & mask) {
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -128,7 +128,6 @@ static shellmatta_retCode_t shell_cmd_pt1000_res(const shellmatta_handle_t han
|
|||||||
(void)length;
|
(void)length;
|
||||||
float resistance;
|
float resistance;
|
||||||
int pt1000_status;
|
int pt1000_status;
|
||||||
enum adc_pt1000_error pt1000_flags;
|
|
||||||
char display_status[100];
|
char display_status[100];
|
||||||
float temp;
|
float temp;
|
||||||
int temp_conv_status;
|
int temp_conv_status;
|
||||||
@ -141,13 +140,7 @@ static shellmatta_retCode_t shell_cmd_pt1000_res(const shellmatta_handle_t han
|
|||||||
if (pt1000_status == 2) {
|
if (pt1000_status == 2) {
|
||||||
strcat(display_status, " UNSTABLE ");
|
strcat(display_status, " UNSTABLE ");
|
||||||
} else if (pt1000_status) {
|
} else if (pt1000_status) {
|
||||||
pt1000_flags = adc_pt1000_check_error();
|
strcpy(display_status, "ERROR");
|
||||||
if (pt1000_flags & ADC_PT1000_INACTIVE)
|
|
||||||
strcat(display_status, " DEACTIVATED ");
|
|
||||||
else if (pt1000_flags & ADC_PT1000_WATCHDOG_ERROR)
|
|
||||||
strcat(display_status, " WATCHDOG ");
|
|
||||||
else if (pt1000_flags & ADC_PT1000_OVERFLOW)
|
|
||||||
strcat(display_status, " OVERFLOW ");
|
|
||||||
} else {
|
} else {
|
||||||
strcpy(display_status, "VALID");
|
strcpy(display_status, "VALID");
|
||||||
}
|
}
|
||||||
@ -171,17 +164,6 @@ static shellmatta_retCode_t shell_cmd_pt1000_res(const shellmatta_handle_t han
|
|||||||
|
|
||||||
return SHELLMATTA_OK;
|
return SHELLMATTA_OK;
|
||||||
}
|
}
|
||||||
static shellmatta_retCode_t shell_cmd_clear_error_status(const shellmatta_handle_t handle, const char *arguments,
|
|
||||||
uint32_t length)
|
|
||||||
{
|
|
||||||
(void)arguments;
|
|
||||||
(void)length;
|
|
||||||
(void)handle;
|
|
||||||
|
|
||||||
adc_pt1000_clear_error();
|
|
||||||
|
|
||||||
return SHELLMATTA_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static shellmatta_retCode_t shell_cmd_uptime(const shellmatta_handle_t handle,
|
static shellmatta_retCode_t shell_cmd_uptime(const shellmatta_handle_t handle,
|
||||||
const char *arguments,
|
const char *arguments,
|
||||||
@ -401,21 +383,13 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.cmdFct = shell_cmd_pt1000_res_loop,
|
.cmdFct = shell_cmd_pt1000_res_loop,
|
||||||
.next = &cmd[3],
|
.next = &cmd[3],
|
||||||
},
|
},
|
||||||
{
|
|
||||||
.cmd = "pt1000-clear-error",
|
|
||||||
.cmdAlias = "pt-clear",
|
|
||||||
.helpText = "Clear error status of PT1000 reading",
|
|
||||||
.usageText = NULL,
|
|
||||||
.cmdFct = shell_cmd_clear_error_status,
|
|
||||||
.next = &cmd[4],
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
.cmd = "digio-get",
|
.cmd = "digio-get",
|
||||||
.cmdAlias = "dg",
|
.cmdAlias = "dg",
|
||||||
.helpText = "Read all digital input/output ports",
|
.helpText = "Read all digital input/output ports",
|
||||||
.usageText = NULL,
|
.usageText = NULL,
|
||||||
.cmdFct = shell_cmd_digio_get,
|
.cmdFct = shell_cmd_digio_get,
|
||||||
.next = &cmd[5],
|
.next = &cmd[4],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "digio-set",
|
.cmd = "digio-set",
|
||||||
@ -423,7 +397,7 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.helpText = "Set DIGIO Port",
|
.helpText = "Set DIGIO Port",
|
||||||
.usageText = "digio-set <num> <state>",
|
.usageText = "digio-set <num> <state>",
|
||||||
.cmdFct = shell_cmd_digio_set,
|
.cmdFct = shell_cmd_digio_set,
|
||||||
.next = &cmd[6],
|
.next = &cmd[5],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "uptime",
|
.cmd = "uptime",
|
||||||
@ -431,7 +405,7 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.helpText = "Get uptime in seconds",
|
.helpText = "Get uptime in seconds",
|
||||||
.usageText = "",
|
.usageText = "",
|
||||||
.cmdFct = shell_cmd_uptime,
|
.cmdFct = shell_cmd_uptime,
|
||||||
.next = &cmd[7],
|
.next = &cmd[6],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "calibrate",
|
.cmd = "calibrate",
|
||||||
@ -439,7 +413,7 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.helpText = "Calibrate resistance measurement",
|
.helpText = "Calibrate resistance measurement",
|
||||||
.usageText = "",
|
.usageText = "",
|
||||||
.cmdFct = shell_cmd_cal,
|
.cmdFct = shell_cmd_cal,
|
||||||
.next = &cmd[8],
|
.next = &cmd[7],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "meminfo",
|
.cmd = "meminfo",
|
||||||
@ -447,7 +421,7 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.helpText = "Get information about memory usage",
|
.helpText = "Get information about memory usage",
|
||||||
.usageText = "",
|
.usageText = "",
|
||||||
.cmdFct = shell_meminfo,
|
.cmdFct = shell_meminfo,
|
||||||
.next = &cmd[9],
|
.next = &cmd[8],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "rotary-encoder",
|
.cmd = "rotary-encoder",
|
||||||
@ -455,7 +429,7 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.helpText = "Get current rotary encoder value",
|
.helpText = "Get current rotary encoder value",
|
||||||
.usageText = "",
|
.usageText = "",
|
||||||
.cmdFct = shell_cmd_rot,
|
.cmdFct = shell_cmd_rot,
|
||||||
.next = &cmd[10],
|
.next = &cmd[9],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "ls",
|
.cmd = "ls",
|
||||||
@ -463,7 +437,7 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.helpText = "List filesystem contents",
|
.helpText = "List filesystem contents",
|
||||||
.usageText = "",
|
.usageText = "",
|
||||||
.cmdFct = shell_cmd_ls,
|
.cmdFct = shell_cmd_ls,
|
||||||
.next = &cmd[11],
|
.next = &cmd[10],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "reset",
|
.cmd = "reset",
|
||||||
@ -471,7 +445,7 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.helpText = "Reset controller",
|
.helpText = "Reset controller",
|
||||||
.usageText = "reset",
|
.usageText = "reset",
|
||||||
.cmdFct = shell_cmd_reset,
|
.cmdFct = shell_cmd_reset,
|
||||||
.next = &cmd[12],
|
.next = &cmd[11],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "cat",
|
.cmd = "cat",
|
||||||
@ -479,7 +453,7 @@ static shellmatta_cmd_t cmd[14] = {
|
|||||||
.helpText = "Print file contents",
|
.helpText = "Print file contents",
|
||||||
.usageText = "cat <path>",
|
.usageText = "cat <path>",
|
||||||
.cmdFct = shell_cmd_cat,
|
.cmdFct = shell_cmd_cat,
|
||||||
.next = &cmd[13],
|
.next = &cmd[12],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = "safety-adc",
|
.cmd = "safety-adc",
|
||||||
|
Loading…
Reference in New Issue
Block a user