altos: Use pyro voltage to check igniters ignite-volts
authorKeith Packard <keithp@keithp.com>
Sat, 22 Jul 2023 07:01:03 +0000 (00:01 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 22 Jul 2023 07:01:03 +0000 (00:01 -0700)
Instead of using an absolute value for the igniter continuity good
voltage, use 15/16 of the pyro voltage instead. This ensures we scale
with the pyro voltage to find marginal igniters even with high voltage
pyro systems.

This doesn't work on TeleMetrum where we have no pyro voltage
value. On these boards, continue to use a fixed 3.5V value.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/kernel/ao.h
src/kernel/ao_config.h
src/kernel/ao_ignite.c
src/kernel/ao_pyro.c
src/kernel/ao_pyro.h
src/telelcotwo-v0.1/ao_telelcotwo.c

index edfbbb871de6416bdd0303bbe994b2215b39fd5d..b3f780f5c7609797c15c895e90b0fa965dcf1a44 100644 (file)
@@ -982,26 +982,4 @@ void ao_ms5607_init(void);
 
 #include <ao_arch_funcs.h>
 
-/*
- * dv = (sensor * (p+m) * ref_dv)/ (max * m)
- * value * (max * m) = (sensor * (p+m) * ref)
- * value * (max * m) / ((p+m) * ref) = sensor
- */
-
-#define AO_DV_MUL(p,m) ((int32_t) AO_ADC_MAX * (m))
-#define AO_DV_DIV(p,m) ((int32_t) AO_ADC_REFERENCE_DV * ((p) + (m)))
-#define AO_DV_ADD(p,m) (AO_DV_DIV(p,m) / 2)
-
-#define ao_decivolt_to_adc(dv, p, m) \
-       ((int16_t) (((int32_t) (dv) * AO_DV_MUL(p,m) + AO_DV_ADD(p,m)) / AO_DV_DIV(p,m)))
-
-#define AO_IGNITER_CLOSED_DV   35
-#define AO_IGNITER_OPEN_DV     10
-
-#undef AO_IGNITER_OPEN
-#undef AO_IGNITER_CLOSED
-
-#define AO_IGNITER_OPEN ao_decivolt_to_adc(AO_IGNITER_OPEN_DV, AO_IGNITE_DIV_PLUS, AO_IGNITE_DIV_MINUS)
-#define AO_IGNITER_CLOSED ao_decivolt_to_adc(AO_IGNITER_CLOSED_DV, AO_IGNITE_DIV_PLUS, AO_IGNITE_DIV_MINUS)
-
 #endif /* _AO_H_ */
index bf57d9543a11102f09dc3d29bdfb4bdf5ffe2b7b..a8541775ae807272947dbd66b357c05ec2e2ef61 100644 (file)
 #ifndef _AO_CONFIG_H_
 #define _AO_CONFIG_H_
 
+#include <ao.h>
+
+#if AO_PYRO_NUM
 #include <ao_pyro.h>
+#endif
 
 #ifndef USE_STORAGE_CONFIG
 #define USE_STORAGE_CONFIG 1
index 86a116d1f11addecf6d6d0d0009420df19e34266..9e6df1993f9db9f4dd5ed1b24fa66d3949473093 100644 (file)
@@ -18,9 +18,7 @@
 
 #include "ao.h"
 #include <ao_data.h>
-#if AO_PYRO_NUM
 #include <ao_pyro.h>
-#endif
 
 #if HAS_IGNITE
 struct ao_ignition ao_ignition[2];
@@ -55,12 +53,7 @@ ao_igniter_status(enum ao_igniter igniter)
                value = AO_SENSE_MAIN(&packet);
                break;
        }
-       if (value < AO_IGNITER_OPEN)
-               return ao_igniter_open;
-       else if (value > AO_IGNITER_CLOSED)
-               return ao_igniter_ready;
-       else
-               return ao_igniter_unknown;
+       return ao_igniter_check(value, AO_SENSE_PBATT(&packet));
 }
 
 #define AO_IGNITER_SET_DROGUE(v)       ao_gpio_set(AO_IGNITER_DROGUE_PORT, AO_IGNITER_DROGUE_PIN, v)
index d4091205d2114afff64d11c1bea194a6f70f2936..c40c50df42befd1128512a919f7ab9323055246f 100644 (file)
@@ -45,14 +45,8 @@ ao_pyro_status(uint8_t p)
                ao_data_get(&packet);
                );
 
-       value = (AO_IGNITER_CLOSED>>1);
        value = AO_SENSE_PYRO(&packet, p);
-       if (value < AO_IGNITER_OPEN)
-               return ao_igniter_open;
-       else if (value > AO_IGNITER_CLOSED)
-               return ao_igniter_ready;
-       else
-               return ao_igniter_unknown;
+       return ao_igniter_check(value, AO_SENSE_PBATT(&packet));
 }
 
 void
index f17abed377907fa0fa4eb5a5c34c7f30c5c1bc21..82576767f6c4f27c4d9ebedecb2e68a8782370bd 100644 (file)
@@ -108,4 +108,84 @@ ao_pyro_status(uint8_t p);
 void
 ao_pyro_print_status(void);
 
+#ifndef AO_PYRO_BATTERY_DIV_PLUS
+#define AO_PYRO_BATTERY_DIV_PLUS AO_BATTERY_DIV_PLUS
+#define AO_PYRO_BATTERY_DIV_MINUS AO_BATTERY_DIV_MINUS
+#ifndef AO_SENSE_PBATT
+#define AO_SENSE_PBATT(p) ((p)->adc.v_batt)
+#endif
+#else
+#ifndef AO_SENSE_PBATT
+#define AO_SENSE_PBATT(p) ((p)->adc.v_pbatt)
+#endif
+#endif
+
+/*
+ * dv = (sensor * (p+m) * ref_dv)/ (max * m)
+ * value * (max * m) = (sensor * (p+m) * ref)
+ * value * (max * m) / ((p+m) * ref) = sensor
+ */
+
+#define AO_DV_MUL(p,m) ((int32_t) AO_ADC_MAX * (m))
+#define AO_DV_DIV(p,m) ((int32_t) AO_ADC_REFERENCE_DV * ((p) + (m)))
+#define AO_DV_ADD(p,m) (AO_DV_DIV(p,m) / 2)
+
+#define ao_decivolt_to_adc(dv, p, m) \
+       ((int16_t) (((int32_t) (dv) * AO_DV_MUL(p,m) + AO_DV_ADD(p,m)) / AO_DV_DIV(p,m)))
+
+#define AO_IGNITER_CLOSED_DV   35
+#define AO_IGNITER_OPEN_DV     10
+
+#define AO_PYRO_BATTERY_GOOD_DV        38
+
+#undef AO_IGNITER_OPEN
+#undef AO_IGNITER_CLOSED
+
+#define AO_IGNITER_OPEN ao_decivolt_to_adc(AO_IGNITER_OPEN_DV, AO_IGNITE_DIV_PLUS, AO_IGNITE_DIV_MINUS)
+#define AO_IGNITER_CLOSED ao_decivolt_to_adc(AO_IGNITER_CLOSED_DV, AO_IGNITE_DIV_PLUS, AO_IGNITE_DIV_MINUS)
+
+#define AO_PYRO_BATTERY_GOOD ao_decivolt_to_adc(AO_PYRO_BATTERY_GOOD_DV, AO_PYRO_BATTERY_DIV_PLUS, AO_PYRO_BATTERY_DIV_MINUS)
+
+/* For devices measuring the pyro battery voltage, we want to use a
+ * fraction of that. We'll use 15/16 of the battery voltage as a limit
+ * For devices not measuring the pyro battery voltage, we'll use 3.5V
+ * instead (this is just TeleMetrum, which permits external pyro
+ * batteries but has not provision to measure the voltage)
+ */
+
+static inline int16_t
+ao_igniter_closed_value(int16_t battery)
+{
+#if AO_PYRO_BATTERY_DIV_PLUS != AO_IGNITE_DIV_PLUS || AO_PYRO_BATTERY_DIV_MINUS != AO_IGNITE_DIV_MINUS
+       (void) battery;
+       return AO_IGNITER_CLOSED;
+#else
+       return (int16_t) (((int32_t) battery * 15) / 16);
+#endif
+}
+
+static inline int16_t
+ao_igniter_open_value(int16_t battery)
+{
+#if AO_PYRO_BATTERY_DIV_PLUS != AO_IGNITE_DIV_PLUS || AO_PYRO_BATTERY_DIV_MINUS != AO_IGNITE_DIV_MINUS
+       (void) battery;
+       return AO_IGNITER_OPEN;
+#else
+       return (int16_t) (((int32_t) battery * 1) / 8);
+#endif
+}
+
+static inline enum ao_igniter_status
+ao_igniter_check(int16_t value, int16_t battery)
+{
+       if (battery < AO_PYRO_BATTERY_GOOD)
+               return ao_igniter_open;
+       if (value < ao_igniter_open_value(battery))
+               return ao_igniter_open;
+       else if (value > ao_igniter_closed_value(battery))
+               return ao_igniter_ready;
+       else
+               return ao_igniter_unknown;
+}
+
 #endif
index 6ced1912dbb667fdb85f2a14a24d5f7cb164fd9d..c8f30b894ff49ac218e471218143699c15db8e68 100644 (file)
@@ -21,7 +21,6 @@
 #include <ao_packet.h>
 #include <ao_companion.h>
 #include <ao_profile.h>
-#include <ao_pyro.h>
 #include <ao_aes.h>
 #include <ao_button.h>
 #include <ao_lco.h>