- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 35

Thema: Messwert durch arithm. Mittel stabilisieren

  1. #11
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Anzeige

    E-Bike
    Die Berechnungen mit Fließkommazahlen brauchen relativ viel Platz. Man kann da schon noch einiges zusammenfassen, allerdings wird das Programm dann auch etwas unübersichtlicher. Die Umrechnung von AD-Wert nach Volumen wäre z.B. mit nur einer Multiplication möglich indem man die Konstanten vorab zusammenfaßt.

    Es sollte auch möglich sein ganz ohne fließkomma Division auszukommen. z.B. sollte man statt "Prozent = Volumen / 40" besser "Prozent = Volumen *0.025" schreiben.

    Edit:
    Auf Double sollte man mit der Testversion wohl verzichten. Vor allem nicht beides (single und double nutzen). Irgendwann ist halt die Grenze der Testversion erreicht.


    Zum Mittelen:
    Der AD wandler liefert immer nur einen Wert für einen Zeitpunkt. Im Idealfall sollte vor den AD wandler ein analoger Filter sein (Anti aliasing Filter). Dadurch werden die hohen Frequenzen Unterdrückt und der AD Wandler kriegt nur noch ein so langsames Signal, dass er das auch richtig erfassen kann. Für ein langsames Eingangssignal wie die Füllstandsmessung werden dann mehrere Menge Werte Zusammengefaßt. Sinnvoll ist es dabei wenigstens über 20 ms (= 1 Periode von 50Hz) zu mitteln.

    Für eine Effektive umsetzung sollte man mit 32 Bit integers (bzw. besser noch mit der vorzeichenlosen Version ?) arbeiten. Bei einer festen zahl an AD werten braicht man danach micht teilen, sondern kann die gleich mit der Summe Weiterarbeiten. Nur die Konstante zum Umrechenen ändert sich dann. Am einchsten ist es ohne Warten, denn eine Schleife mit mehr durchläufen braucht ja auch nicht mehr Code. Wenn man will den AD mit der Mittelung im Hintergrund laufen lassen will, könnte man den Interrupts vom AD nutzen und den AD durchlaufen lassen. Das letzte Ergebnis könnte man dann jeweils aus einer Variable abrufen.

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Prinzipiell ghabe ich eigentlich immer dasselbe Problem wie du. Die Werte einfach in einer Schleife mitteln bring nicht viel, wel die Schleife wie du ja selber schreibts zu schnell durchläuft.
    speicher kannst du allerdings sparen, wenn du die Werte nicht in Arrays abspeicherst um da den mittelwert draus zu bilden, sondern einfach X-Werte addierst und dann durch X teilst.
    Der ADC lieffert ja nur Werte bis maximal 1023. Davon passen 32 in eine Integer-Variable und 64 in eine Word Variable.

    Anstatt die Werte in einer Schleiffe aufzunehmen und zu addieren, kannst du auch in einem Interrupt einen Zähler mitlaufen lassen und die Messwerte in der Interruptroutine aufaddieren. Wenn der Zaäühler dann bei X ankommt, teilst du die Summe durch X, gibst den Mittelwert aufs Display oder an eine andere Variable aus und setzt den Zähler zurück.

    Wenn deine Werte nicht zu sehr verrauscht sind, kannst du aber auch einfach ein bischen fuschen,indem du den Wert auf dem display einfach nur in grossen abständen, z.B. einmal pro Minute refreshst.

    Wenn dein Timer z.B. alle 10 mS einen interrupt auslöst, kannst du darin ja einen Zähler hochlaufen lassen.
    In deiner Hauptschleife fragst du dann den Zähler ab, wenn der grösser 6000 ist, ist eine Minute um. Dann refreshst du dein Display und setzt den Zähler zurück.

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    37
    Beiträge
    136
    Wäre es also das einfachste wenn ich vor den AD Wandler Eingang einfach einen Tiefpass mit der Grenzfrequenz von ca 50Hz schalte?
    Oder lässt sich das unproblematisch softwareseitig umsetzen?

  4. #14
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Wäre es also das einfachste wenn ich vor den AD Wandler Eingang einfach einen Tiefpass mit der Grenzfrequenz von ca 50Hz schalte?
    Soweit ich Besserwessi verstehe hilft das bei sehr schnellen Eingangssignalen oder verrauschten Eingangssignalen.

    Der eigentliche Messwert fürfte sich bei einer Zisterne nicht so schnell ändern, dass ein Tiefpass zur Mittelung nötig ist.
    Im Kehrschluss kann er bei langsam veränderlichen Messwerten aber eigentlich auch nicht viel schaden/verfälschen.

    Den Digitalisierungsfehler des AD-Eingangs kann ein Tiefpass aber eigentlich auch nicht verhindern und der reicht vermutlich schon um die letzte stelle in deiner Anzeige "schwanken" zu lassen.

    Wenn du den per Software "rausfiltern" musst und es nicht so sehr auf Genauigkeit ankommt, ist es vermutlich am einfachsten das Rauschen auch per Software rauszurechnen.

    Deine Idee die Messwerte zu mitteln war doch gar nicht verkehrt. Das das zuviel speicher braucht, liegt daran, dass du die Messwerte in einem Array gespeichert hast, anstatt sie direkt aufzuaddieren.

    Wenn du die Messwerte in einem Array speicherst , brauchst du für jeden Messwert 2 Byte, d.h. bei 20 Wertten schon 40 Byte.
    Wenn du sie stattdessen direkt in einer Word-Variablen aufsummierst brauchst du für bis zu 64 Messwerte nur 2 Byte.

    Die Flackernde Anzeige am Display kannst du auch dadurch wegbekommen, dass du den neuen Messwert mit dem vorherigen vergleichst und nur dann anzeigts, wenn er um x grösser oder kleiner ist als der vorherige, sprich wenn sich der Füllstand der Zisterne tatsächlich nennenswert geändert hat.

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    37
    Beiträge
    136
    Den Digitalisierungsfehler des AD-Eingangs kann ein Tiefpass aber eigentlich auch nicht verhindern und der reicht vermutlich schon um die letzte stelle in deiner Anzeige "schwanken" zu lassen.
    Stimmt natürlich, das hatte ich nicht bedacht.
    Deine Idee die Messwerte zu mitteln war doch gar nicht verkehrt. Das das zuviel speicher braucht, liegt daran, dass du die Messwerte in einem Array gespeichert hast, anstatt sie direkt aufzuaddieren.
    Ja, allerdings ist das grundlegende Problem daran, dass die Schleife so schnell durchlaufen wird, dass der Mittelwert wieder nur eine Momentaufnahme zeigt.

    Die Flackernde Anzeige am Display kannst du auch dadurch wegbekommen, dass du den neuen Messwert mit dem vorherigen vergleichst und nur dann anzeigts, wenn er um x grösser oder kleiner ist als der vorherige, sprich wenn sich der Füllstand der Zisterne tatsächlich nennenswert geändert hat.
    Gute Idee. Ich habe in letzter Zeit studiumsbedingt viel C programmiert, mich aber noch nicht an Winavr GCC herangetraut.

    Eine Abfrage wie
    Code:
    if Volumen < Volumen_vorher + 50 then
      Volumen = Volumen_vorher
    end if
    erzeugt immer einen Fehler. Wie muss der korrekte Syntax lauten? Überhaupt wenn ich in Bascom versuche mehrere (arithmetische) Operationen wie z.B. x=5*7+15 auszuführen funktioniert das nicht.

    Nochmals Danke an alle, die trotz meiner Fragerei noch nicht aufgegeben haben.

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Ja, allerdings ist das grundlegende Problem daran, dass die Schleife so schnell durchlaufen wird, dass der Mittelwert wieder nur eine Momentaufnahme zeigt.
    Stimmt, aber du musst die Schleife ja nicht unbedingt als Schleife ausführen sondern kannst die Messwerte über einen Timer aufnehmen und addieren. In dem timer kannst du dann einen Zähler mitlaufen lassen, der z.B bis 50 hochzählt. Da angekommen setzt du dann den Zähler auf Null zurück und teilst die Summe der Messwerte durch 50.

    Wie muss der korrekte Syntax lauten?
    Die Syntax von C kenne ich auch nicht, dass was du da gepostet hast sieht aber allgemein mehr nach Basic als nach C aus.

    In C würde es glaube ich eher in Richtung If ( Volumen > (Volumen + 50)) {...} aussehen.

    Überhaupt wenn ich in Bascom versuche mehrere (arithmetische) Operationen wie z.B. x=5*7+15 auszuführen funktioniert das nicht.
    Stimmt, verkettete Operationen werden in Bascom nicht unterstützt.
    Darüber ob das gut oder schlecht ist gab es hier schon lange Diskusionen.

    Ich finde es manchmal zwar etwas lästig aber eigentlich ganz OK.
    Als Programmierlaie gefällt mir vor allem, dass es Programmierer davon abhält gleich soviele Operationen zu verknüpfen, dass anschliessend kein ormaler Mensch den Code nachvollziehen kann ,-)

    Statt x = 5*7+15 kannst du in Bascom x= 5*7 : x=x+15 schreiben. Dass verhindert hier auf jeden Fall schon mal, dass man über die gute alte Regel "Punkrechnung vor Strichrechnung" stolpert

  7. #17
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.075
    Die Berechnung bei der gleitenden Mittelung kommt mir irgendwie recht einfach und speicherplatz-schonend vor, deshalb noch einmal kurz zu dem Prinzip.
    Zur gleitenden Mittelung mit einer Zeitkonstanten von 1000 Abtastwerten teilt man das bisherige Ergebnis durch 1000 und zieht diesen Wert vom bisherigen Ergebnis ab. Dann hat man noch den 0,999 fachen Mittelwert.
    Zu dem Wert addiert man den durch 1000 geteilten aktuellen Messwert.
    Das wär's,
    Als Anfangsbedingung kann man den ersten Meswert nehmen, und dann auch noch mit einer steigenden Zeitkonstanten in die Mittelung einsteigen.
    (Man wird die Zeitkonstante im allgemeinen als runden Binärwert wählen.)

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Zur gleitenden Mittelung mit einer Zeitkonstanten von 1000 Abtastwerten teilt man das bisherige Ergebnis durch 1000 und zieht diesen Wert vom bisherigen Ergebnis ab. Dann hat man noch den 0,999 fachen Mittelwert.
    Zu dem Wert addiert man den durch 1000 geteilten aktuellen Messwert.
    Das wär's,
    Soweit klingt das einfach, einleuchtend und effektiv. Da werde ich wohl mal die Mittelwertbildung in meinen Programmen umstellen
    Allgemein macht das aber glaube ich nur Sinn, wenn man mit Fließkommatypen rechnet und stößt Florian dann schnell wieder auf das Problem, dass die 4k seiner Demo-Version überschritten werden.

    Ich habe die Integer Messwerte bisher immer in einem Integer aufaddiert und durch die Integer-Anzahl der Messwerte dividiert.
    Sprich ganz ohne Fliesskommazahlen. Dachte eigentlich auch das ist genau genug.

    Als Anfangsbedingung kann man den ersten Meswert nehmen, und dann auch noch mit einer steigenden Zeitkonstanten in die Mittelung einsteigen.
    (Man wird die Zeitkonstante im allgemeinen als runden Binärwert wählen.)
    Hier wird es dann schon zu kompliziert für mich.
    Dass der Mittelwert nur in Mittelwert ist, wenn man die Messwerte in konstanten Zeitabständen aufnimmt, leuchtet mir noch ein.
    Aber in der Berechnung selber geht die Zeit doch gar nicht ein, warum soll es dann möglichst ein runder Binärwert sein?

    Oder soll dieses "Manöver" dafür da sein, um den Mittelwert auch am Anfang richtig zu berechnen, wenn man noch gar keine 1000 Messwerte hat und die Division durch 1000 einen falschen Wert liefern würde?
    Aber selbst da leuchtet mir nicht ein, wöfür man mit einer Zeitkonstanten und nicht einfach mit der Anzahl der aktuell vorhandenen Messwerte rechnet.

    Edit: OK, ich glaube ich habe es. Deine Zeitkonstante ist dasselbe was ich mit "Anzahl der Messwerte" meine.

  9. #19
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.075
    Ja, die Zeitkonstante liefert die Analogie zum RC Tiefpass. Dort ist einem die Funktion e^-t/tau vertraut, sie liefert die gleitende Mittelung.
    Die Funkton gilt hier auch, wenn die Messwerte in gleichen Zeitabständen kommen, bzw aufgenommen werden.

  10. #20
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die analoge Filterung sollte vor den AD wandler, um die Lücken zwischen den Wandlungen zu überbrücken. Wo man da die Grenzfrequenz hinlegt ist hier weniger wichtig irgendwas zwischen etwa 10 Hz und 1 kHz sollte passen. Da sollte auch ein einfacher passives RC gleid reichen.

    Soweit ich weiss wartet getadc(..) auf 2 Wandlungen und dauert damit Größenordnungsmäßig 0,2 ms. Die Schleife ist damit gar nicht so schnell. Einfach 5000 Werte Aufsummieren und man hat auch einen Sekunde.

    Wenn man statt der Testversion von Bascom GCC nimmt, hat man die Begrenzung auf 4 K nicht und der Code wird meistens auch noch etwas kürzer. Allerdings hat man dann kein Double und einige der vordefinierten Funktionen (z.B. LCD, servo etc.) fehlen.

    Die Idee mit dem fließenden Mittel ist auch nicht schlecht, braucht aber in den meisten Ausfürungen eine division und Fließkommazahlen. Es geht ohne, wenn über diesen Trick:
    Mittel := (1023*Mittel+ ADwerrt) / 1024

    Wobei man die Division bei Integer (32 Bit) auch durch shifts ersetzen kann.

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress