Mittwoch, Januar 22, 2020

Die Steuerung eines Servos mit raspberry pi, mit dem hardware-PWM mit wiringPi

Habe ich versucht die Steuerung den servo mit softPwm mit der wiringPi-Bibliothek, aber diese hat das servo an zu Stottern.
Deshalb will ich die hardware-PWM-pin auf dem Raspberry Pi (GPIO18) mit der wiringPi-Bibliothek.
Aber ich verstehe nicht, wie stellen Sie die Frequenz auf 50 Hz, und ändern Sie den Arbeitszyklus, um eine Puls Breite im Bereich von 0.8 ms bis 2,5 ms.

Fand ich die Beziehung auf dem internet (ich weiß nicht, ob es richtig ist):

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.

ich weiß, die Uhr divisor max-Wert ist etwas um die 4000 und der Raspberry Pi-PWM-Uhr hat eine Grundfrequenz von 19,2 MHz. also das gibt mir ~4,8 KHz.

bekam ich schon diese Einstellungen, die mir geben sollte ~50 Hz unter Verwendung der folgenden Beziehung:

//put PWM in mark-space mode, which will give you 
//the traditional (and easily predictable) PWM    
pwmSetMode(PWM_MODE_MS);
//setting ping GPIO 18 as a pwm output
pinMode(18,PWM_OUTPUT);
//Set clock divisor to 4000
pwmSetClock(4000);
pwmSetRange (10) ;

Ich nicht bekam ein Oszilloskop zu testen, das Ausgangssignal zu überprüfen, welche Einstellung was geändert. das macht es schwer, es selber herauszufinden.

Lange Geschichte kurz:
Kann mir jemand sagen, wie ich erreichen kann ein duty-cycle mit einer Impulsbreite von 0,8 ms bis 2,1 ms für die Steuerung eines Servos mit dem hardware PWM auf dem Raspberry Pi.

InformationsquelleAutor user2543697 | 2013-11-19

4 Kommentare

  1. 8

    Ich bin ein absoluter newby auf Pi und Servo. Aber ich habe es mit wiringPi.

    Er sagt hier, dass wir suchen, um Puls von 1ms bis 2ms Länge, alle 20ms oder so. Vorausgesetzt, dies 19.2 Mhz base-clock ist in der Tat richtig, die Einstellung pwm-Takt auf 400 und pwm-Spektrum 1000 ist, einen Impuls auf 48Hz oder jeder 20.8 ms. Dann die Einstellung der pwm-Wert auf 48 sollte Ihnen einen 1 MS langen Puls-und pwm-Wert von 96, sollte Ihnen ein 2ms langer Puls.
    Aber Sie müssen den chip in pwm-ms-Modus.
    (Viel soll hier, da ich nicht über eine osciolloscope entweder)

    So, um es einzurichten:

    • gpio mode 1 pwm
    • gpio pwm-ms
    • gpio pwmc 400
    • gpio pwmr 1000

    Dann können Sie schalten Sie das servo von Links nach rechts über

    • gpio pwm 1 48
    • gpio pwm 1 96

    (Tatsächlich, das servo hab ich arbeitete von 28 bis 118; könnte sein das der servo)
    (Die setup-Sequenz scheint wichtig; könnte ein Fehler sein)

  2. 5
    if (wiringPiSetup () == -1) //using wPi pin numbering
     exit (1) ;
    
    pinMode(1, PWM_OUTPUT);
    pwmSetMode(PWM_MODE_MS); 
    pwmSetClock(384); //clock at 50kHz (20us tick)
    pwmSetRange(1000); //range at 1000 ticks (20ms)
    pwmWrite(1, 75);  //theretically 50 (1ms) to 100 (2ms) on my servo 30-130 works ok
    return 0 ;

    Stellen Sie sicher, dass Sie mit richtigen gpio-pins!

    Modelle A und B haben eine hardware-PWM auf pin 18 BCM (1 wPi).

    Modelle A+ und B+ können den Ausgang der zweiten hardware-pwm an den pins 13 und 19 BCM (23, 24 wPi)

    • Uhr 384 + Reichweite 1000 – arbeitete wie ein Charme für mich. Werte 1 bis 75 zu gehen scheint von schnell gegen den Uhrzeigersinn drehen, um zu stoppen, und um 76 151 – stop zu schnell im Uhrzeigersinn drehen. Danke!
    • P. S. Vergaß zu erwähnen, diese waren die Ergebnisse für FS90R continuous rotation servo.
  3. 0

    Ich habe wiringPi, es zu tun durch software bit-banging. Ich könnte versucht haben, RPIO, aber meine spezielle Anwendung erfordert, dass der audio-Ausgang funktioniert, und ich verstehe, dass RPIO DMA ermöglicht audio Weg. Ich könnte auch versucht haben, wiringPi ist softPwm oder sogar softServo, aber ich habe auch erfordern zu laufen, einen DC-motor über PWM, und das möchte ich nicht bringen, das ganze system runter zu 50 Hz nur für den servo.

    Diesem Programm gearbeitet, als ein Beispiel, und hat keinen jitter (da es nicht ständig fahren die Positionierung der Impulse), und landet auf seinem Gegner jedes mal mit einem sichtlich nicht zu unterscheiden Fehler. Gewährt der Pi nicht viel anderes tun in der Zeit zu stören, die mit dem Programm timing (außer laufende X-server über SSH, gedit, terminal-session, alles in top usw.).

    //Servo trial 11/15/14 by SLC
    
    #include <wiringPi.h>
    
    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
        wiringPiSetup();
        pinMode( 6, OUTPUT );
        digitalWrite( 6,  HIGH );
    
        int idx = 0, tries = 0;
        while ( tries++ < 30 )
        {
            int i;
            const int period[] = { 500, 1500, 2500 };
    
            printf( "Setting period to %i ms\n", period[idx] );
            for ( i = 0; i < 20; ++i )
            {
                //Output going through an inverter (to convert 3.3V to 5V)
                digitalWrite( 6, LOW );
                usleep( period[idx] );
                digitalWrite( 6,  HIGH );
                usleep( 20 * 1000 );
            }
            ++idx;
            idx %= 3;
    
            sleep( 2 );
        }
    }

    Mein servo ist ein Radio Shack-Micro-Servo, das scheint identisch zu den anderen „micro“ servos gibt. Ich fand auch, ich könnte Graben die Wechselrichter-und nur fahren Sie das signal mit dem 3.3 V GPIO.

Kostenlose Online-Tests