|
|
@ -11,136 +11,162 @@ |
|
|
|
#include "adc.h" |
|
|
|
#include "adc.h" |
|
|
|
#include "snprintf.h" |
|
|
|
#include "snprintf.h" |
|
|
|
#include "app_safety.h" |
|
|
|
#include "app_safety.h" |
|
|
|
|
|
|
|
#include "eeprom_emul_types.h" |
|
|
|
|
|
|
|
#include "eeprom_emul.h" |
|
|
|
|
|
|
|
#include "ee_addresses.h" |
|
|
|
|
|
|
|
#include "transmute.h" |
|
|
|
|
|
|
|
|
|
|
|
/* DMA dest */ |
|
|
|
/* DMA dest */ |
|
|
|
static volatile uint16_t adc_values[4]; |
|
|
|
static volatile uint16_t adc_values[4]; |
|
|
|
|
|
|
|
|
|
|
|
const float V_REFINT = 1.23f; |
|
|
|
const float V_REFINT = 1.23f; |
|
|
|
|
|
|
|
|
|
|
|
#define AVERAGEBUF_DEPTH 8 |
|
|
|
#define AVERAGEBUF_DEPTH 16 |
|
|
|
#define OVENTEMP_HISTORY_DEPTH 5 |
|
|
|
#define OVENTEMP_HISTORY_DEPTH 20 |
|
|
|
|
|
|
|
|
|
|
|
static struct App { |
|
|
|
static struct App { |
|
|
|
float oven_temp; |
|
|
|
float oven_temp; |
|
|
|
float soc_temp; |
|
|
|
float soc_temp; |
|
|
|
float v_sensor; |
|
|
|
float v_sensor; |
|
|
|
|
|
|
|
float cal_a; |
|
|
|
|
|
|
|
float cal_b; |
|
|
|
uint16_t adc_averagebuf[AVERAGEBUF_DEPTH * 4]; |
|
|
|
uint16_t adc_averagebuf[AVERAGEBUF_DEPTH * 4]; |
|
|
|
uint8_t averagebuf_ptr; |
|
|
|
uint8_t averagebuf_ptr; |
|
|
|
float adc_averages[4]; |
|
|
|
float adc_averages[4]; |
|
|
|
float oventemp_history[OVENTEMP_HISTORY_DEPTH]; |
|
|
|
float oventemp_history[OVENTEMP_HISTORY_DEPTH]; |
|
|
|
uint8_t oventemp_history_ptr; |
|
|
|
uint8_t oventemp_history_ptr; |
|
|
|
} s_analog = {}; |
|
|
|
} s_analog = { |
|
|
|
|
|
|
|
.cal_a = 1.0f, |
|
|
|
|
|
|
|
.cal_b = 0.0f, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
#define TSENSE_LOOKUP_LEN 101 |
|
|
|
#define TSENSE_LOOKUP_LEN 101 |
|
|
|
#define TSENSE_T_STEP 5.0f |
|
|
|
#define TSENSE_T_STEP 5.0f |
|
|
|
#define TSENSE_T_MIN 0.0f |
|
|
|
#define TSENSE_T_MIN 0.0f |
|
|
|
#define TSENSE_T_MAX 500.0f |
|
|
|
#define TSENSE_T_MAX 500.0f |
|
|
|
static const float TSENSE_LOOKUP[TSENSE_LOOKUP_LEN] = { |
|
|
|
static const float TSENSE_LOOKUP[TSENSE_LOOKUP_LEN] = { |
|
|
|
0.092678405931418f, |
|
|
|
0.0909090909090909f, |
|
|
|
0.0943174479327356f, |
|
|
|
0.0925200328471449f, |
|
|
|
0.095948157844312f, |
|
|
|
0.0941228958173389f, |
|
|
|
0.0975706768542549f, |
|
|
|
0.0957178169362106f, |
|
|
|
0.0991848957506647f, |
|
|
|
0.0973046872002769f, |
|
|
|
0.100791037522732f, |
|
|
|
0.0988837241910161f, |
|
|
|
0.102388993070241f, |
|
|
|
0.100454819038946f, |
|
|
|
0.103978983136042f, |
|
|
|
0.102018187184848f, |
|
|
|
0.105560980458654f, |
|
|
|
0.103573800259031f, |
|
|
|
0.107135039851509f, |
|
|
|
0.105121710606384f, |
|
|
|
0.108701215616829f, |
|
|
|
0.106661970090864f, |
|
|
|
0.110259642413441f, |
|
|
|
0.108194709632656f, |
|
|
|
0.111810211533421f, |
|
|
|
0.109719820815089f, |
|
|
|
0.113353137226489f, |
|
|
|
0.111237512887056f, |
|
|
|
0.114888310929339f, |
|
|
|
0.112747677594865f, |
|
|
|
0.11641594480226f, |
|
|
|
0.114250522193605f, |
|
|
|
0.117936009906507f, |
|
|
|
0.115746016789507f, |
|
|
|
0.119448557132363f, |
|
|
|
0.117234210034522f, |
|
|
|
0.120953636903929f, |
|
|
|
0.118715150141415f, |
|
|
|
0.122451377845456f, |
|
|
|
0.120188962295434f, |
|
|
|
0.12394167187544f, |
|
|
|
0.121655538774297f, |
|
|
|
0.125424725109556f, |
|
|
|
0.123115081061434f, |
|
|
|
0.126900429638119f, |
|
|
|
0.124567481621389f, |
|
|
|
0.128368989630084f, |
|
|
|
0.126012940077612f, |
|
|
|
0.129830374697352f, |
|
|
|
0.127451425220842f, |
|
|
|
0.131284632150064f, |
|
|
|
0.128882982328346f, |
|
|
|
0.132731808872517f, |
|
|
|
0.13030765627567f, |
|
|
|
0.134172027901771f, |
|
|
|
0.131725566931108f, |
|
|
|
0.135605181883591f, |
|
|
|
0.133136607355006f, |
|
|
|
0.13703146935069f, |
|
|
|
0.134540971782401f, |
|
|
|
0.138450783142958f, |
|
|
|
0.135938553479917f, |
|
|
|
0.139863319976468f, |
|
|
|
0.137329544944786f, |
|
|
|
0.14126904821384f, |
|
|
|
0.138713913835562f, |
|
|
|
0.142668011892657f, |
|
|
|
0.140091702340679f, |
|
|
|
0.144060254660872f, |
|
|
|
0.141462952280536f, |
|
|
|
0.145445894373796f, |
|
|
|
0.142827778585901f, |
|
|
|
0.146824824486877f, |
|
|
|
0.144186075171443f, |
|
|
|
0.14819723645253f, |
|
|
|
0.145538029496198f, |
|
|
|
0.149563023938454f, |
|
|
|
0.146883535696824f, |
|
|
|
0.150922376699229f, |
|
|
|
0.148222779606307f, |
|
|
|
0.15227526202401f, |
|
|
|
0.149555727912261f, |
|
|
|
0.153621720954182f, |
|
|
|
0.150882419971517f, |
|
|
|
0.15496179417407f, |
|
|
|
0.152202894803216f, |
|
|
|
0.156295594725426f, |
|
|
|
0.153517262745702f, |
|
|
|
0.157623016940038f, |
|
|
|
0.154825418625535f, |
|
|
|
0.158944245649448f, |
|
|
|
0.156127543558165f, |
|
|
|
0.160259175412251f, |
|
|
|
0.157423532604634f, |
|
|
|
0.16156798947087f, |
|
|
|
0.158713565356767f, |
|
|
|
0.162870654195634f, |
|
|
|
0.159997607673187f, |
|
|
|
0.164167207880495f, |
|
|
|
0.161275696311014f, |
|
|
|
0.165457688491696f, |
|
|
|
0.162547867717066f, |
|
|
|
0.166742204592451f, |
|
|
|
0.163814227951767f, |
|
|
|
0.168020651444079f, |
|
|
|
0.165074672799026f, |
|
|
|
0.169293207677971f, |
|
|
|
0.166329377427284f, |
|
|
|
0.170559768793747f, |
|
|
|
0.167578237864685f, |
|
|
|
0.171820511933356f, |
|
|
|
0.168821427850084f, |
|
|
|
0.173075402684405f, |
|
|
|
0.170058912538152f, |
|
|
|
0.174324476817747f, |
|
|
|
0.171290726295724f, |
|
|
|
0.175567769803026f, |
|
|
|
0.172516903204089f, |
|
|
|
0.176805386030345f, |
|
|
|
0.17373754533289f, |
|
|
|
0.178037221732226f, |
|
|
|
0.174952549458501f, |
|
|
|
0.179263449725904f, |
|
|
|
0.176162085166716f, |
|
|
|
0.180483966491086f, |
|
|
|
0.177366049485545f, |
|
|
|
0.181698943447122f, |
|
|
|
0.178564610657697f, |
|
|
|
0.182908345518766f, |
|
|
|
0.179757733244091f, |
|
|
|
0.184112206156428f, |
|
|
|
0.180945449410727f, |
|
|
|
0.185310558533273f, |
|
|
|
0.182127791060477f, |
|
|
|
0.186503503145257f, |
|
|
|
0.183304856534839f, |
|
|
|
0.187690937227925f, |
|
|
|
0.184476543628915f, |
|
|
|
0.188873028139146f, |
|
|
|
0.185643016681207f, |
|
|
|
0.190049673368296f, |
|
|
|
0.186804173743842f, |
|
|
|
0.191221038959601f, |
|
|
|
0.18796017789194f, |
|
|
|
0.192387089280576f, |
|
|
|
0.18911099318983f, |
|
|
|
0.193547855644572f, |
|
|
|
0.190256649774341f, |
|
|
|
0.194703369109397f, |
|
|
|
0.191397177539504f, |
|
|
|
0.195853726532112f, |
|
|
|
0.192532671339319f, |
|
|
|
0.196998826174689f, |
|
|
|
0.193663030006298f, |
|
|
|
0.19813883026229f, |
|
|
|
0.194788412940845f, |
|
|
|
0.199273637315452f, |
|
|
|
0.195908719236171f, |
|
|
|
0.200403408323351f, |
|
|
|
0.197024107102852f, |
|
|
|
0.201528107189346f, |
|
|
|
0.198134540194308f, |
|
|
|
0.20264776325594f, |
|
|
|
0.19924004677399f, |
|
|
|
0.203762405629782f, |
|
|
|
0.200340654881021f, |
|
|
|
0.204872127762998f, |
|
|
|
0.201436456102762f, |
|
|
|
0.205976828960191f, |
|
|
|
0.202527350321362f, |
|
|
|
0.207076666615101f, |
|
|
|
0.203613492284647f, |
|
|
|
0.208171540293999f, |
|
|
|
0.204694782137667f, |
|
|
|
0.209261606226334f, |
|
|
|
0.205771373506423f, |
|
|
|
0.210346827933364f, |
|
|
|
0.206843229708988f, |
|
|
|
0.211427232937629f, |
|
|
|
0.20791037727704f, |
|
|
|
0.212502848543705f, |
|
|
|
0.208972842534733f, |
|
|
|
0.213573765013592f, |
|
|
|
0.210030714005839f, |
|
|
|
0.214639882704581f, |
|
|
|
0.211083892628833f, |
|
|
|
0.215701354457324f, |
|
|
|
0.212132528763072f, |
|
|
|
0.216758080892489f, |
|
|
|
0.213176523610881f, |
|
|
|
0.217810213752734f, |
|
|
|
0.214216026472748f, |
|
|
|
0.218857716249547f, |
|
|
|
0.215251000398025f, |
|
|
|
0.219900614222686f, |
|
|
|
0.216281470315524f, |
|
|
|
0.220938933310224f, |
|
|
|
0.21730746096184f, |
|
|
|
0.221972760781578f, |
|
|
|
0.218329057984116f, |
|
|
|
0.223001998051553f, |
|
|
|
0.219346163379138f, |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
void app_analog_init() |
|
|
|
void app_analog_init() |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
// read calibration constants
|
|
|
|
|
|
|
|
uint32_t c = 0; |
|
|
|
|
|
|
|
if (EE_OK == EE_ReadVariable32bits(EE_ADDR_CAL_A, &c)) { |
|
|
|
|
|
|
|
s_analog.cal_a = ((x32_t) { .u = c }).f; |
|
|
|
|
|
|
|
PRINTF("ADC calib a read from EE: %f\r\n", s_analog.cal_a); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (EE_OK == EE_ReadVariable32bits(EE_ADDR_CAL_B, &c)) { |
|
|
|
|
|
|
|
s_analog.cal_b = ((x32_t) { .u = c }).f; |
|
|
|
|
|
|
|
PRINTF("ADC calib b read from EE: %f\r\n", s_analog.cal_b); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (s_analog.cal_a == 0.0f || s_analog.cal_b == 0.0f) { |
|
|
|
|
|
|
|
PRINTF("ADC invalid calib, reset\r\n"); |
|
|
|
|
|
|
|
s_analog.cal_a = 1.0f; |
|
|
|
|
|
|
|
s_analog.cal_b = 0.0f; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LL_ADC_Enable(ADC_TEMP); |
|
|
|
LL_ADC_Enable(ADC_TEMP); |
|
|
|
|
|
|
|
|
|
|
|
LL_ADC_StartCalibration(ADC_TEMP); |
|
|
|
LL_ADC_StartCalibration(ADC_TEMP); |
|
|
@ -203,6 +229,13 @@ void app_temp_sample() |
|
|
|
s_analog.adc_averages[2] = (float) sums[2] / count; |
|
|
|
s_analog.adc_averages[2] = (float) sums[2] / count; |
|
|
|
s_analog.adc_averages[3] = (float) sums[3] / count; |
|
|
|
s_analog.adc_averages[3] = (float) sums[3] / count; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PRINTF("%f\t%f\t%f\t%f\r\n", |
|
|
|
|
|
|
|
s_analog.adc_averages[0], |
|
|
|
|
|
|
|
s_analog.adc_averages[1], |
|
|
|
|
|
|
|
s_analog.adc_averages[2], |
|
|
|
|
|
|
|
s_analog.adc_averages[3] |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
/* r_pt100, r_ref, internal_temp, v_ref_int */ |
|
|
|
/* r_pt100, r_ref, internal_temp, v_ref_int */ |
|
|
|
float refint = s_analog.adc_averages[3]; |
|
|
|
float refint = s_analog.adc_averages[3]; |
|
|
|
float scale = V_REFINT / refint; |
|
|
|
float scale = V_REFINT / refint; |
|
|
@ -217,7 +250,11 @@ void app_temp_sample() |
|
|
|
|
|
|
|
|
|
|
|
// using a voltage divider, so assuming the reference resistor is measured well,
|
|
|
|
// using a voltage divider, so assuming the reference resistor is measured well,
|
|
|
|
// we can just use the ratio and the exact voltage value is not important.
|
|
|
|
// we can just use the ratio and the exact voltage value is not important.
|
|
|
|
float actual_temp = val_to_c(s_analog.adc_averages[0] / s_analog.adc_averages[1]); |
|
|
|
|
|
|
|
|
|
|
|
float x = s_analog.adc_averages[0] / s_analog.adc_averages[1]; |
|
|
|
|
|
|
|
float y = s_analog.cal_a * x + s_analog.cal_b; |
|
|
|
|
|
|
|
float actual_temp = val_to_c(y); |
|
|
|
|
|
|
|
PRINTF("Compensated x %f -> y %f, temp %f C\r\n", x, y, actual_temp); |
|
|
|
|
|
|
|
|
|
|
|
s_analog.oventemp_history[s_analog.oventemp_history_ptr] = actual_temp; |
|
|
|
s_analog.oventemp_history[s_analog.oventemp_history_ptr] = actual_temp; |
|
|
|
s_analog.oventemp_history_ptr = (s_analog.oventemp_history_ptr + 1) % OVENTEMP_HISTORY_DEPTH; |
|
|
|
s_analog.oventemp_history_ptr = (s_analog.oventemp_history_ptr + 1) % OVENTEMP_HISTORY_DEPTH; |
|
|
|