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
# 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
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!
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
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
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.
Ok, vielen Dank für den Tipp, ich werde mir das dann mal zu Gemüte führen! :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.