Forum: Compiler & IDEs Wie Integration durchführen?


von Sven S. (schwerminator)


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

von Knut (Gast)


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

von amerikaner (Gast)


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

von Sven S. (schwerminator)


Lesenswert?

Ok. Danke für die Tips. Dann werde ich mal mein Glück probieren.

von Matthias L. (Gast)


Lesenswert?

Wozu berechnest du den Mittelwert, wenn du nachher integrieren willst?

Nimm einfach die Werte vom ADC und summiere sie auf.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.