Puls-Pausen-Modulation - Raspberry Pi

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Peanuts1_1.

    Puls-Pausen-Modulation - Raspberry Pi

    Hallihallo,
    Ich habe ein ganz dummes verständnis Problem...

    Und zwar möchte ich ein PPM Signal, an eine Modellfernsteuerung geben. Das funktioniert über einen Lehrer-Schüler Eingang, und ist (noch) nicht das Problem.
    Um das PPM signal zu erzeugen, wollte ich meinen Raspberry Pi, mit der WiringPi lib benutzen. Dieser Besitzt ja auf GPIO-Pin 18 ein PWM-Signal möglichkeit.
    Falls ich das richtig verstanden habe, ist ein PPM Signal im grunde nichts anderes als ein umgedrehtes PPM Signal oder :?: Beim PPM Signal ist der Puls fest (0,5ms) und der Bereich zwischen den Flanken auschlaggebend (0,5-1,5ms). Bzw brauch das die Fernbedienung in diesem Fall.

    Die WiringPi lib bietet also die Möglichkeit, für das PWM Signal, einmal den Divisor zu setzen
    pwmSetClock (int divisor) ;
    This sets the divisor for the PWM clock.

    den "Range" zu setzten
    pwmSetRange (unsigned int range) ;
    This sets the range register in the PWM generator. The default is 1024.

    Und den (?eigendlichen) Wert zu schreiben :?:
    void pwmWrite (int pin, int value) ;
    Writes the value to the PWM register for the given pin. The value must be between 0 and 1024.


    Also wenn ich das richtig verstanden habe, teil der Divisor sozusagen die Taktrate (vom Prozessor :?:/ Haupttakt :?: ) auf. Also wenn der einen Takt von zB. 10Mhz hat, und ich den Devisor auf 500 Setze, hätte ich dann einen Takt von 10.000.000\500 = 20Khz ? für das PWM Signal?
    Was genau macht der "Range" in diesem Fall? Gibt der den Bereich an, für den eigentlichen Wert?
    Und was schreibt der pwmWrite? trägt man hier den DutyCycle ein? Wenn ja, wie soll man dann damit so ein PPM Signal erzeugen... Der DC gibt doch nur das Verhältnis von Peak zu Pause an oder? Aber ich will ja einen festen Peak... Und ich dachte der DC wäre ein Wert zwischen 0-1..

    Vll kann mir das jmd erklären.. hänge da wie gesagt grade etwas im Kopf fest... ?(

    Lg Peanuts
    Moin,

    Servosignale sind normale PWM-Signale. Die Pulsweite schwankt dabei zwischen 1 ms (linker Anschlag) und 2 ms (rechter Anschlag). Des Weiteren hat das Signal normalerweise eine Frequenz von 20 Hz.
    Wie generiert der Pi das Signal: In Software oder über externen Hardwarechip? Falls das per Software generiert wird, kann man das eigentlich vergessen (da startet ein Cronjob und dann kommt die Taktung durcheinander).
    Ich würde dafür einen externen Mikrokontroller, z. B. einen AVR, nutzen, den per UART mit dem Pi kommunizieren lassen und darauf PWM generieren.

    Machst du das eigentlich wirklich mit .NET (C++/CLI ist .NET-C++)?
    Mit freundlichen Grüßen,
    Thunderbolt
    @Thunderbolt Jou.
    @Peanuts1_1 Entweder die DLL liefert bereits einen .NET-Wrapper mit oder Du solltest Dir einen bauen.
    CLI ist da nicht unbedingt nötig. Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich hab das nur angeklickt, weil ich nicht sicher war was sonst :D (sry)
    Ich schreibe das eig. in C, und Compiliere das dann mit der GCC

    @Thunderbolt Das soll kein direktes Servo Signal werden, sonder die entsprechende Schüler Anlage Simulieren. Die Lehrer Anlage wandelt das dann in ein "Richtiges" Servo Signal um:
    de.wikipedia.org/wiki/Puls-Pausen-Modulation
    Da liegt die Pause zwischen 0.5ms (Links) und 1.5ms (Rechts)
    Soweit ich das weiß, ist das ein Hardware Signal.

    //Edit
    Vll. um das nochmal etwas einfacher zu formulieren, ich verstehe nicht, wie ich mit den Parametern/Funktionen aus der Wiring lib und dem Hardware PWM Pin so ein PPM Signal erzeugen kann:
    //Edit 2:
    Ich bin etwas weiter gekommen, für die, die es Interessiert: Der Haken war, das man erstmal den PWM Modus auf "Normal" umstellen muss, da von Haus aus ein Balanced Mode läuft, der eine direkte Steuerung nicht möglich macht: pwmSetMode(PWM_MODE_MS);

    Nun läßt sich mit pwmSetRange (unsigned int range) ; die Dauer der Pause einstellen, wobei von dem Anfang des Vorherigen Peaks gerechnet wird.

    pwmSetClock (int divisor) ; ist tatsächlich der divisor, mit dem sich einfach eine unter-Zeiteinheit erstellen lässt.

    void pwmWrite (int pin, int value) ; gibt dann schlussendlich die dauer des Peaks an.


    Vll hilft das jmden da draußen...
    Jetzt muss ich mir "nur" noch daraus ein PPM Signal basteln.. Wenn da irgendjemand noch einen Tipp zu hat, immer her damit ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peanuts1_1“ ()