- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 27

Thema: Adafruit_PWMServoDriver

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich weiß nicht wie gut Dein Augenmaß ist. Mir hilft dazu ne ziemlich einfache Vorrichtung. Manchmal klebe ich gleich ne Kopie von nem Geodreieck drüber.

    Ich verwende zunächst mal so was hier, da sieht man auch schon, wieviel ich probiert habe

    .....
    Klicke auf die Grafik für eine größere Ansicht

Name:	Img_1170.jpg
Hits:	13
Größe:	19,8 KB
ID:	34147

    Jetzt muss man trotzdem noch ein gutes Augenmaß anlegen. Seitdem ich Brille brauche, ist es manchmal etwas verzerrt
    Ich habe aber schon den Anspruch, dass der Servo die einzelnen 10°-Striche sauber erreicht, beim Durchprobieren. Also wenn ich dann im Programm meine Funktion/Methode mit 10, 20 30, 40 .... 80,90, .... 120,130, ....160,170,180° aufrufe.
    Unten im Halbkreis der Schablone sieht man Werte, die ich einsetzen musste, um in der Software die Stellwinkel zu erreichen. Zum Beispiel einen Wert von 170 für einen Winkel von 165°. Wenn man die Abstände der Werte untereinander vergleicht, sieht man, dass die unterschiedlich sind.

    MfG
    Geändert von Moppi (03.05.2019 um 09:12 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo Moppi,
    ich sitze auch grad am PCA9685.
    Vorab: Ich benutze keine Bibliotheken sondern wühle mich grad selbst durch die Programmierung des Chips, daher kann ich natürlich nicht sagen wie deine Bibliotheken funktionieren,
    aber ich habe einige Erfahrungen gesammelt und es werden stündlich mehr.

    Das lohnt eventuell sogar einen eigenen Thread dafür aufzumachen, aber vorab kann ich folgende Information liefern,
    die Dich evtl. weiterbringen:

    Ganz entscheidend bei diesem Chip ist der eingestellte PreScale.
    Der steht nach einem Reset auf dem Wert 30 dezimal.
    Vermutlich wird der in der Bibliothek umgestelt ??? kein Ahnung

    Im Chip selbst befindet sich ein Oszillator, der schwingt mit 25 MHz. (wie genau der ist, konnte ich dem Datenblatt NOCH nicht entlocken)
    Der gemeinsame Clock für die 16 Zähler ist also 25.000.000 / 30 = 833333,33 Hz.
    damit beträgt die Zeit für einen Zählerschritt 1,2 Mikrosekunden.
    Das ist, wie gesagt die Standardeinstellung nach eine Power On.

    Da die Zähler 12 Bit sind, haben wir eine Wiederholrate von 4096 * 1,2µs = 0,0049152 Sekunden = 202,45 Hz.

    Es gibt Servos die können damit arbeiten, modernere Servos werden sogar bis 333 Hz Wiederholrate angegeben.
    Der Standardservo (ehemals Analog) wird mit 50 Hz (20ms) angegeben.

    Wiederholrate:
    Der Chip lässt es zu die Wiederholrate zwischen 24 Hz to 1526 einzustellen.
    Ob Du das in der Bibliothek einstellen kann weis ich nicht.
    Ich vermute aber, dass der Prescale Wert auf 121 eingestellt wird, dann hat man eine Widerholrate von rund 50 Hz (20ms)
    rechnerisch 50,0288166 also 19,98848ms
    diesen Wert teilen wir durch 4096 (12 Bit) und haben den Zeitwert für einen Schritt: 4,88µs
    Für einen 1500µs (mitte) Impuls benötigen wir demnach 307 Schritte
    für 900µs 184 Schritte Servo links
    für 2100µs 430 Schritte Servo rechts

    Code:
               25.000.000
    Prescale = --------------------- -1
               4096 * Wiederholrate
    
    
                    25.000.000  
    Wiederholrate = -------------------
                    4096 * (prescale+1)
    Das habe ich auch so ausprobiert und das stimmt ganz exakt.
    Natürlich kannst Du auch kleinere oder auch größere Werte angeben,
    aber irgendwann läuft dein Servo entweder intern oder extern gegen einen Anschlag und im schlimmsten Falle blockert er, zieht Strom und raucht ab.
    Die meisten Servos die ich kenne können auch unterhalb oder oberhalb der angegebenen Pulsbreiten gefahren werden,
    das muss man dann ermitteln was er zulässt ohne zu blockieren. Immer Strommessung im Auge behalten

    Die ermittelten Werte werden, wie Du schon erwähnt hast, werden in das 2te Register geschrieben,
    im ersten Register kann man eine 0 schreiben.

    !! Achtung: wenn man die Wiederholrate ändern will (Prescale Wert)
    Wenn man es direkt über die Register machen möchte, muss man einiges beachten,
    das funktionierte bei mir nämlich nicht auf Anhieb.

    Der Prescale(Vorteiler) befindet sich an der Aderesse 0xFE im Chip.
    Man kann aber nicht so ohne weiteres darauf zugreifen, dazu muss der Chip erst in den Sleep Mode versetzt werden.
    Dazu muss das Bit 4 im Mode 1 Register, welches sich an Adresse 0 im Chip befindet, auf "1" gesetzt werden. (Low power mode. Oscillator off)

    Nun kann man auf das Prescale Register zugreifen.
    !!! der kleinste Wert ist wohl 3 laut Datenblatt.
    Ich habe es ausprobiert mit 0 1 2 3 da ändert sich dann nichts mehr.

    PreScale: 121
    Zählwerte: 184 für 900µs und 430 für 2100µs

    Klicke auf die Grafik für eine größere Ansicht

Name:	900us.jpg
Hits:	3
Größe:	68,5 KB
ID:	34148 Klicke auf die Grafik für eine größere Ansicht

Name:	2100us.jpg
Hits:	2
Größe:	68,1 KB
ID:	34149

    Siro

    PS: wie ich sehe bist Du aber schon weiter gekommen
    Theoretisch müsste der Winkel ja proportional zur Schrittweite sein...
    Unterschiede bekommst Du wenn Du von links oder rechts deine Position anfährst, durch das Getriebespiel
    Das habe ich bemerkt bei einer Blende für eine Beleuchtung.
    Ich bin dann in der einen Richtung immer etwas weiter gefahren und dann wieder zurück, damit die Position immer von gleicher Richtung angefahren wird.
    Geändert von Siro (03.05.2019 um 10:45 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Hallo Siro!


    Na, ich benutze die Adafruit_PWMServoDriver.h und Adafruit_PWMServoDriver.cpp.
    Die bietet eine gute Grundlage, finde ich.


    Darüber hinaus habe ich aber zwei Boards so dass ich bis 32 Servos ansteuere.
    Also schreibe ich noch mal meine "Unterprogramme" / Bibliothek, um die Funktion der Servoansteuerung vom übrigen Programmcode abzukoppeln.
    So kann ich dann z.B. meinen Aufruf tätigen mit: xxx(Servonummer,Gradzahl,Verzögerung);




    PreScale wird eingestellt, ja. Habe ich schon gesehen.
    Das wird in der Adafruit_PWMServoDriver.cpp gemacht. Dort wird der Prescaler nach der gewählten PWM-Frequenz eingestellt.




    "Der Standardservo (ehemals Analog) wird mit 50 Hz (20ms) angegeben."


    Na ja, mit 50Hz arbeiten meine nicht mehr. Und Adafruit schreibt, Analogservos werden normal mit 60Hz angesteuert. Das trifft bei meinen Servos zu.




    "Theoretisch müsste der Winkel ja proportional zur Schrittweite sein..."


    Theoretisch trifft das bei den meisten Servos gut zu. Aber ich habe mind. Einen, der sich nicht ännähernd daran hält.
    Und 90° sind für mich eben 90 und nicht 85° und nicht 92°.
    Ich muss irgendwie eine Ausgangssituation schaffen, auf die man sich verlassen und auf der man weiter aufbauen kann.


    Aber ich bin da auch noch am rumprobieren.
    Eigentlich möchte ich doch den Servostellwinkel kontinuierlich verändern.
    Da ist irgendwo ein Beispielcode dabei, wo das gemacht wird, allein über die Pulslänge (ohne irgendwelche genauen Winkel) und das hat mir sehr gut gefallen.
    Weil sonst setzt man einen Winkel und der Servo fährt mit voller Geschwindigkeit und Wucht den Winkel an.






    MfG

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Das die Servos sich je nach Preis auch qualitativ unterscheiden ist hier zu sehen.
    Ich hab mal 2 Servos extrem langsam laufen lassen.
    Hier sieht man deutlich das Stottern, des günstigeren rechten Servos

    https://www.dropbox.com/s/1m83yx3a4x...S306G.mp4?dl=0

    Ebenso werden sich die Servos auch verhalten beim direkten Anfahren einer festgelegten Position.
    Sie "treffen" dann nicht immer richtig- Je länger dein Hebelarm umso problematischer wird das ganze dann...

    den .ccp Code habe ich mir grad angesehen. Hätt ich mal vorher reingucken sollen, dann hätte ich mir viel Kopfzerbrechen erspart,
    ich musste ja mal wieder das Rad neu erfinden....

    Siro

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.699
    Zitat Zitat von Siro Beitrag anzeigen
    .. hab mal 2 Servos extrem langsam laufen lassen. Hier sieht man deutlich das Stottern, des günstigeren rechten Servos
    .. den .ccp Code habe ich mir grad angesehen. Hätt ich mal vorher reingucken sollen, dann hätte ich mir viel Kopfzerbrechen erspart ..
    Grübel - und was bedeutet das jetzt für uns? Ist der Servo am Stottern schuld oder der .ccp Code (bzw. der Mensch an der Tastatur) ?

    Bei meinem Code (ok, in "C" - das bei mir immer noch eher C-äh ist) hab ich kein Problem Servo, auch sehr billige, mit rund 2 sec von Anschlag zu Anschlag laufen zu lassen (zB hier).
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    @oberallgeier:
    Das sieht bei deinem Video optisch sehr sauber aus.

    Das Stottern bei mir (bzw. beim Servo ) kommt tatsächlich vom Servo-
    Die PWM wurde nicht per Hand, sondern automatisiert per Software durchgefahren.
    Getestet hatte ich es mit einem PIC Controller auf dem nichts anderes lief,
    die PWM hatte eine zigmal feinere Auflösung als ein Servo es verarbeiten könnte.
    Also ein absolut gleichförmiges PWM Signal ohne Ausreißer.
    Nicht alle Billigservos sind schlecht, dieser war es aber...
    Nun haben alle Servos auch eine gewisse Hystere, sonst würden sie nie ruhig stehen sondern ständig nachlaufen.
    Das ist natürchlich auch abhängig von der gesamten Mechanik / Übersetzung / Poti usw.
    Es kommt vor, dass ein Servo kontinuierlich Geräusche von sich gibt weil er ständig nachregelt.
    Ungünstige Position, Schleiferkontakt....

    Bei den Billigstservos in meine Minihubschraubern (wobei die im Verhältnis Schweineteuer sind...) werden die Bewegungen im Laufe der Zeit immer schlechter.
    Die fangen immer mehr an zu stottern...
    Da hilft dann sie zu zerlegen und die Kohleschicht und Schleifer zu säubern und dann sind sie quasi wie neu.
    Geändert von Siro (03.05.2019 um 12:57 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Habe jetzt festgestellt, das die Servos nur auf alle 3 bis 4 Schritte, in der Pulslängenänderung, reagieren. Also bis sie die nächste Position anfahren. Das ist dann nat. schon ein ordentlicher Schritt.
    Jetzt ist es ja aber so, dass das der PCA9685 das Steuersignal dauernd weiter an den Servo sendet.
    Kann es möglich sein, dass das daran liegt?
    Anders herum muss ein Servo die Position halten, da kann man das Steuersignal wohl nicht einfach abschalten?

    Habe mir heute einen Servotester gebastelt:

    .....Klicke auf die Grafik für eine größere Ansicht

Name:	servotester.jpg
Hits:	7
Größe:	25,3 KB
ID:	34150


    MfG
    Geändert von Moppi (03.05.2019 um 20:53 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen