Baue gerade einen "kleinen" Tamiya Scania R470 mit 80T-Motor und werde den mal als Testplattform für den Treiber nutzen.
Habe außerdem mal das mit dem Messen der Batteriespannung ausführlich durchgetestet (mit Netzteil von 0 bis 17 V).
Eigentlich wollte ich neben 100 kΩ 22 kΩ nehmen, aber habe auf die Schnelle nur einen 20 k gefunden.
Der Kondensator macht bei mir in der Praxis keinen Unterschied. Die Messung funktioniert mit und ohne einwandfrei und ohne Auffälligkeiten oder Schwankungen.
Ich bin so vorgegangen, dass ich die Widerstände vor dem Einlöten exakt gemessen und die Werte eingetragen habe. Danach musst ich noch einen Offset von -0,08 eintragen und damit waren die Messungen dann auf zwei Nachkommastellen genau. Erst bei 13 V aufwärts ist es etwas mehr geworden.
Irgendwie habe ich erst ein paar Kleinigkeiten geändert und dann immer mehr. Das ist bei mir so eine Angewohnheit, um den Code besser zu verstehen, benenne ich die Variablen für mein besseres Verständis um und bin dann quasi gezwungen ihnen zu folgen bis alles wieder funktioniert. Wollte deswegen jetzt kein Pull-Request machen. Hier sind meine Änderungen zu Einsicht:
Falls gewünscht, kann ich immer noch einen Pull-Request machen.
Habe die Messintervalle von 300 ms auf 3 s verringert (würde sogar auf 5s oder gar 10s gehen). Könnte sein, dass es Sinn macht öfters zu messen, mir fällt nur gerade kein Grund ein.
Bei der Berechnung habe ich den Offset erst später berücksichtigt, kann aber sein, dass das mathematisch keinen Unterschied macht.
Habe es Offset anstatt Diode drop genannt, da es letztendlich das Gleiche ist. Offset kann positiv oder negativ sein.
Anzahl der Samples die für die Glättung verwendet werden, kann jetzt eingestellt werden.
Ein paar Kommentare und Ausgaben habe ich ergänzt.
Habe alle Eventualitäten durchgetestet.
C++:
// Battery low discharge protection (only for boards with voltage divider resistors):
// IMPORTANT: Enter used resistor values in Ohms (Ω) and THEN adjust BATTERY_VOLTAGE_OFFSET, until your readings match the actual battery voltage!
#define BATTERY_PROTECTION // This will disable the ESC output, if the battery cutout voltage is reached
#define BATTERY_TEST_INTERVAL_SECONDS 3 // Probe battery voltage every ... seconds.
const float CELL_LOW_CUTOFF_VOLTAGE = 3.4; // For example 3.4 V per LiPo/LiIon cell. LiPo NEVER below 3.2 V!
const float CELL_FULLY_CHARGED_VOLTAGE = 4.2; // Usually 4.2 V per LiPo/LiIon cell.
// Note on resistor values: These values will be used to calculate the actual ratio between these two resistors (which is also called a "voltage divider").
// When selecting resistors, always use two of the same magnitude: Like, for example, 10k/2k, 20k/4k or 100k/20k. NEVER exceed a ratio LOWER than (4:1 = 4)!
// WARNING: If the ratio is too LOW, like 10k/5k (2:1 = 2), the battery voltage will most likely DAMAGE the controller permanently!
// Example calculation: 2000 / (2000 + 10000) = 0.166 666 666 7; 7.4 V * 0.167 = 1.2358 V (of 3.3 V maximum on GPIO Pin).
//
const uint32_t RESISTOR_TO_BATTERY_PLUS = 100650; // Value in Ohms (Ω), for example 10000 (9900 for switch mode test board, 9650 for Ural, 9500 for Landy).
const uint32_t RESISTOR_TO_GND = 19932; // Value in Ohms (Ω), for example 1000. Measuring exact resistor values before soldering, if possible, recommended!
const float BATTERY_VOLTAGE_OFFSET = -0.08; // Fine adjust measured value and/or consider diode voltage drop (about 0.34V for SS34 diode on switch mode board; 0 for Ural & Landy).
const uint8_t BATTERY_VOLTAGE_AVERAGING_SAMPLES = 6; // Number of samples to keep/use for averaging the measured voltage over time
volatile int outOfFuelVolumePercentage = 80; // Adjust the message volume in %