-
        

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: Messwert durch arithm. Mittel stabilisieren

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    30
    Beiträge
    136

    Messwert durch arithm. Mittel stabilisieren

    Anzeige

    Hallo,

    ich überlege jetzt schon seit Stunden wie ich es am einfachsten machen könnte eine schwankende Messung stabil zu bekommen. Also z.B. über einige Sekunden die Messungen aufaddieren und dann durch die Anzahl der Messungen zu teilen. Habe mir hierzu auch schon einen Sekundentakt gebastelt, wollte die Messwerte in einem Array speichern und per Laufvariable die Anzahl der Messungen mitzählen. Mir scheint das aber alles viel zu kompliziert zu sein. Ich komme jedoch einfach nicht auf eine einfache Lösung.

    Ich möchte einfach einen stabilen Wert für die Displayausgabe haben. Es handelt sich um eine Füllstandsanzeige einer Zisterne. Es ist also völlig unkritisch. Da können ruhig einige Sekunden, eigentlich sogar Minuten verstreichen bis die Messung auf dem Display aktualisiert wird. Es stört nur eben wenn die Zahlen ständig "hin und herwackeln".

    Wäre für einen Vorschlag dankbar


    Gruss Florian.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Das was du beschrieben hast ist eine durchaus übliche Vorgehensweise bei derart unkritischen Sachen (natürlich kann man auch einen Tiefpass als FIR oder IIR Filter implementieren, aber in diesm Fall wäre das übertrieben).


    Du musst nur aufpassen daß du bei der Summe keinen Überlauf kriegst, ansonsten gibts eigentlich nichts was man falsch machen könnte.


    und falls dich die Geschichte mit dem Timer stört, nimm doch stattdessen einfach immer eine feste Anzahl an Werten, dann brauchst du nur mitzählen.
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo Florian.,
    richtig, mit einem Array die Werte aufsummieren und durch die Anzahl teilen beruhigt den Meßwert.
    Da gibt es verschiedene Ansätze.
    Ich würde mit jeder Messung einen (Array-)Zeiger inkrementieren. Der neue Wert kommt dann in die entsprechende Arrayvariable. Dann wird das Array aufsummiert und durch die Anzahl dividiert.

    Schwankende Meßwerte entstehen aber auch gerne durch unsaubere Spannungsversorgung bzw. Referenzspannung.

    Gruß, Michael

  4. #4
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    64
    Beiträge
    12.367
    Bei der gleitenden Mittelung multipliziert man den bestehenden Mittelwert mit 1-w und addiert den mit w multiplizierten aktuellen Messwert.
    Dabei ist w beispielsweise 0,1 oder 0,001.
    So wird die Verwaltung der Messwerte bei der Mittelung recht einfach.

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man die Werte nur aufsummieren will, braucht man die Werte gar nicht einzeln speichern. Es reicht, einfach nur den neuen Wert zur Summe zu addieren und mitzuzählen wie viele Werte man schon hat. Das Spart einiges an knappen SRAM.

    Man muß am Ende auch nicht genau durch die Zahl der Messerte zu teilen. Es reicht wenn man den dann geänderten Wertebereich berücksichtigt. Wenn man also z.B. 256 Werte Aufsummiert kann man so tun als wäre die Summe das Ergebis eine 18 Bit AD Wandlers, also Werte bis 2^18-1. Die Tatsächliche Auflösung wird natürlich nicht so gut, aber kann duchaus besser als die ursprünglichen 10 Bit werden.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554

    Re: Messwert durch arithm. Mittel stabilisieren

    Zitat Zitat von Florian.
    ... möchte ... stabilen Wert für die Displayausgabe ... eine Füllstandsanzeige einer Zisterne ...
    Ich weiß nicht, wieviel Zu- und Abflüsse Deine Zisterne hat bzw. welche Mengen da bilanziert werden müssen. Aber so ganz allgemein denke ich, dass sich der Pegelstand einer Zisterne nur selten schneller als 1 mm pro Sekunde, eher pro Minute?, ändert.
    Zitat Zitat von Florian.
    ... können ruhig ... sogar Minuten verstreichen bis ... Display aktualisiert wird ...
    Also würde ich so etwa im Sekundentakt messen, nach 8 oder 16 Messwerten dividieren (Überlauf war ja schon angesprochen) und das Ergebnis mit dem alten Wert vergleichen. WENN das Ergebnis anders ist als der alte Wert - dann die Anzeige um eins verstellen - sonst nix machen. Wenn das immer noch zu stark schwankt, könnte man die Verstellung nochmal durch einen Counter bremsen - nach mehreren Verstellwünschen in die gleiche Richtung wird verstellt. Diese Beschreibung ist jetzt nicht die blanke theoretische Herleitung, aber so stelle ich mir eben einen möglichen Lösungsweg vor.
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man das Display etwa jede Sekunde aktualisiert, kann man den Zahlen in der Regel noch folgen. Es stört dann auch nicht mehr wenn die letzte Ziffer doch zwischen 2 Werten schwankt.

    Ein begrenzen auf nur kleine Schrittte ist eher hinderlich, besonders für Tests.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    oder nen ringpuffer ... hat den charme, dass man sich nen trend
    errechnen kann
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    30
    Beiträge
    136
    Hallo,

    entschuldigt bitte, dass ich mich erst jetzt melde. Ich musste spontan weg und bin erst jetzt wieder zu Hause. Ich werde mir jetzt eure zahlreichen Antworten genauer durchlesen und versuchen das in Bascom umzusetzen. Sollte ich hierbei noch Probleme haben würde ich mich nochmal melden.

    Vielen Dank

    Florian.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.12.2004
    Ort
    Ulm
    Alter
    30
    Beiträge
    136
    Hallo,

    habe mich jetzt heute nachmittag mit der Bascomumsetzung auseinandergesetzt, aber noch kein zufriedenstellendes Ergebnis erhalten.
    Wenn ich aufsummiere dann rennt der AVR ja sehr schnell durch die Schleife mit seinen 16Mhz und ich habe wieder nur eine Momentaufnahme. Mit waitms zu arbeiten ist ja nicht sonderlich elegant, weil der ganze Controller währenddessen nichts macht.
    Als ich noch ein paar Single oder Double Variablen zusätzlich deklariert habe kam auch schon die Fehlermeldung, dass ich an die Grenzen der Bascom Testversion hinsichtlich Codeumfang gestoßen bin. Kann das sein mit so einem kleinen Progrämmchen?

    Ich würde nämlich noch gerne zusätzlich einen 1wire Temperaturfühler (Ds1820) implementieren. Das ganze soll später auf einem Mega8 laufen. Nur zum programmieren benutze ich der Schnittstelle wegen das RNControl mit Mega32.

    Mein vermutlich höchst ineffizienter Code lautet bisher wie folgt:

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    $hwstack = 64
    $swstack = 64
    
    
    
    Dim Aw As Integer                                           'Analogwert
    Dim Men As Integer                                          'Menüvariable
    Dim Volumen As Single
    Dim Volint As Integer                                       'Volumen als Integer
    Dim Hoehe As Single
    Dim Prozent As Integer                                      '
    Dim Balken As Single                                        'Balkenanzeige LCD
    Dim U As Integer                                            'Konvertierung Single Integer
    Dim I As Integer
    Dim X As Integer                                            'Zählvariable For Schleife
    
    
    
    
    
    'Variable initialisieren:
    Men = 1
    
    
    
    
    'LCD:
    Config Lcdpin = Pin , Rs = Portb.7 , E = Portb.6 , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2
    Config Lcd = 16 * 2
    Initlcd
    Cursor Off
    Cls
    
    
    
    
    'ADC:
    Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
    Config Pina.7 = Input                                       'Für Tastenabfrage
    Porta.7 = 1                                                 'Pullup Widerstand ein
    Start Adc
    
    
    
    
    
    Cls
    Lcd "****Zisterne****"
    Wait 2
    Cls
    
    Portd.2 = 0
    Portd.3 = 0
    
    
    
    
    
    Config Pind.2 = Output
    Config Pind.3 = Input
    Config Debounce = 10
    
    Do
    Gosub Berechnung
    Debounce Pind.3 , 1 , Menuvar , Sub
    Gosub Menu
    
    Loop
    
    End
    
    
    
    
    'Volumenberechnung aus Analogwert
    Berechnung:
    
    Aw = Getadc(7)
    Hoehe = Aw / 240
    Hoehe = Hoehe * 23
    Volumen = 176.714 * Hoehe
    Volint = Volumen
    Return
    
    
    'Menü
    Menuvar:
    
    If Pind.3 = 1 Then
      Waitms 500
      If Pind.3 = 1 Then
        Locate 2 , 1
        Lcd "                "
        Incr Men
      End If
    End If
    Return
    
    
    
    'Menüauswahl
    Menu:
    
    Select Case Men
    
      Case 1 : Lcd "                "
                Locate 1 , 1
                lcd "Fuellstand:"
                Locate 2 , 6
                Lcd Volint ; " l"
    
    
      Case 2 : Lcd "                "
                Locate 1 , 1
                lcd "Fuellstand:"
                Balken = 0.004 * Volumen
                Balken = Round(balken)
                U = Balken
                For I = 0 To U Step 1
                  Locate 2 , I
                  Lcd Chr(0)
                Next U
    
    
      Case 3 : Lcd "                "
                Locate 1 , 1
                lcd "Fuellstand:"
                Locate 2 , 6
                Prozent = Volumen / 40
                Lcd Prozent ; " %"
    
      Case 4 : Men = 0
                Cls
                Locate 1 , 1
                Lcd "Temperatur"
    
    
    End Select
    Return
    Explizit geht es um die Berechnungsroutine. Das Volint würde ich gerne auf einem LCD ausgeben und würde gerne verhindern, dass die Anzeige zu sehr schwankt. Aber ich bekomme wie schon gesagt keinen kompakten Code für dieses Problem auf die Reihe.
    Vielleicht kann mir jemand den entscheidenden Tipp geben.

    Besten Dank

    Florian.

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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