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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.