From 028a82a40e5bc50f6208271170e66b7d5aecd8d3 Mon Sep 17 00:00:00 2001 From: richonguzman Date: Fri, 15 Aug 2025 15:53:19 -0400 Subject: [PATCH] adcMods1 --- include/power_utils.h | 10 ++++++++ src/battery_utils.cpp | 43 +++++++++++++------------------ src/power_utils.cpp | 59 +++++++++++++++++++++++++++++++++---------- 3 files changed, 72 insertions(+), 40 deletions(-) diff --git a/include/power_utils.h b/include/power_utils.h index e937fc1..b176f91 100644 --- a/include/power_utils.h +++ b/include/power_utils.h @@ -29,6 +29,16 @@ namespace POWER_Utils { + #ifdef VEXT_CTRL + void vext_ctrl_ON(); + void vext_ctrl_OFF(); + #endif + + #ifdef ADC_CTRL + void adc_ctrl_ON(); + void adc_ctrl_OFF(); + #endif + double getBatteryVoltage(); bool isBatteryConnected(); void activateMeasurement(); diff --git a/src/battery_utils.cpp b/src/battery_utils.cpp index 7f072e7..6b0ace7 100644 --- a/src/battery_utils.cpp +++ b/src/battery_utils.cpp @@ -30,6 +30,7 @@ extern uint32_t lastBatteryCheck; bool shouldSleepLowVoltage = false; float adcReadingTransformation = (3.3/4095); +int adcReadings = 20; float voltageDividerCorrection = 0.288; float readingCorrection = 0.125; float multiplyCorrection = 0.035; @@ -39,6 +40,7 @@ float voltageDividerTransformation = 0.0; int telemetryCounter = random(1,999); + #ifdef HAS_ADC_CALIBRATION #include @@ -117,69 +119,58 @@ namespace BATTERY_Utils { return 0.0; } #else - int sample; - int sampleSum = 0; + #ifdef ADC_CTRL - #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) - digitalWrite(ADC_CTRL, HIGH); - #endif - #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP) - digitalWrite(ADC_CTRL, LOW); - #endif + POWER_Utils::adc_ctrl_ON(); #endif - for (int i = 0; i < 20; i++) { + int sampleSum = 0; + for (int i = 0; i < adcReadings; i++) { #if defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_LoRa_915) || defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) - sample = 0; + sampleSum = 0; #else #ifdef HAS_ADC_CALIBRATION if (calibrationEnable){ - sample = adc1_get_raw(InternalBattery_ADC_Channel); + sampleSum += adc1_get_raw(InternalBattery_ADC_Channel); } else { - sample = analogRead(BATTERY_PIN); + sampleSum += analogRead(BATTERY_PIN); } #else #ifdef BATTERY_PIN - sample = analogRead(BATTERY_PIN); + sampleSum += analogRead(BATTERY_PIN); #else - sample = 0; + sampleSum += 0; #endif #endif #endif - sampleSum += sample; delay(3); } #ifdef ADC_CTRL - #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) - digitalWrite(ADC_CTRL, LOW); - #endif - #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP) - digitalWrite(ADC_CTRL, HIGH); - #endif + POWER_Utils::adc_ctrl_OFF(); #ifdef HELTEC_WP double inputDivider = (1.0 / (10.0 + 10.0)) * 10.0; // The voltage divider is a 10k + 10k resistor in series #else double inputDivider = (1.0 / (390.0 + 100.0)) * 100.0; // The voltage divider is a 390k + 100k resistor in series, 100k on the low side. #endif - return (((sampleSum/100) * adcReadingTransformation) / inputDivider) + 0.285; // Yes, this offset is excessive, but the ADC on the ESP32s3 is quite inaccurate and noisy. Adjust to own measurements. + return (((sampleSum/adcReadings) * adcReadingTransformation) / inputDivider) + 0.285; // Yes, this offset is excessive, but the ADC on the ESP32s3 is quite inaccurate and noisy. Adjust to own measurements. #else #ifdef HAS_ADC_CALIBRATION if (calibrationEnable){ - float voltage = esp_adc_cal_raw_to_voltage(sampleSum / 100, &adc_chars); + float voltage = esp_adc_cal_raw_to_voltage(sampleSum / adcReadings, &adc_chars); voltage *= 2; // for 100K/100K voltage divider voltage /= 1000; return voltage; } else { - return (2 * (sampleSum/100) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping + return (2 * (sampleSum/adcReadings) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping } #else #ifdef LIGHTGATEWAY_PLUS_1_0 double inputDivider = (1.0 / (560.0 + 100.0)) * 100.0; // The voltage divider is a 560k + 100k resistor in series, 100k on the low side. - return (((sampleSum/100) * adcReadingTransformation) / inputDivider) + 0.41; + return (((sampleSum/adcReadings) * adcReadingTransformation) / inputDivider) + 0.41; #else - return (2 * (sampleSum/100) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping + return (2 * (sampleSum/adcReadings) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping #endif #endif #endif diff --git a/src/power_utils.cpp b/src/power_utils.cpp index 2c28a8a..485b321 100644 --- a/src/power_utils.cpp +++ b/src/power_utils.cpp @@ -47,6 +47,47 @@ extern Configuration Config; namespace POWER_Utils { + #ifdef VEXT_CTRL + void vext_ctrl_ON() { + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) + digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH); + #endif + #if defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3) + digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW); + #endif + } + + void vext_ctrl_OFF() { + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) + digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW); + #endif + #if defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3) + digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH); + #endif + } + #endif + + + #ifdef ADC_CTRL + void adc_ctrl_ON() { + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) + digitalWrite(ADC_CTRL, HIGH); + #endif + #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP) + digitalWrite(ADC_CTRL, LOW); + #endif + } + + void adc_ctrl_OFF() { + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) + digitalWrite(ADC_CTRL, LOW); + #endif + #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP) + digitalWrite(ADC_CTRL, HIGH); + #endif + } + #endif + double getBatteryVoltage() { #if defined(HAS_AXP192) || defined(HAS_AXP2101) return (PMU.getBattVoltage() / 1000.0); @@ -89,7 +130,7 @@ namespace POWER_Utils { #endif #endif #ifdef HELTEC_WIRELESS_TRACKER - digitalWrite(VEXT_CTRL, HIGH); + adc_ctrl_ON(); #endif //gpsIsActive = true; } @@ -107,7 +148,7 @@ namespace POWER_Utils { #endif #endif #ifdef HELTEC_WIRELESS_TRACKER - digitalWrite(VEXT_CTRL, LOW); + adc_ctrl_OFF(); #endif //gpsIsActive = false; } @@ -243,12 +284,7 @@ namespace POWER_Utils { #ifdef VEXT_CTRL pinMode(VEXT_CTRL,OUTPUT); // GPS + TFT on HELTEC Wireless_Tracker and only for Oled in HELTEC V3 - #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) - digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH); - #endif - #if defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3) - digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW); - #endif + vext_ctrl_ON(); #endif #ifdef HAS_GPS @@ -257,12 +293,7 @@ namespace POWER_Utils { #ifdef ADC_CTRL pinMode(ADC_CTRL, OUTPUT); - #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) - digitalWrite(ADC_CTRL, LOW); - #endif - #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP) - digitalWrite(ADC_CTRL, HIGH); - #endif + adc_ctrl_OFF(); #endif #if defined(HELTEC_WIRELESS_TRACKER)