Gleitender Mittelwert, Gyro, Hilfe gesucht

Gast #2062311
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
#2062369
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
Gast #2062395
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!
#2062422
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
Gast #2062449
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren