Antworten

Der Beitrag verursachte die folgenden Fehler, die behoben werden müssen:
Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.
Einschränkungen: 8 pro Beitrag (8 verbleibend), maximale Gesamtgröße 8,79 MB, maximale Individualgröße 1 MB
Entfernen Sie den Haken der Dateianhänge, die gelöscht werden sollen
Klicken Sie hier oder ziehen Sie Dateien hierher, um sie anzuhängen.
Anhänge und andere Optionen
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Zusammenfassung

Autor ^Cobra
 - 09.02.2024, 13:40:01 CET
Ich habe nun alle 0 Servo ausgänge getestet. Alle funktionieren soweit. :)
Desweiteren habe ich mal mein Oszi dran gehalten. Bei einer vorgabe von 1,5ms werden 1,55ms ausgegeben. Bei 1,25ms eingestellt kommen 1,29ms raus.
Witzig dabei: Mein Servo ist in mittelstellung bei 1,29ms.

Nun gehts darum das ganze mit ein I2C Master zu steuern. Der Pic mit den Servo ausgangen soll dann ein Slave sein.
Mal sehn ob ich das hinkriege.

Gruß
Cobra
Autor Ottmar
 - 07.02.2024, 17:22:27 CET
Ok, bin aber noch auf Assembler fixiert.
Autor pic18
 - 07.02.2024, 16:05:37 CET
ich habe hier ein Projekt mit 8 Motoren gefunden. Es ist mit C18 Compiler kompiliert. https://github.com/7Robot/PIC/tree/master/servomotor_lib.X
Autor Ottmar
 - 07.02.2024, 15:00:25 CET
Ja, das bietet sich einfach an. Würde das gerne mal praktisch austesten, bin aber noch bis Ende April fern der Heimat und meiner Bastelecke.
Autor pic18
 - 07.02.2024, 14:50:58 CET
willst Du den 74HC595 als Porterweiterung verwenden?
Autor Ottmar
 - 07.02.2024, 13:33:51 CET
@pic18
Ich dachte da an ein Schieberegister z.B. 74HC595 dessen Ausgänge direkt die Servos ansteuern.

Ansonsten hatte ich die Gewinnung der Servo-Pulszeiten wie von Cobra beschrieben angedacht.

Mit Ringpuffer habe ich mich bisher nicht befasst.
Autor ^Cobra
 - 07.02.2024, 11:56:24 CET
Habe nun mein Programm überarbeitet. Laut der simulation sieht es gut aus. Alle 10 Ausgänge schalten. Etwas Versatz ist drin (ca 0,002s). Dies liegt vermutlich daran wie das ganze abgearbeitet wird. Sollte sich das mit Oszi bestätigen werde ich aber einfach ein korrekturwert einrechnen lassen und wäre zufrieden.
Ob ich dazu heute schon komme weiß ich aber nicht.

Gruß
Cobra
Autor pic18
 - 06.02.2024, 23:27:11 CET
Zitat von: Ottmar in 06.02.2024, 17:49:10 CETMir fällt da so sporadisch eine Lösung ein, unter Verwendung eines Schieberegisters, diverser Takte, eines Zählers, (Anzahl Servos x Vergleichsregister + Zustandbits)
@Ottmar, was verstehst Du unter Schiebregister? Ich denke da mehr an einen Ringpuffer, wo man die einzelnen Daten einliest und der Reihe nach abarbeitet.
Autor ^Cobra
 - 06.02.2024, 18:46:14 CET
Wow hier ist ja richtig was passiert :P

also mal der Reihe nach:
Zitat von: Ottmar in 06.02.2024, 11:14:03 CETWie verteilst Du dann die unterschiedlichen Impulszeiten für die Position/Bewegungsrichtung der Servos?
Ich verwende ein Select Byte um den ausgewählten Servo zu bestimmen, Ein Sollwert Byte um von den ausgewählten die Soll Position zu erhalten, ein Counter Byte der von dem Timer Hoch gezählt wird.
Derzeit ist der Ablauf: Slect Byte 1, Vergleiche Sollpos1 mit Counter wenn <=0 Ausgang für Servo1 aus, Select Byte +1 und Ausgang für Servo2 an.
Mir gefällt das aber noch nicht alles so richtig. Werde da noch etwas ändern und wenn es "final" ist kann ich es gern mal rein setzen.
Zitat von: pic18 in 06.02.2024, 15:50:21 CETich habe mir mal ein Datenblatt vom Servo angeschaut,
1ms entsp. -90°
1,5ms entsp. 0°
2ms entspr. +90°

kannst Du auch über -90° bzw. +90° fahren, oder ist dieser Bereich begrenzt?

was passiert eigentlich wenn kein PWM Signal am Servo anliegt, aber Betriebsspannung?

Um nicht unnötig viele Interrups auszulösen ist zu überlegen, ob man den Startwert (1ms) und den Endwert (20ms) anders festlegt. Z.B die Timereinstellung verstellt, oder einen anderen Timer nimmt. Dann hat man mehr Zeit für andere Aufgaben. Die Interruptroutine sollte so kurz wie möglich gehalten werden, am Besten in Assembler schreiben.

Also i.d.R. ist es so das man etwas über die 90° gehen kannst und somit der Bereich von ca. 0,8-2,2ms "angefahren" werden kann. Wie gesagt habe ich noch nicht bei mir geschaut welche Impulse genau der PIC ausgibt. Auch gibt es wohl billig Servos (und ich habe ein billigen) die sehr von der "norm" abweichen können.
Wenn man nur Spannung anlegt passiert eig. erstmal nichts. Wenn aber die Signalleitung Flakert (Wackelkontakt) macht der Servo ein tollen Tanz :D
Ich bin bereits im Assembler unterwegs. - C ist mir derzeit zu sperrig für meine kleinen PICs die ich hier habe. wie gesagt gefällt mir der ganze Ablauf noch nicht und wird nochmal überarbeitet. Dann werde ich einige Messungen machen um zu beurteilen wie "ausgelasstet" der PIC damit ist. min. 1 Aufgabe muss ich dem PIC noch zu muten können für mein vorhaben :P :D
Zitat von: vloki in 06.02.2024, 16:38:16 CET
Zitat von: pic18 in 06.02.2024, 15:50:21 CETwas passiert eigentlich wenn kein PWM Signal am Servo anliegt, aber Betriebsspannung?
Dann bleibt der Servo einfach so wie er ist. (sofern er nicht durch eine äußere Kraft verstellt wird)

Eigentlich bräuchte man nicht wirklich ein PWM Signal, wenn der Servo die Position auch halten kann.
Es reicht dann ein einzelner Puls als Kommando.

Die Pseudo/Software-PWM von z.B. einem Arduino kann sogar richtig störend werden,
wenn der Servo wegen dem Jitter dann die ganze Zeit rumzittert.
Mir ist es nicht bekannt das Servos die Position auch halten wenn es nur ein "Puls als Kommando" kommt. Wie lange ist der Puls? Wannkommt die wiederholung uzsw.? Ich weiß das der Servo i.d.R. schneller einlesen kann als 50Hz und man somit die Pause verkürzen kann. Dies nutze ich indirket wenn ich weniger als 10 Servos nutze bzw. wenn nicht alle Rechtsausschlag haben: alle Servos links 1+1+1+1+1+1+1+1+1+1 => nach 10 ms kriegt Servo1 neuen impuls.
Zitat von: Ottmar in 06.02.2024, 17:49:10 CETIch denke an die 10 Servos die ^Cobra verwendet. Geht das so einfach mit PWM, wenn jedes Servo für sich angesteuert werden soll?
Mir fällt da so sporadisch eine Lösung ein, unter Verwendung eines Schieberegisters, diverser Takte, eines Zählers, (Anzahl Servos x Vergleichsregister + Zustandbits).
Wie bereits oben erwähnt Vergleiche  ich immer den Counter mit dem Sollwert von dem ausgewählten Servo. muss noch erprobiert werden ob es so geht. Bin aber keiner der was "fertiges" aus dem internet holt sondern selbst ein Weg finden. - meistens mit Steinen und Hinfallen :D


schönen Abend
Cobra

 
Autor Ottmar
 - 06.02.2024, 17:49:10 CET
Ich denke an die 10 Servos die ^Cobra verwendet. Geht das so einfach mit PWM, wenn jedes Servo für sich angesteuert werden soll?
Mir fällt da so sporadisch eine Lösung ein, unter Verwendung eines Schieberegisters, diverser Takte, eines Zählers, (Anzahl Servos x Vergleichsregister + Zustandbits).

Similar topics (5)