Forum: Mikrocontroller und Digitale Elektronik Gleitender Mittelwert, Gyro, Hilfe gesucht


von Bascompasstschon (Gast)


Lesenswert?

Hallo liebes Forum!

Ich habe ein Problem und bin momentan am verzweifeln, weil ich den 
Fehler nicht finde. Ich habe ein Gyroskop (ADXRS610) und will die Werte 
in einen Winkel umrechnen. Das klappt soweit auch ganz gut. Allerdings 
wollte ich nun einen Filter implementieren, der einen gleitenden 
Mittelwert bildet, d.h. 4 Werte in einen Array lädt und immer einen Wert 
herausschiebt und einen neuen hineinschreibt. Ich schreibe in den Array 
den Winkelwert (dim Single). Ich habe schon mal nachgeforscht und ein 
Programmschnipsle entdeckt und versucht,den in mein Programm zu 
imlementieren, anbei mein Bascom-Code:

######################################################################## 
###
Dim Index As Byte
Dim Value(4) As Single
Dim Average As Word
Dim Count As Byte


Dim Phi_v_sum As Word
Dim Phi_v_current As Word
Dim Phi_v_mean As Word
Dim Adc_wert As Word
Dim A As Byte
Dim U_const As Single
Dim U As Single
Dim Spannung As Word
Dim Delta_t_unit As Single
Dim Phi_v_mean_unit As Single
Dim Winkelgeschwindigkeit As Single
Dim Delta_phi_unit As Single
Dim Winkelaenderung As Single
Dim Phi_current_unit As Single
Dim Winkel As Single
Dim K As Single
Dim Mittelwert As Single

U_const = 4.88
Delta_t_unit = 0.129

K = 0.269
Index = 1


Do

   Phi_v_sum = 0

   For A = 1 To 10

      Phi_v_current = Getadc(0)
      Phi_v_sum = Phi_v_sum + Phi_v_current

   Next

      Phi_v_mean = Phi_v_sum / 10

'----------------------------------------------------------------------- 
--------'

   'Bandpassfilter: ADC

'----------------------------------------------------------------------- 
--------'

   If Phi_v_mean < 527 And Phi_v_mean > 517 Then

      Phi_v_mean = 520

   Else

      Phi_v_mean = Phi_v_mean

   End If

      U = U_const * Phi_v_mean

      Phi_v_mean_unit = U / 6

      Phi_v_mean_unit = Phi_v_mean_unit - 422.833333333

      Delta_phi_unit = Phi_v_mean_unit * Delta_t_unit

      Delta_phi_unit = Delta_phi_unit - 0.01288503

      Delta_phi_unit = Delta_phi_unit * K

      Phi_current_unit = Phi_current_unit + Delta_phi_unit

'----------------------------------------------------------------------- 
--------'

   'Bandpassfilter: Winkel, Nullpunktdrift

'----------------------------------------------------------------------- 
--------'

   If Phi_current_unit > -1 And Phi_current_unit < 1 Then

      Phi_current_unit = 0

   Else

      Phi_current_unit = Phi_current_unit

   End If

'----------------------------------------------------------------------- 
--------'

   'Gleitender Mittelwert: (gefundener Programmschnipsel)

'----------------------------------------------------------------------- 
--------'

   Value(index) = Phi_current_unit

   Incr Index

   If Index = 5 Then

      Index = 1

   End If

   For Count = 1 To 4

      Average = Average + Value(count)

   Next

   Shift Average , Right , 1

   Winkel = Phi_current_unit

   Mittelwert = Average

   Print ; Winkel

   Print ; Mittelwert

   Waitms 100

Loop

End

######################################################################## 
##
Als Ergebnis kommen nur merkwürdige Werte heraus und weiß woran das 
liegen könnte :-(. Kann mir jemand helfen und mir sagen, wo mein 
Denkfehler liegt? Ich würde mich sehr freuen.

Viele Grüße

von Achim M. (minifloat)


Lesenswert?

# Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Bascompasstschon schrieb:
> For Count = 1 To 4
>
>       Average = Average + Value(count)
>                                '^ muss das C nicht groß sein??
>    Next
>
>    Shift Average , Right , 1

Du addierst 4 Werte, deswegen musst du durch 4 Teilen. Also um '2' 
schieben.
Ich kenn mich jetzt mit BASIC-Datentypen nicht aus, aber kommen auch 
negative Werte in dein Array? dann kannst du nciht schieben. Dann musst 
du Teilen, da Negative Zahlen im Zweierkomplement dargestelt werden. 
Beim Schieben geht da das "Vorzeichenbit" verloren.
mfg mf

von Bascompasstschon (Gast)


Lesenswert?

Hallo Mini Float!

Aaaaa, alles klar, das wusste ich nicht, vielen Dank! Ja, da kommen auch 
negative Zahlen rein. Also wäre es besser, wenn ich das ein paar 
Schritte vorher mache oder? Ich könnte das ja mit der Spannung so 
machen, dass ich die durch einen gleitenden Mittelwert darstelle, weil 
diese nicht negtiv wird. Ok, und dass mit dem Shift werde ich noch 
ändern, ich hatte das in der Bascom-Hilfe falsch verstanden. :-) Danke, 
ich probiere es gleich aus!

von Achim M. (minifloat)


Lesenswert?

1
   For Count = 1 To 4
2
3
      Average = Average + Value(Count)
4
5
   Next
6
7
   Winkel = Phi_current_unit
8
9
   Mittelwert = Average / 4 'muss man da vllt. casten?

Wie ist das mit den Arrayindizes bei Bascom?
Wenn ich ein Array habe

Dim Array(4) as Single

hab ich dann Indizes von 1 bis 4 oder von 0 bis 3??
Wenn letzteres der Fall ist(0-3) greifst du mit Array(4) auf einen 
Speicherplatz hinter deinen 4 Elementen zu. Da steht dann ein 
undefinierter Wert drin.

Ich kenn mich mit BASCOM nicht so aus, programmiere eher in C.
Da ist es folgendermaßen:
signed int Array[4];
//Array-Indizes gehen von 0-3
mf

von Achim M. (minifloat)


Lesenswert?

Nochwas: Single = single precision float.
Das zieht einen Rattenschwanz an Code mit rein. Versuche das doch mit 
16bit signed integer Variablen zu lösen. Stichwort: 
http://www.mikrocontroller.net/articles/Festkommaarithmetik .
mfg mf

von Bascompasstschon (Gast)


Lesenswert?

Achso, bei einem Array in Bascom gehen die Indizes bei 1 los.:-)

Ich bin gerade dabei, den ADC Wert, den ich über den Sensor einlese, 
durch den Filter zu schicken, es funktioniert aber nocht nicht so, wie 
ich will. :-( Der gleitende Mittelwert ist immer 10, obwohl bei 
Stillstand ein Wert von 520 herauskommt.

von Bascompasstschon (Gast)


Lesenswert?

Ok, vielen Dank für den Tipp, ich werde mir das dann mal zu Gemüte 
führen! :-)

von Bascompasstschon (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist noch mein Bascom-Code, ich weiss nicht warum er nur einen 
Mittelwert von ugefähr 10 anzeigt, obwohl dieser um die 520 pendeln 
sollte :-(

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.