@uwe:
ADCMan.setCapture:
Die Beschreibung der einzelnen Funktionen findet man in "adcman.h":
Code:
// configure sampling for pin:
// samplecount = 1: 10 bit sampling (unsigned)
// samplecount > 1: 8 bit sampling (signed - zero = VCC/2)
void setCapture(byte pin, byte samplecount, boolean autoCalibrateOfs);
Der Parameter "sampleCount" gibt also die Anzahl Samples (ADC-Wandlungen) an, die für diesen Pin durchgeführt werden sollen. Der Parameter "autoCalibrateOfs" gibt an, ob für diesen Pin ein Null-Punkt Offset ermittelt werden wenn die ADC-Kalibrierung (z.B. via pfodApp) durchgeführt wird. Wird eine auomatische Kalibrierung für diesen Pin zugelassen, so wird :
1. beim Kalibrieren einmalig der aktuelle ADC-Wert ermittelt (Null-Punkt Wert/Offset )
2. bei allen späteren ADC-Wandlungen dieser Offset abezogen
Da der Stromsensor z.B. 2,5 Volt liefert wenn kein Strom fließt (würde ohne Kalibrierung beispielsweise den ADC-Wert 511 ergeben), ist es sinnvoll für diesen die Kalibrierung zuzulassen. So liefert der ADCManager für diesen Fall dann bespielsweise den ADC-Wert 0.
Median:
Das hat Max entwickelt - wenn ich das richtig sehe kann man damit den Median ermitteln (wenn SampleCount >1 für diesen Pin ist):
Code:
ADCManager.readMedian(pinCurrent)
Allerdings kostet das schon mehr Rechenzeit (und dadurch würden evtl. andere Dinge wie z.B. ADC-Wandlung für unsere Schleife zu kurz kommen) - ich würde für den Stromsensor stattdessen einen "Tiefpaß-Filter" anwenden (so steht es m.E. auch bereits schon im Code):
Beispiel:
Code:
double chgCurrent; // diese Variable ist bereits in robot.h definiert
aus Funktion "robot.cpp: readSensors":
double current = ((double)((int)(readSensor(SEN_CHG_CURRENT) / 10))) / 10.0;
double accel = 0.01;
if (abs(chgCurrent-current)>0.4)
// falls die Abweichung von neuem Meßwert und alten Meßwert zu groß ist => neuem Meßwert vertrauen
chgCurrent = current;
else
// andernfals Tiefpaß-Filtern: neuer Meßwert ist: (1-Gewichtung) * alter Meßwert + Gewichtung * neuer Meßwert
chgCurrent = (1.0-accel) * chgCurrent + accel * current;
Durch den Tiefpaß nähert sich der Meßwert langsam dem Mittelwert an.
http://helpful.knobs-dials.com/index.php/Low-pass_filter
Beispiel: Oben Rohwerte (ohne Tiefpaß), unten Tiefpaß der Messungen jedes Mal die Gewichtung (für den aktuellen Meßwert) etwas geringer eingestellt. Das Signal paßt sich immer stärker dem Mittelwert an:
Attachment:
https://forum.ardumower.de/data/media/kunena/attachments/905/Ewma-lowpass-example.png/