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.