From 342bd580ac9f7e5ddd585c795c3aca44f7cde51d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 22 Jul 2023 00:01:03 -0700 Subject: [PATCH] altos: Use pyro voltage to check igniters 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 --- src/kernel/ao.h | 22 -------- src/kernel/ao_config.h | 4 ++ src/kernel/ao_ignite.c | 9 +--- src/kernel/ao_pyro.c | 8 +-- src/kernel/ao_pyro.h | 80 +++++++++++++++++++++++++++++ src/telelcotwo-v0.1/ao_telelcotwo.c | 1 - 6 files changed, 86 insertions(+), 38 deletions(-) diff --git a/src/kernel/ao.h b/src/kernel/ao.h index edfbbb87..b3f780f5 100644 --- a/src/kernel/ao.h +++ b/src/kernel/ao.h @@ -982,26 +982,4 @@ void ao_ms5607_init(void); #include -/* - * 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_ */ diff --git a/src/kernel/ao_config.h b/src/kernel/ao_config.h index bf57d954..a8541775 100644 --- a/src/kernel/ao_config.h +++ b/src/kernel/ao_config.h @@ -19,7 +19,11 @@ #ifndef _AO_CONFIG_H_ #define _AO_CONFIG_H_ +#include + +#if AO_PYRO_NUM #include +#endif #ifndef USE_STORAGE_CONFIG #define USE_STORAGE_CONFIG 1 diff --git a/src/kernel/ao_ignite.c b/src/kernel/ao_ignite.c index 86a116d1..9e6df199 100644 --- a/src/kernel/ao_ignite.c +++ b/src/kernel/ao_ignite.c @@ -18,9 +18,7 @@ #include "ao.h" #include -#if AO_PYRO_NUM #include -#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) diff --git a/src/kernel/ao_pyro.c b/src/kernel/ao_pyro.c index d4091205..c40c50df 100644 --- a/src/kernel/ao_pyro.c +++ b/src/kernel/ao_pyro.c @@ -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 diff --git a/src/kernel/ao_pyro.h b/src/kernel/ao_pyro.h index f17abed3..82576767 100644 --- a/src/kernel/ao_pyro.h +++ b/src/kernel/ao_pyro.h @@ -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 diff --git a/src/telelcotwo-v0.1/ao_telelcotwo.c b/src/telelcotwo-v0.1/ao_telelcotwo.c index 6ced1912..c8f30b89 100644 --- a/src/telelcotwo-v0.1/ao_telelcotwo.c +++ b/src/telelcotwo-v0.1/ao_telelcotwo.c @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include -- 2.30.2