Hi,

Der mega32 liest die Daten vom XYZ Chip und gibt sie ohne veränderung am RS232 aus (3 Werte, je von 0..360)

Am PC lese ich die RS232 Daten mit PureBasic wieder ein, und die drei Werte landen in x_in, y_in, z_in - noch ungefiltert, also sehr hackelig - wie bei dir auf dem Video.

In PureBasic filtere ich dann die 3 Daten mit einem Tiefpassfilter - das ist nichts anderes als eine Samplekette durch die alle werte durchgeschoben werden. Z.B in einem Array von 10 Samples stehen nun die letzten 10 eingelesenen Werte von X. Wenn ich die 10 Samples addiere und durch 10 Teile erhalte ich den Mittelwert.
Die Anzahl der Samples ist als Variable, da ich damit die Steilheit des Filters einstellen kann. Probier mal 100 als "Tiefpass".

Hier der Code des Tiefpass - in PureBasic, solte aber verständlich sein:
_________________________________

dim count as byte ; Hilfsvar
dim tiefpass as byte ; die Anzahl der Samples

; die Länge/Steilheit des Filters
tiefpass = 10


; jetzt die Arrays in denen die Samples landen
dim array filter_x.w(tiefpass) as word
dim array filter_y.w(Tiefpass) as word
dim array filter_z.w(Tiefpass) as word


; ---------- FILTER 1 ------------------
; alle einen nach links schieben
; ich benutze vom Array die Stelle 0 nicht
; der letzte Werte wird später der neue

For count = 2 To tiefpass
filter_x.w(count-1)=filter_x.w(count)
filter_y.w(count-1)=filter_y.w(count)
filter_z.w(count-1)=filter_z.w(count)
Next count

; den letzten Sample mit dem aktuell eingelesenen wert füllen
filter_x.w(tiefpass)=x_in
filter_y.w(tiefpass)=y_in
filter_z.w(tiefpass)=z_in

; die Summe löschen
sum_x.w=0
sum_y.w=0
sum_z.w=0

; und den Mittelwert bilden
For count= 1 To tiefpass
sum_x.w = sum_x.w+filter_x.w(count)
sum_y.w = sum_y.w+filter_y.w(count)
sum_z.w = sum_z.w+filter_z.w(count)
Next count


; und noch durch die Anzahl der Samples teilen
; und das Ergebnis steht in den folgende Vars:
x_smooth = Abs(sum_x.w / tiefpass)
y_smooth = Abs(sum_y.w / tiefpass)
z_smooth = Abs(sum_z.w / tiefpass)


; voila

_______________________________

Der Nachteil dieses Tiefpasses: Es dauert natürlich bis die BErechnung getätigt ist, und zwar solange wie die Länge des Arrays (tiefpass).

Habe in meinem Code 3 kleine Filter hintereinandergeschaltet - das kannst du auch mal versuchen.

gruß - Klaus