Gast
#2651494
Hallo =) Ich möchte - nun als praktische Anwendung der Regelungstechnik + Digitaler Signalverarbeitung - eine Motorsteuerung bauen. Es geht hier erst einmal um das Berechnen/Anzeigen der Winkelposition und der Geschwindigkeit. Ich habe sowohl Digisiv, Nachrichtentechnik und Steuerungs- und Regelungstechnik in der Uni gehört, die theoretischen Grundlagen sollten da sein. Aber die praktische Umsetzung natürlich nicht -.- Los gehts: An der Motorwelle ist ein Inkrementalencoder befestigt, mit 5000 Steps/Umdrehung. Der Encoder hat einen Quadraturausgang, der über einen Pegelwandler mit einem STM32 verbunden ist. Der uC besitzt in Hardware einen Encodereingang. Da der STM32 4-fach Abtastet ergeben sich 20000 Counts/Umdrehung. Das Counter Reset Register habe ich auch auf 20000 eingestellt, weil ich damit dann genau detekieren kann, wie viele Umdrehungen stattgefunden haben (oder würdet ihr den Wert höher ansetzen, das Register ist 16 Bit breit). Nun wird mit 100Hz dieses Register abgetastet, in einen Puffer geschrieben und per UART rausgeschickt. Per Matlab greife ich auf die serielle Schnittstelle zu und baue aus den Hex Werten meine Zahlen zusammen. Weil nach einer Umdrehung der Überlauf kommt, ist die Kurve natürlich unstetig. Ich habe versucht, mir die Kurve stetig fortzusetzen, indem ich die Sprungstellen detektiere (ganz primitiv):
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Die Grenzen sind erstmal willkürlich gesetzt. Wenn es da vernünftige Vorschläge gibt, wie ich die berechnen kann, immer her damit ;) Das ganze für sprung_runter analog. Dann addiere bzw subtrahiere ich ab den jeweiligen Sprungstellen 20000. Die Kurve sieht dann auch schön fortgesetzt aus. Von den "kontinuierlichen" Winkeldaten möchte ich dann die Geschwindigkeit berechnen, also Differenzenquotient von je zwei benachbarten Werten. Da geht die Sache natürlich schon los, es wird sehr zackelig. Diese Werte habe ich mit einem moving average Filter (einfacher FIR, mit den 16 Koeffizienten 1/16). Sieht besser aus (halt geglättet), aber in einem anderen Thread wurde bereits angemerkt, dass dies nicht der richtige Weg sein könnte. Soweit der Stand der Dinge. Jetzt habe ich einige Fragen (es geht momentan um die Nachbearbeitung einer Messkurve in Matlab. Es geht noch nicht um die Regelung!) - Die Abtastfrequenz sollte mehr als doppelt so hoch sein, wie die Grenzfrequenz/Signalfrequenz des Signals. Aber wie ist die Grenzfrequenz? Da ich noch gar keinen Filter angewendet habe wird das Signal ja kaum bandbegrenzt sein. - Was ist überhaupt die "Signalfrequenz"? Die Drehfrequenz des Winkels? Die kann ja u.U. ziemlich groß werden ;) Ich nehme daher mal 3000u/min=50u/s an. Pro Umdrehung gibts 4*5000 Steps -> 1e6 steps/s. Krass :D. Wenn ich zweimal abtasten möchte bei dem Register, das bei 20000 überläuft muss ich mit 100Hz abtasten: 1e6 steps/s/20000steps=50/s. Doppelt soviel -> >100Hz. Stimmt das? - Muss ich das aufgezeichnete Winkelsignal jetzt fortsetzen, wie oben beschrieben, oder ist es sinniger das als eine Art Sägezahn Signal aufzufassen? Fortgesetzt wirkt es halt realistisch, gibt den echten Winkel an. - Wenn ich langsamer als mit 3000u/min drehe habe ich mehr Abtastpunkte pro Umdrehung. Da könnten z.B. auch Ausreißer drin sein, wie glätte ich die? - Sollte man mit den Abtastpunkten weiter rechnen (und durch Ausreißer heftige Sprünge in Kauf nehmen), oder sollte man versuchen das Signal zu interpolieren und damit wieder quasi Analog machen (splines?)? - Sollte ich ein (möglichst ideales) Eingangsfilter (TP) mit 50Hz ansetzen? Dadurch bekäme ich jedoch höhere Umdrehungen nicht mit, oder gingen die eh im Alias unter? - Matlab bietet ja diverse Filter an, die einen besseren Frequenzgang haben, als der einfache Differenzenquotent : v(n)=(q(n+1)-q(n))/T, der eher Hochpass als Tiefpasscharakteristik aufweist. Aber wenn ich die anwende, erhalte ich dann überhaupt noch die Geschwindigkeit? Wenn ich eine höhere Ordnung wähle könnte doch auch schon die Beschleunigung rauskommen? - Wie glätte ich am besten meine zackeligen Kurven ohne relevante Informationen zu verlieren? In der Theorie gabs nämlich immer eine wunderschöne gerade, stetige Kurve eines Motors, da musste nix mehr geglättet werden, sowas haben wir einfach nicht gelernt :/ Und je nachdem, wie groß der Aufwand oben wird (z.B. mit Eingangsfilter), wie soll man denn sowas in dem uC in Echtzeit zur Regelung verwenden? Geht doch garnicht? Ich kann doch nur aus den paar Werten, die ich gerade habe eine Geschwindigkeit berechnen. Wenn die schon zackelig sind, wie soll die Regelung da vernünftig klar kommen? Ihr seht, Fragen über Fragen. Ich bedanke mich ganz herzliche bei denjenigen, die sich das Spektakel hier durchgelesen haben. Wenn noch was unklar ist, fragt nach ich Antworte zeitnah ;) Danke und schöne Grüße!