Add conversion function for resistance to temperature conversion and add it to thept command of the shell
This commit is contained in:
parent
92526e71b2
commit
7df97831be
@ -43,6 +43,8 @@ CFILES += stm-periph/unique-id.c
|
|||||||
|
|
||||||
CFILES += calibration.c
|
CFILES += calibration.c
|
||||||
|
|
||||||
|
CFILES += temp-converter.c
|
||||||
|
|
||||||
DEFINES += -DDEBUGBUILD
|
DEFINES += -DDEBUGBUILD
|
||||||
#TODO
|
#TODO
|
||||||
|
|
||||||
|
31
stm-firmware/include/reflow-controller/temp-converter.h
Normal file
31
stm-firmware/include/reflow-controller/temp-converter.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* Reflow Oven Controller
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 Mario Hüttel <mario.huettel@gmx.net>
|
||||||
|
*
|
||||||
|
* This file is part of the reflow Oven Controller Project.
|
||||||
|
*
|
||||||
|
* The reflow oven controller is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* GDSII-Converter is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GDSII-Converter. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TEMP_CONVERTER_H__
|
||||||
|
#define __TEMP_CONVERTER_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Convert PT1000 resistance to temperature in degrees celsius
|
||||||
|
* @param resistance PT1000 resistance value
|
||||||
|
* @param[out] temp_out Temperature output
|
||||||
|
* @return 0 if ok, -1 if value is below conversion range, 1 if value is above conversion range,-1000 in case of pointer error
|
||||||
|
*/
|
||||||
|
int temp_converter_convert_resistance_to_temp(float resistance, float *temp_out);
|
||||||
|
|
||||||
|
#endif /* __TEMP_CONVERTER_H__ */
|
@ -8,6 +8,7 @@
|
|||||||
#include <reflow-controller/systick.h>
|
#include <reflow-controller/systick.h>
|
||||||
#include <stm-periph/unique-id.h>
|
#include <stm-periph/unique-id.h>
|
||||||
#include <reflow-controller/calibration.h>
|
#include <reflow-controller/calibration.h>
|
||||||
|
#include <reflow-controller/temp-converter.h>
|
||||||
|
|
||||||
#ifndef GIT_VER
|
#ifndef GIT_VER
|
||||||
#define GIT_VER "VERSION NOT SET"
|
#define GIT_VER "VERSION NOT SET"
|
||||||
@ -106,6 +107,9 @@ static shellmatta_retCode_t shell_cmd_pt1000_res(const shellmatta_handle_t han
|
|||||||
int pt1000_status;
|
int pt1000_status;
|
||||||
enum adc_pt1000_error pt1000_flags;
|
enum adc_pt1000_error pt1000_flags;
|
||||||
char display_status[100];
|
char display_status[100];
|
||||||
|
float temp;
|
||||||
|
int temp_conv_status;
|
||||||
|
const char *temp_prefix;
|
||||||
|
|
||||||
display_status[0] = 0;
|
display_status[0] = 0;
|
||||||
|
|
||||||
@ -125,7 +129,22 @@ static shellmatta_retCode_t shell_cmd_pt1000_res(const shellmatta_handle_t han
|
|||||||
strcpy(display_status, "VALID");
|
strcpy(display_status, "VALID");
|
||||||
}
|
}
|
||||||
|
|
||||||
shellmatta_printf(handle, "PT1000 resistance: %.2f Ohm [%s]\r\n", resistance, display_status);
|
temp_conv_status = temp_converter_convert_resistance_to_temp(resistance, &temp);
|
||||||
|
switch (temp_conv_status) {
|
||||||
|
case 1:
|
||||||
|
temp_prefix = ">";
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
temp_prefix = "<";
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
/* Expected fallthrough */
|
||||||
|
default:
|
||||||
|
temp_prefix = "";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
shellmatta_printf(handle, "PT1000 resistance: %.2f Ohm (%s%.1f °C) [%s]\r\n", resistance, temp_prefix,temp, display_status);
|
||||||
|
|
||||||
return SHELLMATTA_OK;
|
return SHELLMATTA_OK;
|
||||||
}
|
}
|
||||||
|
74
stm-firmware/temp-converter.c
Normal file
74
stm-firmware/temp-converter.c
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/* Reflow Oven Controller
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 Mario Hüttel <mario.huettel@gmx.net>
|
||||||
|
*
|
||||||
|
* This file is part of the reflow Oven Controller Project.
|
||||||
|
*
|
||||||
|
* The reflow oven controller is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* GDSII-Converter is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GDSII-Converter. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <reflow-controller/temp-converter.h>
|
||||||
|
#include <reflow-controller/temp-converter-data.h>
|
||||||
|
#include <helper-macros/helper-macros.h>
|
||||||
|
|
||||||
|
static const float temp_lookup[(TEMP_CONVERSION_MAX_RES-TEMP_CONVERSION_MIN_RES) / TEMP_CONVERSION_RES_STEP+1] = {TEMP_CONVERSION_ARRAY_DATA};
|
||||||
|
|
||||||
|
int temp_converter_convert_resistance_to_temp(float resistance, float *temp_out)
|
||||||
|
{
|
||||||
|
int ret_val;
|
||||||
|
unsigned int i;
|
||||||
|
unsigned int lower_idx = COUNT_OF(temp_lookup) - 1;
|
||||||
|
float diff_to_low_resistance;
|
||||||
|
float diff_high_low;
|
||||||
|
float low;
|
||||||
|
|
||||||
|
/* Check pointer */
|
||||||
|
if (!temp_out)
|
||||||
|
return -1000;
|
||||||
|
|
||||||
|
if (resistance < TEMP_CONVERSION_MIN_RES) {
|
||||||
|
*temp_out = temp_lookup[0];
|
||||||
|
ret_val = -1;
|
||||||
|
goto return_ret_val;
|
||||||
|
} else if (resistance > TEMP_CONVERSION_MAX_RES) {
|
||||||
|
*temp_out = temp_lookup[COUNT_OF(temp_lookup)-1];
|
||||||
|
ret_val = 1;
|
||||||
|
goto return_ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Resistance is in range */
|
||||||
|
ret_val = 0;
|
||||||
|
|
||||||
|
/* Calculate lower index for given reistance */
|
||||||
|
for (i = 1; i < COUNT_OF(temp_lookup); i++) {
|
||||||
|
if (resistance <= TEMP_CONVERSION_MIN_RES + TEMP_CONVERSION_RES_STEP * i) {
|
||||||
|
lower_idx = i - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the lower temperature limit of the current range */
|
||||||
|
low = temp_lookup[lower_idx];
|
||||||
|
|
||||||
|
/* Difference to higher limit */
|
||||||
|
diff_high_low = temp_lookup[lower_idx+1] - low;
|
||||||
|
|
||||||
|
/* Resistance difference to lower limit's resistance value */
|
||||||
|
diff_to_low_resistance = resistance - (float)(TEMP_CONVERSION_MIN_RES + TEMP_CONVERSION_RES_STEP * lower_idx);
|
||||||
|
|
||||||
|
/* Calculate output temperature */
|
||||||
|
*temp_out = (diff_to_low_resistance / TEMP_CONVERSION_RES_STEP) * diff_high_low + low;
|
||||||
|
|
||||||
|
return_ret_val:
|
||||||
|
return ret_val;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user