added round_to_E_series function to eseries lib.
This commit is contained in:
Binary file not shown.
@@ -38,4 +38,54 @@ ESeriesMaxValue get_E_MAX(ESeries E_series) {
|
|||||||
|
|
||||||
double round_to_E_series (double continuous_value, 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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
#ifndef ESERIES_H
|
#ifndef ESERIES_H
|
||||||
#define ESERIES_H
|
#define ESERIES_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
double E3_values[3] = { 1.0, 2.2, 4.7 };
|
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 };
|
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};
|
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 {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);
|
extern ESeriesMaxValue get_E_MAX(ESeries E_series);
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ int set_output_voltage(double setpoint_voltage, ESeries E_resistors) {
|
|||||||
|
|
||||||
R_low_decade_w = i_low;
|
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
|
// in the 6th decate only examine R_low = 1M, then stop
|
||||||
if ( i_low == 6 && j_low > 0 )
|
if ( i_low == 6 && j_low > 0 )
|
||||||
|
|||||||
Reference in New Issue
Block a user