hellen on a bike: both TS and SD card logs report -32v on secondary TPS and secondary PPS #6376

only:saving sensorVolts
This commit is contained in:
rusefillc 2024-04-21 20:03:42 -04:00 committed by Andrey
parent d7bae2cd2f
commit f981d04c44
2 changed files with 22 additions and 20 deletions

View File

@ -2,11 +2,10 @@
#include "adc_subscription.h" #include "adc_subscription.h"
#include "biquad.h"
#if EFI_UNIT_TEST #if EFI_UNIT_TEST
/*static*/ void AdcSubscription::SubscribeSensor(FunctionalSensor&, adc_channel_e, float, float) { /*static*/ AdcSubscriptionEntry * AdcSubscription::SubscribeSensor(FunctionalSensor&, adc_channel_e, float, float) {
return nullptr;
} }
/*static*/ void AdcSubscription::UnsubscribeSensor(FunctionalSensor&) { /*static*/ void AdcSubscription::UnsubscribeSensor(FunctionalSensor&) {
@ -17,14 +16,6 @@
#else #else
struct AdcSubscriptionEntry {
FunctionalSensor *Sensor;
float VoltsPerAdcVolt;
Biquad Filter;
adc_channel_e Channel;
bool HasUpdated = false;
};
static AdcSubscriptionEntry s_entries[16]; static AdcSubscriptionEntry s_entries[16];
static AdcSubscriptionEntry* findEntry(FunctionalSensor* sensor) { static AdcSubscriptionEntry* findEntry(FunctionalSensor* sensor) {
@ -42,22 +33,22 @@ static AdcSubscriptionEntry* findEntry() {
return findEntry(nullptr); return findEntry(nullptr);
} }
/*static*/ void AdcSubscription::SubscribeSensor(FunctionalSensor &sensor, /*static*/ AdcSubscriptionEntry* AdcSubscription::SubscribeSensor(FunctionalSensor &sensor,
adc_channel_e channel, adc_channel_e channel,
float lowpassCutoff, float lowpassCutoff,
float voltsPerAdcVolt /*= 0.0f*/) { float voltsPerAdcVolt /*= 0.0f*/) {
// Don't subscribe null channels // Don't subscribe null channels
if (!isAdcChannelValid(channel)) { if (!isAdcChannelValid(channel)) {
return; return nullptr;
} }
// If you passed the same sensor again, resubscribe it with the new parameters // If you passed the same sensor again, resubscribe it with the new parameters
auto entry = findEntry(&sensor); AdcSubscriptionEntry* entry = findEntry(&sensor);
if (entry) { if (entry) {
// If the channel didn't change, we're already set // If the channel didn't change, we're already set
if (entry->Channel == channel) { if (entry->Channel == channel) {
return; return entry;
} }
// avoid updates to this while we're mucking with the configuration // avoid updates to this while we're mucking with the configuration
@ -72,7 +63,7 @@ static AdcSubscriptionEntry* findEntry() {
// Ensure that a free entry was found // Ensure that a free entry was found
if (!entry) { if (!entry) {
firmwareError(ObdCode::CUSTOM_INVALID_ADC, "too many ADC subscriptions subscribing %s", name); firmwareError(ObdCode::CUSTOM_INVALID_ADC, "too many ADC subscriptions subscribing %s", name);
return; return nullptr;
} }
#if EFI_PROD_CODE && HAL_USE_ADC #if EFI_PROD_CODE && HAL_USE_ADC
@ -99,6 +90,7 @@ TODO: this code is similar to initIfValid, what is the plan? shall we extract he
// Set the sensor last - it's the field we use to determine whether this entry is in use // Set the sensor last - it's the field we use to determine whether this entry is in use
entry->Sensor = &sensor; entry->Sensor = &sensor;
return entry;
} }
/*static*/ void AdcSubscription::UnsubscribeSensor(FunctionalSensor& sensor) { /*static*/ void AdcSubscription::UnsubscribeSensor(FunctionalSensor& sensor) {
@ -145,17 +137,17 @@ void AdcSubscription::UpdateSubscribers(efitick_t nowNt) {
} }
float mcuVolts = getVoltage("sensor", entry.Channel); float mcuVolts = getVoltage("sensor", entry.Channel);
float sensorVolts = mcuVolts * entry.VoltsPerAdcVolt; entry.sensorVolts = mcuVolts * entry.VoltsPerAdcVolt;
// On the very first update, preload the filter as if we've been // On the very first update, preload the filter as if we've been
// seeing this value for a long time. This prevents a slow ramp-up // seeing this value for a long time. This prevents a slow ramp-up
// towards the correct value just after startup // towards the correct value just after startup
if (!entry.HasUpdated) { if (!entry.HasUpdated) {
entry.Filter.cookSteadyState(sensorVolts); entry.Filter.cookSteadyState(entry.sensorVolts);
entry.HasUpdated = true; entry.HasUpdated = true;
} }
float filtered = entry.Filter.filter(sensorVolts); float filtered = entry.Filter.filter(entry.sensorVolts);
entry.Sensor->postRawValue(filtered, nowNt); entry.Sensor->postRawValue(filtered, nowNt);
} }

View File

@ -6,10 +6,20 @@
#include "functional_sensor.h" #include "functional_sensor.h"
#include "global.h" #include "global.h"
#include "biquad.h"
struct AdcSubscriptionEntry {
FunctionalSensor *Sensor;
float VoltsPerAdcVolt;
float sensorVolts;
Biquad Filter;
adc_channel_e Channel;
bool HasUpdated = false;
};
class AdcSubscription { class AdcSubscription {
public: public:
static void SubscribeSensor(FunctionalSensor &sensor, adc_channel_e channel, float lowpassCutoffHZ, float voltsPerAdcVolt = 0.0f); static AdcSubscriptionEntry *SubscribeSensor(FunctionalSensor &sensor, adc_channel_e channel, float lowpassCutoffHZ, float voltsPerAdcVolt = 0.0f);
static void UnsubscribeSensor(FunctionalSensor& sensor); static void UnsubscribeSensor(FunctionalSensor& sensor);
static void UnsubscribeSensor(FunctionalSensor& sensor, adc_channel_e newChannel); static void UnsubscribeSensor(FunctionalSensor& sensor, adc_channel_e newChannel);
static void UpdateSubscribers(efitick_t nowNt); static void UpdateSubscribers(efitick_t nowNt);