X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altoslib%2FAltosConvert.java;h=18878c026dd01115501e87f8880a9bcb613feea6;hb=HEAD;hp=63cdfa6092db2e30b2f70bb00491cde2c4ff47b5;hpb=ec46adee44ea08120b1940ca55a5fbdf56874bb1;p=fw%2Faltos diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java index 63cdfa60..a478881e 100644 --- a/altoslib/AltosConvert.java +++ b/altoslib/AltosConvert.java @@ -49,21 +49,21 @@ public class AltosConvert { private static final double GRAVITATIONAL_ACCELERATION = -gravity; private static final double AIR_GAS_CONSTANT = 287.053; - private static final double NUMBER_OF_LAYERS = 7; - private static final double MAXIMUM_ALTITUDE = 84852.0; - private static final double MINIMUM_PRESSURE = 0.3734; + private static final double MAXIMUM_ALTITUDE = 100000.0; + private static final double MINIMUM_PRESSURE = 0.023439; private static final double LAYER0_BASE_TEMPERATURE = 288.15; private static final double LAYER0_BASE_PRESSURE = 101325; /* lapse rate and base altitude for each layer in the atmosphere */ private static final double[] lapse_rate = { - -0.0065, 0.0, 0.001, 0.0028, 0.0, -0.0028, -0.002 + -0.0065, 0.0, 0.001, 0.0028, 0.0, -0.0028, -0.002, 0, }; - private static final int[] base_altitude = { - 0, 11000, 20000, 32000, 47000, 51000, 71000 + private static final double[] base_altitude = { + 0, 11000, 20000, 32000, 47000, 51000, 71000, 84852, }; + private static final int NUMBER_OF_LAYERS = base_altitude.length; /* outputs atmospheric pressure associated with the given altitude. * altitudes are measured with respect to the mean sea level */ @@ -128,25 +128,21 @@ public class AltosConvert { double next_base_pressure = LAYER0_BASE_PRESSURE; double altitude; - double base_pressure; - double base_temperature; + double base_pressure = 0; + double base_temperature = 0; double base; /* base for function to determine base pressure of next layer */ double exponent; /* exponent for function to determine base pressure of next layer */ double coefficient; int layer_number; /* identifies layer in the atmosphere */ - int delta_z; /* difference between two altitudes */ + double delta_z; /* difference between two altitudes */ - if (pressure < 0) /* illegal pressure */ - return -1; if (pressure < MINIMUM_PRESSURE) /* FIX ME: use sensor data to improve model */ - return MAXIMUM_ALTITUDE; + pressure = MINIMUM_PRESSURE; /* calculate the base temperature and pressure for the atmospheric layer associated with the inputted pressure. */ - layer_number = -1; - do { - layer_number++; + for (layer_number = 0; layer_number < NUMBER_OF_LAYERS - 1; layer_number++) { base_pressure = next_base_pressure; base_temperature = next_base_temperature; delta_z = base_altitude[layer_number + 1] - base_altitude[layer_number]; @@ -162,8 +158,9 @@ public class AltosConvert { next_base_pressure *= Math.pow(base, exponent); } next_base_temperature += delta_z * lapse_rate[layer_number]; + if (pressure >= next_base_pressure) + break; } - while(layer_number < NUMBER_OF_LAYERS - 1 && pressure < next_base_pressure); /* calculate the altitude associated with the inputted pressure */ if (lapse_rate[layer_number] == 0.0) { @@ -181,6 +178,9 @@ public class AltosConvert { + coefficient * (Math.pow(base, exponent) - 1); } + if (altitude > MAXIMUM_ALTITUDE) + altitude = MAXIMUM_ALTITUDE; + return altitude; } @@ -224,15 +224,49 @@ public class AltosConvert { return raw / 4095.0; } + static double stm_adc(int raw) { + return raw / 4095.0; + } + + static public double easy_timer_battery_voltage(int v_batt) { + if (v_batt != AltosLib.MISSING) + return 3.3 * stm_adc(v_batt) * (5.6 + 10.0) / 10.0; + return AltosLib.MISSING; + } + + static double easy_timer_pyro_voltage_15v(int raw) { + if (raw != AltosLib.MISSING) + return 3.3 * stm_adc(raw) * (100.0 + 27.0) / 27.0; + return AltosLib.MISSING; + } + + static public double metrum_battery_voltage(int v_batt) { + if (v_batt != AltosLib.MISSING) + return 3.3 * stm_adc(v_batt) * (5.6 + 10.0) / 10.0; + return AltosLib.MISSING; + } + + static double metrum_pyro_voltage(int raw) { + if (raw != AltosLib.MISSING) + return 3.3 * stm_adc(raw) * (100.0 + 27.0) / 27.0; + return AltosLib.MISSING; + } + static public double mega_battery_voltage(int v_batt) { if (v_batt != AltosLib.MISSING) - return 3.3 * mega_adc(v_batt) * (5.6 + 10.0) / 10.0; + return 3.3 * stm_adc(v_batt) * (5.6 + 10.0) / 10.0; + return AltosLib.MISSING; + } + + static double mega_pyro_voltage_15v(int raw) { + if (raw != AltosLib.MISSING) + return 3.3 * stm_adc(raw) * (100.0 + 27.0) / 27.0; return AltosLib.MISSING; } - static double mega_pyro_voltage(int raw) { + static double mega_pyro_voltage_30v(int raw) { if (raw != AltosLib.MISSING) - return 3.3 * mega_adc(raw) * (100.0 + 27.0) / 27.0; + return 3.3 * stm_adc(raw) * (100.0 + 12.0) / 12.0; return AltosLib.MISSING; } @@ -270,17 +304,34 @@ public class AltosConvert { return sensor / 4095.0 * supply * (5.6 + 10.0) / 10.0; } + static double tele_gps_3_voltage(int sensor) { + double supply = 3.3; + + return sensor / 32767.0 * supply * (5.6 + 10.0) / 10.0; + } + + /* STM32F042 */ + static double tele_gps_4_voltage(int sensor) { + double supply = 3.3; + + return sensor / 4095.0 * supply * (5.6 + 10.0) / 10.0; + } + static double tele_bt_3_battery(int raw) { if (raw == AltosLib.MISSING) return AltosLib.MISSING; return 3.3 * mega_adc(raw) * (5.1 + 10.0) / 10.0; } - static double easy_mini_2_adc(int raw) { + static double easy_timer_voltage(int sensor) { + return 3.3 * mega_adc(sensor) * (100.0 + 27.0) / 27.0; + } + + static double easy_mini_2_adc(double raw) { return raw / 4095.0; } - static double easy_mini_1_adc(int raw) { + static double easy_mini_1_adc(double raw) { return raw / 32767.0; } @@ -307,6 +358,48 @@ public class AltosConvert { return easy_mini_2_adc(sensor) * supply * 127/27; } + static double easy_mini_3_voltage(int sensor) { + return easy_mini_1_voltage(sensor, 10000); + } + + static double motor_pressure(double voltage) { + double base = 0.5; + double max = 4.5; + double full_scale_pressure = psi_to_pa(1600); + + if (voltage < base) + voltage = base; + if (voltage > max) + voltage = max; + return (voltage - base) / (max - base) * full_scale_pressure; + } + + static double easy_motor_3_adc(double raw) { + return raw / 32767.0; + } + + static double easy_motor_3_voltage(int sensor) { + double supply = 3.3; + + return easy_motor_3_adc(sensor) * supply * 15.6 / 10.0; + } + + static double easy_motor_2_motor_pressure(int sensor, double ground_sensor) { + double supply = 3.3; + double ground_voltage = easy_mini_2_adc(ground_sensor) * supply * 15.6 / 10.0; + double voltage = easy_mini_2_adc(sensor) * supply * 15.6 / 10.0; + + return motor_pressure(voltage) - motor_pressure(ground_voltage); + } + + static double easy_motor_3_motor_pressure(int sensor, double ground_sensor) { + double supply = 3.3; + double ground_voltage = easy_motor_3_adc(ground_sensor) * supply * 15.6 / 10.0; + double voltage = easy_motor_3_adc(sensor) * supply * 15.6 / 10.0; + + return motor_pressure(voltage) - motor_pressure(ground_voltage); + } + public static double radio_to_frequency(int freq, int setting, int cal, int channel) { double f; @@ -507,7 +600,7 @@ public class AltosConvert { public static int beep_freq_to_value(double freq) { if (freq == 0) - return 94; + return 0; return (int) Math.floor (1.0/2.0 * (24.0e6/32.0) / freq + 0.5); }