From f56788f66689edf33b5c27a6db2e35cbd0b98ec4 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Wed, 14 Apr 2021 14:37:03 +0200 Subject: [PATCH] added round_to_E_series function to eseries lib. --- lib/.eseries.c.kate-swp | Bin 65 -> 0 bytes lib/eseries.c | 50 ++++++++++++++++++++++++++++++++++++++++ lib/eseries.h | 6 ++++- lib/max_functions.c | 2 +- 4 files changed, 56 insertions(+), 2 deletions(-) delete mode 100644 lib/.eseries.c.kate-swp diff --git a/lib/.eseries.c.kate-swp b/lib/.eseries.c.kate-swp deleted file mode 100644 index ca10a5878168849fb527079681dc4aef6094d3bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?Vn+27i`Hf$e@!`}M&y(I^B81E@|>k0M* O%BTY|2(Tysfhz!X5fPyP diff --git a/lib/eseries.c b/lib/eseries.c index bf858da..9504290 100644 --- a/lib/eseries.c +++ b/lib/eseries.c @@ -38,4 +38,54 @@ ESeriesMaxValue get_E_MAX(ESeries E_series) { double round_to_E_series (double continuous_value, ESeries E_series) { + /* + * check for range. An E series is defined within one decade. + * values from 1 to 10 are accepted + */ + if (continuous_value >= 10 || continuous_value < 1) { + printf("eseries:round_to_E_series: Value out of range.\n"); + return E_NIL; + } + + double e_value = 0.0; + + // set the max array index for given e series. + unsigned int e_max_values = get_E_MAX(E_series); + if (e_max_values == E_NIL) { + printf("eseries:round_to_E_series: Unknown E series.\n"); + return E_NIL; + } + + int upper_e_limit = e_max_values; + int lower_e_limit = 0; + + for (int i = 0 ; i < log2((e_max_values/3)); i++) { + + if (continuous_value < E_values[E_series][((upper_e_limit - lower_e_limit + 1) / 2) + lower_e_limit]) { + upper_e_limit = ((upper_e_limit - lower_e_limit + 1) / 2) + lower_e_limit - 1; + } + else { + lower_e_limit = ((upper_e_limit - lower_e_limit + 1) / 2) + lower_e_limit; + } + } + + if (continuous_value < E_values[E_series][lower_e_limit + 1]) + { + if (fabs(continuous_value - E_values[E_series][lower_e_limit]) < fabs(continuous_value - E_values[E_series][lower_e_limit + 1])) { + e_value = E_values[E_series][lower_e_limit]; + } + else { + e_value = E_values[E_series][lower_e_limit + 1]; + } + } + else { + if (fabs(continuous_value - E_values[E_series][upper_e_limit]) < fabs(continuous_value - E_values[E_series][upper_e_limit - 1])) { + e_value = E_values[E_series][upper_e_limit]; + } + else { + e_value = E_values[E_series][upper_e_limit - 1]; + } + } + + return e_value; } diff --git a/lib/eseries.h b/lib/eseries.h index ce8af7c..49e9bdb 100644 --- a/lib/eseries.h +++ b/lib/eseries.h @@ -2,6 +2,10 @@ #ifndef ESERIES_H #define ESERIES_H +#include +#include +#include + double E3_values[3] = { 1.0, 2.2, 4.7 }; double E6_values[6] = { 1.0, 1.5, 2.2, 3.3, 4.7, 6.8 }; @@ -19,7 +23,7 @@ double E192_values[192] = { 1.00, 1.01, 1.02, 1.04, 1.05, 1.06, 1.07, 1.09, 1.10 double *E_values[7] = {E3_values, E6_values, E12_values, E24_values, E48_values, E96_values, E192_values}; typedef enum {E3, E6, E12, E24, E48, E96, E192} ESeries; -typedef enum {E_NIL=0, E3_MAX=3, E6_MAX=6, E12_MAX=12, E24_MAX=24, E48_MAX=48, E96_MAX=96, E192_MAX=192} ESeriesMaxValue; +typedef enum {E_NIL=0, E3_MAX=2, E6_MAX=5, E12_MAX=11, E24_MAX=23, E48_MAX=47, E96_MAX=95, E192_MAX=191} ESeriesMaxValue; extern ESeriesMaxValue get_E_MAX(ESeries E_series); diff --git a/lib/max_functions.c b/lib/max_functions.c index 24c364c..0069284 100644 --- a/lib/max_functions.c +++ b/lib/max_functions.c @@ -43,7 +43,7 @@ int set_output_voltage(double setpoint_voltage, ESeries E_resistors) { R_low_decade_w = i_low; - for (int j_low = 0; j_low < e_max_values; j_low++) { + for (int j_low = 0; j_low <= e_max_values; j_low++) { // in the 6th decate only examine R_low = 1M, then stop if ( i_low == 6 && j_low > 0 )