Wie Integration durchführen?

OP #2407573
Lesenswert?

Moin Moin.

Ich möchte gern einen von einem Atmega gemessenen elektrischen Strom 
(externer ADC) über die Zeit integrieren. Kurz die Eckdaten: Der ADC 
spuckt mir ca. alle 68ms einen Messwert aus, der bereits über 128 
Samples gemittelt wurde. Das Zeitintervall über das integriert werden 
soll, kann bis zu 12 Stunden lang sein.

Mein erster Ansatz war, nach jeder Messung den Wert (12 bit Genauigkeit) 
in ein Array zu packen, um so einen gleitenden Mittelwert zu erhalten. 
Dieser würde dann alle 500ms abgefragt werden und dann mit dem 
Zeitintervall (500ms) multipliziert werden. Das Resultat wird dann über 
die Zeit auf eine Gleitkommazahl addiert werden.

Bei diesem Ansatz sehe ich allerdings zwei Probleme:
1. Die AVR-Architektur soll relativ lahm mit Gleitkommazahlen sein. 
Werden double unterstützt?
2. Anfangs wird die Lösung noch relativ gut funktionieren, wird jedoch 
die Summe größer, ist sie irgendwann so groß, dass aufsummierte (kleine) 
Werte den Zahlenwert nicht mehr verändern.

Langsamer externer Speicher (SD-Karte über SPI) ist en masse vorhanden. 
Könnte man damit was machen? Generell suche ich nach Ideen, wie ich mein 
Problem programmiertechnisch umsetzen könnte... Ich bin für Anregungen 
aller Art dankbar.

Gruß Sven
Gast #2407592
Lesenswert?

Der Ansatz ist schon richtig, jedoch brauchst du keinen gleitenden 
Mittelwert, wenn du bereits über 128Werte gekitzelt hast. Nimm diesen 
Wert, multiplizier die Samplerate rein (deine 68ms) und summiere dann 
auf. Würde aber fixed Point nehmen und dann in eine uint32 Variable. 
Sollte gehn, hoffe ich...


Knut
Gast #2407595
Lesenswert?

Sven S. schrieb:
> 1. Die AVR-Architektur soll relativ lahm mit Gleitkommazahlen sein.
> Werden double unterstützt?
> 2. Anfangs wird die Lösung noch relativ gut funktionieren, wird jedoch
> die Summe größer, ist sie irgendwann so groß, dass aufsummierte (kleine)
> Werte den Zahlenwert nicht mehr verändern.
Du hast es schon selber erkannt: Gleitkommazahlen auf einem 8-Bitter ist 
nicht so schön.

Warum nimmst du keine Ganzzahl? Ich komme auf eine Summe von
2 602 164 224
wenn du 12h alle 68ms 4096 addierst
das passt gut in ein uint32:
4 294 967 296

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren