Verarbeitung von sehr schnellen Signalwechsel

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Raspberry-Pi Forum,

    ich möchte mit Hilfe meines Raspberry-Pi 3+ Model eine Drehzahlregelung für einen Schrittmotor realisieren. Mein Problem liegt bereits schon bei der Drehzahlerfassung des Schrittmotors. Der Schrittmotor enthält einen Encoder der 5V-Rechtecksignale sendet. Zudem besitzen die Rechtecksignale einen sehr hohen Frequenzbereich von 0-35kHz. Nun ist die Frage, ob der Raspberry-Pi in Kombination mit einem Pyhton- oder C-Programm in der Lage ist, diese schnellen Signalwechsel zu erkennen. Durch zählen der Impulse möchte ich am Ende auf die Drehzahl des Schrittmotors kommen.

    Danke für die Antworten.

    Gruß Aron

  • Durch zählen der Impulse möchte ich am Ende auf die Drehzahl des Schrittmotors kommen.

    Dadurch, dass der RPi ein Betriebssystem hat, das die Resourcen verwaltet, kannst du dir nie sicher sein, ob der RPi alle Impulse erfasst bzw. schnell genug geliefert bekommt um die richtige Zeit spanne auszurechnen. Ich würde für zeitkritische Messungen lieber einen Micro-Controller wie ATmega/ESP (aka Arduino) nehmen.

    Zu deinem Vorhaben gibt es zwei prinzipielle Möglichkeiten:

    1. Die Zeit ist konstant und du zählst die Impulse. Hier bekommst du Jitter, dafür kann die ISR sehr kurz gehalten werden.

    2. Die Anzahl der Impulse ist konstant und du zählst die verstrichene Zeit. Dafür benötigst du eine hohe zeitliche Auflösung

    Glaube ersetzt kein Wissen

  • Bei einem Schrittmotor bestimmst du doch die Drehzahl durch die Ansteuerung. Der Encoder wird gewöhnlich nur für die Positionsbestimmung gebraucht - und auch das eigentlich nur für den Fall, dass Schritte verloren gehen.

    Was ist denn der Hintergrund deiner Aufgabe? Wieso kannst du dich nicht einfach auf die Positionierung durch die Motorschritte verlassen?

    Hier gibts einen C-Code für die Auswertung eines Drehgebers. Wenn du das in einem Mikrocontroller programmierst, hast du eine zuverlässige Erfassung der Drehgeberwerte, die du dann weiter auswerten kannst.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hier gibts einen C-Code für die Auswertung eines Drehgebers

    prima den nutze ich im Arduino mit 1ms Timer, schneller kann ich eh nicht drehen

    PS. Ich kenne nicht mal Schrittmotore im Hobby Bereich die so schnell drehen

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Bei einem Schrittmotor bestimmst du doch die Drehzahl durch die Ansteuerung. Der Encoder wird gewöhnlich nur für die Positionsbestimmung gebraucht - und auch das eigentlich nur für den Fall, dass Schritte verloren gehen.

    Was ist denn der Hintergrund deiner Aufgabe? Wieso kannst du dich nicht einfach auf die Positionierung durch die Motorschritte verlassen?

    Hier gibts einen C-Code für die Auswertung eines Drehgebers. Wenn du das in einem Mikrocontroller programmierst, hast du eine zuverlässige Erfassung der Drehgeberwerte, die du dann weiter auswerten kannst.

    Danke für die schnellen Antworten. Der Schrittmotor ist in der Tat ein Closed-Lopp-Schrittmotor und sorgt dafür, dass Schritte nicht ausgelassen werden. Bin ein bisschen neu in der Materia und bin mir da ein bisschen unsicher. Der Schrittmotor ist billiges chinesisches Produkt, die mir leider keine Auskunft geben können, welches PWM-Signal welche Drehzahl am Motor entspricht.

    Die Grundidee zu der Regelung war, dass es doch sein kann, dass der Motor nicht die Soll-Drehzahl erreicht wenn hinreichend große Lasten an der Motorwelle anliegen. Oder ist eine Drehzahl-Regelung bereits durch den Closed-Lopp hinfällig?

    Danke für eure Hilfe:)

  • Woran bemisst du denn die Solldrehzahl, wenn dein billiges chinesisches Produkt dir keine Infos liefert? Wenn du feststellen willst, ob er zu langsam läuft, musst du doch erst mal wissen, wie schnell er laufen SOLL. Wer weiß, welche Beschleunigungsrampen die Steuerung fährt und ob sie vielleicht schon auf Abweichungen mit Änderung der Solldrehzahl reagiert. Bei Closed Loop erreicht er ja eh den Zielpunkt. Inwiefern ist denn da für dich die Drehzahl relevant? Wenn Schritte verloren gehen, ist ja entweder der Antrieb falsch ausgelegt oder irgendwas kaputt, so dass der Motor blockiert wird. Zudem fährst du bei Closed Loop ja eine Position an. Wenn du nicht gerade einen langen Spindelantrieb hast, sind die Fahrzeiten ja relativ gering. Was genau willst du denn dann mit der Geschwindigkeitsmessung eigentlich feststellen?

    Wie schnell dreht denn der Motor? Wenn er langsam dreht, sollte die Erfassung der Drehgeberimpulse mit einem µC (oder evtl. direkt mit dem Pi) kein großes Problem sein. Wenn er sehr schnell dreht, solltest du vielleicht mit einer geringeren Auflösung arbeiten - ein Hallsensor der bei jeder Umdrehung (oder auch halbe/viertel) ein Signal liefert, ginge vielleicht auch.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Woran bemisst du denn die Solldrehzahl, wenn dein billiges chinesisches Produkt dir keine Infos liefert? Wenn du feststellen willst, ob er zu langsam läuft, musst du doch erst mal wissen, wie schnell er laufen SOLL. Wer weiß, welche Beschleunigungsrampen die Steuerung fährt und ob sie vielleicht schon auf Abweichungen mit Änderung der Solldrehzahl reagiert. Bei Closed Loop erreicht er ja eh den Zielpunkt. Inwiefern ist denn da für dich die Drehzahl relevant? Wenn Schritte verloren gehen, ist ja entweder der Antrieb falsch ausgelegt oder irgendwas kaputt, so dass der Motor blockiert wird. Zudem fährst du bei Closed Loop ja eine Position an. Wenn du nicht gerade einen langen Spindelantrieb hast, sind die Fahrzeiten ja relativ gering. Was genau willst du denn dann mit der Geschwindigkeitsmessung eigentlich feststellen?

    Wie schnell dreht denn der Motor? Wenn er langsam dreht, sollte die Erfassung der Drehgeberimpulse mit einem µC (oder evtl. direkt mit dem Pi) kein großes Problem sein. Wenn er sehr schnell dreht, solltest du vielleicht mit einer geringeren Auflösung arbeiten - ein Hallsensor der bei jeder Umdrehung (oder auch halbe/viertel) ein Signal liefert, ginge vielleicht auch.

    Sorry für die Verwirrung. Ja es ist ein bisschen nervig, dass ich von dem Herstellen keine Auskunft bekomme. Habe mir nochmal ein paar Gedanken gemacht. Die Soll-Drehzahl kann man sich eigentlich sehr leicht ausrechnen. Die Drehzahl vom Schrittmotor kann alleine durch die Frequenz des PWM-Signals geändert werden. Durch die bekannte Schrittauflösung meines Motors (400 Schritte/Umdrehung oder 0,9°/Schritt) kann ich mit Hilfe der Frequenz eines PWM-Signals zurück rechnen. So kann ich die Drehzahl aus den unterschiedlichen Frequenzen berechnen.

    Z.B. wenn ich ein PWM-Signal mit f=1000Hz anlege erhalte ich eine Drehzahl von 150 U/min. Frequenz von 1000Hz bedeutet, dass ich 1000 Impulse pro Sekunde sende, wobei ein Puls einem Schritt entspricht. Also erhalte ich mit

    1000 Impulse/s = 2*400 Impulse/s + 200 Impulse/s

    2,5 Umdrehung/s. Wenn ich das mit 60 multipliziere komme ich auf die 150U/min. Habe diese Werte eben auch überprüft. Stimmt auch so ohne einer Last am Motor. So kann ich für alle mögliche Frequenzen die entsprechende Drehzahl berechnen. Wenn das bekannt ist, kann ich auch Soll-Drehzahlen vorgeben.

    Mir ist bewusst, dass der closed-loop seine Endposition am Ende erreicht, indem er übersprungene Schritte nachholt. Aber zum jetzigen Zeitpunkt interessiert mich nur die Drehzahl. Der Schrittmotor soll unter der Wirkung von Momenten und Axial-Kräften eine möglichst konstante Drehzahl fahren. Zum Einsatz kommt der Motor in Dauerversuchen, bei denen er mehrere Tage durchläuft.

    Gruß Aron

  • Wenn du die Steuersignale und die Rückmeldung des Drehgebers in einen passenden Zähler-IC fütterst, könntest du die Differenz als Zahl am Ausgang sehen. Mit einem µC sollte das aber auch gehen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Wenn du die Steuersignale und die Rückmeldung des Drehgebers in einen passenden Zähler-IC fütterst, könntest du die Differenz als Zahl am Ausgang sehen. Mit einem µC sollte das aber auch gehen.

    Das mit dem Zähler und der Differenz ist eine gute Idee. Habe ich da auch nicht das Problem, dass ich die schnellen Signalwechsel dann auch erkennen muss.

    Meinst du, dass ich mir einen weiteren µC raussuche, der in der Lage ist die Signale zu verarbeiten und dann mit meinem Raspberry kommuniziert?

    • Offizieller Beitrag

    Meinst du, dass ich mir einen weiteren µC raussuche, der in der Lage ist die Signale zu verarbeiten und dann mit meinem Raspberry kommuniziert?

    Hast Du Dir schon Gedanken darüber gemacht, welches Treiberboard für den Motor am RPi verwendet werden soll? :conf:

  • welches Treiberboard für den Motor am RPi verwendet werden soll?

    Leider wird das ohne Angaben nicht funktionieren. Zumindest ein Link zur Bezugsquelle wäre nicht schlecht.

    Ich habe hier bei mir einen NEMA17, also kleiner als der genannte NEMA23, der die Treiberstufe DRV8825 überfordern würde.

    Glaube ersetzt kein Wissen

  • Hast Du Dir schon Gedanken darüber gemacht, welches Treiberboard für den Motor am RPi verwendet werden soll? :conf:

    Als Steuerung verwende ich den PiXtend-V2-S, ist ein Erweiterungs-Board für den Raspberry-pi 3+. Kennst du den? Hier den link dazu.
    https://www.pixtend.de/pixtend-v2/har…2-s-controller/


    Das Board kommuniziert über SPI-Bus mit dem Erweiterungs-Board, dadurch kann ich dann über den Raspberry-Pi auf die ganzen Eingänge und Ausgänge auf dem Board zugreifen. Das Board besitzt Ausgänge mit denen Impulse mit unterschiedlichen Frequenzen erzeugt werden können und diese gebe ich auf die Puls-Eingänge des Motor-Treibers.

    Hier der Link zum Motor: https://de.aliexpress.com/item/330276652…2e-53f4e10a3644  

    Der Motor-Treiber ist der HBS57. Ein chinesisches Produkt.

    Nochmal zu dem Thema Encoder-Signalerfassung. Leider kann ich mit den Eingänge des PiXtend-Boards Impulse mit sehr hohen Frequenzen nicht erfassen, da die SPI-Kommunikation zwischen dem Board und dem Raspberry-Pi „zu langsam“ ist. Der Raspberry bekommt nur alle 2,5ms Daten von dem erweiterungsboard. Das reicht für die hohen Frequenzen des encoders nicht. Ich habe aber noch einen weiteren rasperry-Pi 3+ daheim rumliegen und habe mir überlegt, ob ich diesen zur signalerfassung der Encoder Signale verwenden kann. Dieser würde dann die Daten an meine Steuerung übergeben.
    Deswegen habe ich zu Beginn die Frage gestellt, ob der Raspberry-Pi die Encoder Signale erfassen könnte oder ob ich nach einer anderen Lösung suchen muss.

  • Meinst du, dass ich mir einen weiteren µC raussuche, der in der Lage ist die Signale zu verarbeiten und dann mit meinem Raspberry kommuniziert?

    Das ist jedenfalls eine denkbare und relativ einfache Lösung. Ein Arduino Nano mit 16 MHz arbeitet Befehle in Bruchteilen von µs ab. Dein Encoder liefert Signale im Abstand von ca. einer Millisekunde. Reichlich Zeit also für den µC, die Schritte auszuwerten, die Differenz mitzuzählen und regelmäßig das Ergebnis über die serielle Schnittstelle zu senden.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Moin aron93,

    ich würde auch, wie schon viele vor mir, einen Controller aus der Arduinowelt nehmen. Neben den, schon genannten, Vorteilen kommt noch eine deiner Aussagen zum tragen.

    Der Schrittmotor enthält einen Encoder der 5V-Rechtecksignale sendet.

    Die werden von den genannten Arduino's ohne Hardware verarbeitet. Der Raspberry müsste dafür Levelshifter haben. Er verträgt nur 3,3V an seinen Ein- uns Ausgängen.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • PiXtend-V2-S [...]

    Das Board kommuniziert über SPI-Bus

    Ich habe mir das Board angeschaut, dort wird ein ATmega324A eingesetzt, mit einem Quarz. Was dann darauf hindeutet, dass der ATmega mit 16 oder 20MHz getaktet wird.

    Kannst/Darfst du den Prozessor auf dem Board programmieren? Hat sich auf Seite 84 geklärt. Was kann die mitgelieferte Software so ansprechen?

    Der Raspberry bekommt nur alle 2,5ms Daten

    Das sind gerade mal 400Hz.

    Es tut mir leid, wenn ich das sagen muss, das Board ist einfach fehl am Platz. Mir ist nur nicht klar, was du so genau steuern willst. Du hast erwähnt, dass du die Geschwindigkeit stabil halten willst, in dem du die Impulse des Encoders auszählst. Die Frage ist, wie genau brauchst du das?

    Und ja, für das gesamte System könnte auch nur ein RPi notwendig sein, eventuell mit etwas Transitor-Mimik (die brauchst du dann sowieso, da der RPi 3,3V hat und keine 5V verträgt) und Interrupts.

    Ein chinesisches Produkt.

    Da sehe ich ein weiteres Problem, damit der Schrittmotor als Closed-Loop arbeiten kann braucht er die vier Encoder-Leitungen. Die müssten hochohmig, entweder über einen Transistor/MOSFET oder Opamp entkoppelt werden, Die Chinesen lassen sich leider nicht darüber aus, wie die Signale des Encoders in der Leistungsstufe verarbeitet werden. Du könntest dir einen Adapter bauen und zwischen die D-Sub-Stecker schmuggeln.

    Glaube ersetzt kein Wissen

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!