L I V E Stammtisch ab 20:30 Uhr im Chat
  • Moin,

    ich möchte gerne zwei Schrittmotor über PWM ansteuern. Ich nutze dafür ein PYthon Skript. Die PWM ist knapp im MHz Bereich.

    Ich stoße dabei nun auf das Problem, dass der Pi damit durch das ständige abfragen an seine Auslastungsgrenze gelangt. Das äußert sich nicht nur an der 100%igen Auslastung. Er unterbricht stellenweise auch die Modulation. Es sind deutliche Lücken zu erkennen und das äußert sich dann natürlich auch durch einen unruhigen LAuf des Motors. Ich nutze den Pi1 Modell B.

    Ich habe bereits gesehen das es auch ein Kernel Modul von adafruit für die PWM gbt. Dies ist allerdings nur an einem Pin möglich..

    Hat jemand eine Idee wie man das lösen kann? Umgehen kann oder wie auch immer.. Bin da im Moment voll in der Sackgasse.. :wallbash:

    Die fUNKTION SIEHT DABEI WIE FOLGT AUS:

    Das Problem liegt in der ständigen Abfrage der aktuellen Zeit und dem damit verbundenen Vergleich.. Denk ich zumindest

    MfG

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

  • Hallo,

    ich hatte ein ähnliches Problem mit den Frequenzen,

    ist meiner Meinung nach, nur mit zusätzlicher Hardware möglich, eine "saubere " PWM auf mehreren PINs zubekommen.

    Lösung wäre ein FPGA oder µC.

    Die Schrittmotoren sind aber nicht direkt angesteuert, sonderen mit einem halb, viertel oder achtelschritt, deshalb brauchst du auch so hohe Frequenzen?

  • Zitat

    Wieso also PWM ?

    Weil ein Puls zu dem eine Entprellzeit erwartet wird auch ein PWM Signal ist.

    Zitat

    Und was für einen Motor?

    Ein Schrittmotor von Nanotec (ST5918L3008).

    Zitat

    Lösung wäre ein FPGA oder µC.

    Habe leider auch das Gefühl das da noch ein Knecht dazwischen muss...

    Zitat

    Die Schrittmotoren sind aber nicht direkt angesteuert, sonderen mit einem halb, viertel oder achtelschritt, deshalb brauchst du auch so hohe Frequenzen?

    Das ist im Moment noch nicht einmal unbedingt erforderlich, da noch ein Getriebe mit einer Untersetzung von 15 davor ist... verhält sich dann allerdings wie ein fünfzehntel Schritt... Dadurch sind die Schrittgeräusche aber auch schon verringert durch die höheren Drehzahlen des Motors.

    Ich habe gelesen das der BCM2835 auf dem Chip zwei PWM Channel hat.. Aber wie kommt man an die ran???

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:


  • Ich stoße dabei nun auf das Problem, dass der Pi damit durch das ständige abfragen an seine Auslastungsgrenze gelangt. Das äußert sich nicht nur an der 100%igen Auslastung.

    Jeder PC würde bei solch einem Script 100% CPU Last haben. Insbesondere wenn es eine Schleife (while) gibt die ungebremst routieren kann.
    Was denkst du wie oft sich die while innerhalb einer Sekunde auf einem Pi im Kreis dreht? ca. 100x

    Bedeutet: Es liegt an deinem Code.
    Setz an den Anfang der while eine künstliche Verzögerung von zB 0.01 und dieses Problem ist Geschichte.

  • Zitat

    Was denkst du wie oft sich die while innerhalb einer Sekunde auf einem Pi im Kreis dreht? ca. 100x

    In dem was ich jetzt gepostet habe sieht man die Zeitdifferenz nicht... Die beträgt eine ms (besser noch weniger)... Wie sonst kann ich das erreichen?? Und mit einem sleep() würde dabei was willkürliches und weniger periodisches raus kommen...

    Daher bin ich auf der Suche nach etwas wo ich unabhängig von meinem Skript.. also irgendwo in der peripherie ein PWM Signal generiere... und die pigpio könnte genau dies bewirken...

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

  • Das es an der while Schleife liegt ist mir an sich bewusst... Genau da liegt ja auch irgendwo das Problem.. Nur wie kann ich sonst kontinuielich Flanken mit hoher Frequenz in zeitlicher Abhängigkeit erzeugen?? Am besten unabhängig vom Programm selbst, da auf diese Art und Weise auch keinerlei Interrupt funktioniert... Was er mit einem sleep aber auch nicht machen würde...
    Automatisch zusammengefügt:
    ach ja.. und dann am besten auch nur eine bestimmte Anzahl an Flanken...

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

    Einmal editiert, zuletzt von Kornfeld (23. Februar 2016 um 15:39)

  • Um da mal etwas abzukürzen. Mit einem Betriebssystem, welches Multithreading nutzt, ist PWM über eine Sprache, die einen Interpreter nutzt nicht möglich. Man kann aber mit Hilfe von Pythonmodulen, wie z.B. raspberry-gpio-python, PWM erzeugen, weil solche Module in C geschrieben sind. 100% PWM gelingt damit zwar auch nicht, aber 1000 mal besser als mit einem Pythonscript ohne solche Module. https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/

    Übrigens funktionieren Interrupts unter Nutzung des selben Moduls auch während sleep().

  • Entschuldige aber was ist das bitte für ein Quatsch? Ich bin zwar auch kein Experte aber so viel weiß ich schon dass das So nicht stimmt

    "Betriebssystem, welches Multithreading nutzt" .. was hat das damit zu tun?

    "raspberry-gpio-python, PWM erzeugen, weil solche Module in C geschrieben sind" ... RPi.GPIO ist plötzlich doch nicht in C geschrieben? Aber ich dachte ein OS welches Multithreading nutzt kann kein PWM :s das zumindest war die vorherige Aussage:

    Mit einem Betriebssystem, welches Multithreading nutzt, ist PWM über eine Sprache, die einen Interpreter nutzt nicht möglich.

    Aber im 2.Satz ist es dann plötzlich doch möglich? :-/

    Man kann aber mit Hilfe von Pythonmodulen, wie z.B. raspberry-gpio-python, PWM erzeugen, weil solche Module in C geschrieben sind.

    Also, noch mals sorry, aber der ganze Beitrag ergibt, zumindest für mich, kein Sinn. Schön formuliert, aber, Inhaltlich, unverständlich.

    Software-PWM ist verständlicherweise etwas anders als Hardware-PWM. Beides wird aber über Software gesteuert. Trotzdem kann man deshalb nicht alles in ein Topf werfen so wie Du es gemacht hast.


    Das Problem war nicht die while An Sich, sondern dessen Aufbau. Es spricht absolut nichts gegen eine while, nur in Deinem speziellen Fall rotiert die while ungebremst sofern keiner der beiden haupt-if's greift.
    Du hast ja zB schon mit gekriegt dass das "try: except:" Konstrukt nicht in die while sondern drum herum gehört, um die while unterbrechen zu können - zumindest ist das ein Weg.
    Deine while wird aber nur bei "if currenttime - previoustime >= v1 and STakt1 == False:" ausgebremst. Wenn diese Bedingung aber nicht zutrifft verursacht die Schleife 100% CPU Auslastung. PWM machst du, zumindest in dem Code aus Beitrag#1, dort aber nirgends!

  • Richtig.. Wenn die Zeit welche das Siganl auf High ist eine bestimmte erreicht hat geht es auf low.. und andersrum...

    Ich glaube eine derartige PWM wie ich sie gerne hätte sollte über einen µC realisiert werden, da ich auch nur eine bestimmte Anzahl an Flanken hätte...

    was raspiprojekt meinte war denke ich einfach nur das es in Python nicht möglich ist, da diese Sprachen interpretiert wird.. Bei einer Sprache wie C schon, da sie kompiliert wird... Allerdings hat die lib auch Einschränkungen die auf meinen Fall nicht so passen... Alleine dadurch das ich die Flanken wieder über Hardware detektieren müsste macht die Sache unnötig kompliziert..

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

Jetzt mitmachen!

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