Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR Servolibrary, was haltet ihr davon?? noch Fehler??
Hi an alle,
ich hab in letzter Zeit ein bisschen an einer Library gebastelt, die ich gerne auch Open Source zur Verfügung stelle, aber jetzt muss ich erstmal wissen, ob das denn auch alles so geht, wie ich mir das vorstelle...
Nur vorab, es sind 1716 Codezeilen, also viel Spass^^
man soll einer Funktion (Überladen) zwischen 1 und 20 uints übergeben und dadurch Servos ansteuern
dazu muss man noch einige defines machen, wie z.B. die ServoPorts, ServoRegister, ServoBits und bei SERVOMAX auch die Anzahl der Zählschritte, also das, wovon die Größe der uint-Werte abhängt
die Funktion wird einmal ausgeführt, dann führt sie sich glaube 30 mal aus, damit die Servos genug Stellzeit hatten und dann kann man sich in der Zwischenzeit wieder anderen Dingen witmen
Ich hoffe ich kann mit dieser Lib auch radbruch überzeugen, dass Servoprobleme nicht immer nur Speziallösungen sind...
MfG Pr0gm4n
Wow bin eben mal drüber geflogen, echt eine Menge Code!
Aber wenn ich das richtig sehe machst du das alles über die "delay.h". Also benutzt du keinen Timer? Ich glaube eine Lösung mit Timern (den kleinsten Timer0) würde an dieser Stelle vielleicht etwas besser sein.
Das ist meine Meinung wenn deine Version in der Praxis auch funktioniert, dann ist es ja auch mal eine Alternative.
MfG
Ringo
Hi Ringo,
ich denke, dass die Timer nicht auf allen ATMegas genauso angesteuert werden und auch nicht alle genau gleich gut sind, deshalb lasse ich lieber den Benutzer die Taktfrequenz einstellen und habe damit auch ein sauberes Ergebnis
voraussetzung ist natürlich, dass keine Interrupts ankommen, ich bin beim erstellen aber mal davon ausgegangen, dass jemand, der mit einem ATMega8 20 Servos ansteuert nicht noch Pins für nen Interrupt wegen irgendwas frei hat^^
MfG Pr0gm4n
radbruch
07.05.2008, 11:10
Hallo
Ich hoffe ich kann mit dieser Lib auch radbruch überzeugen
Leider nicht. Ich habe mich bisher nur durch die ersten Zeilen durchgekämpft, aber wirklich überzeugen kann mich das noch nicht:
- Servostellzeit muss abhängig vom Verstellweg der Servos sein.
- delay() ist blockierend, nicht konstant schnell.
- das funktioniert wohl nicht:
#define STELLZEITSERVOS 30
while(STELLZEITSERVOS--)
- das funktioniert sicher nicht:
_delay_ms(1/SERVOMAX);
uswusw.
Mit diesem Testprogramm erhalte ich über 800 Fehler beim Kompilieren:
include "servos-Pr0gm4n-1.c"
//z.B. #define SERVOREGISTER DDRA
#define SERVOREGISTER1 DDRA
//#define SERVOREGISTER2
//#define SERVOREGISTER3
//#define SERVOREGISTER4
//#define SERVOREGISTER5 ... (bis 20)
//z.B. #define SERVOPORT PORTA
#define SERVOPORT1 PORTA
//#define SERVOPORT2
//#define SERVOPORT3
//#define SERVOPORT4
//#define SERVOPORT5 ... (bis 20)
//z.B. #define SERVOBIT 0
#define SERVOBIT1 0
//#define SERVOBIT2
//#define SERVOBIT3
//#define SERVOBIT4
//#define SERVOBIT5 ... (bis 20)
#define SERVOMAX 180
int main(void)
{
return(0);
}
Muss ich alle 20 Servos definieren? delay.c befindet sich im Verzeichniss util....
jemand, der mit einem ATMega8 20 Servos ansteuert...
...schreibt sich seine eigenen Routinen und vor allem seine eigenen Verzögerungsschleifen und verzichtet auf delay.c
Gruß
mic
Hallo Pr0gm4n,
es wäre schön, wenn es sozusagen eine universelle Library für Servos geben könnte, die mit jedem AVR, mit jedem Servo und mit allen Anwendungszwecken zurecht käme.
Leider geht das nicht.
Hier im Forum gibt es geniale Lösungen für die Servoansteuerung. Die beste war eine für einen 2313 (Assembler), mit der 10 Servos über eine I2C-Ansteuerung betrieben werden können. Leider habe ich den Link nicht parat.
Darüber hinaus gibt es viele Lösungen z.B. von radbruch hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=39173
... für 8 Servos am RP6.
Weitere Lösungen (auch mit verschiedenen Ansätzen!) gibt es hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=34407
Da hat wieder radbruch gute Routinen gepostet.
Ich habe in diesem Thread allein 3 verschiedene Ansätze in C für den RP6 vorgestellt:
1. RP6Base_Servo.zip am 3.10.07:
Die blockierende Lösung mit Verzögerungsschleife. Das ist die ungünstigste Variante. Allerdings funktioniert sie und ist hier sogar noch besser als deine Lib, weil zumindest die 18ms zwischen den Impulsen nicht noch blockierend gewartet wird. Da kann der uC ja nichts anderes machen! Die Servo-Ansteuerung ist doch immer nur ein "Randproblem" des uC-Programms. Die Hauptsache ist doch die Logik oder Aufgabensteuerung, für die die Servos gebraucht werden.
2. RP6Control_Servo.zip am 6.10.07:
Das ist eine Lösung mit Timer, der auf einer festen Frequenz läuft. Der Servo-Impuls wird im Hauptprogramm gestartet, danach kann das Programm weiter laufen. Erst in der Timer-ISR wird der Impuls beendet, wenn die richtige Dauer erreicht ist. Das ist noch die universellste Lösung, die für die meisten Anwendungen und uCs passen kann: Sie ist weder für den Impuls noch für die 18..19ms bis zum Folgeimpuls blockierend und kann an jedem Pin des uC laufen. Auch mehrere Servos sind so möglich. Da ein Timer fast immer benutzt wird, kann er auch für die Servoansteuerung mit genutzt werden. Die Auslastung ist aber durch die Timer-ISR recht hoch, da der Interrupt eine recht hohe Frequenz braucht.
3. RP6Control_Servo2.zip am 8.10.07:
Das ist die Hardware-PWM-Lösung. Sie stellt gar keine Last für den Programmablauf dar und eignet sich gut, wenn nur 1 bis 2 (je nach uC auch mehr) Servos anzusteuern sind. Eine universelle Lösung ist das meist nicht, sondern immer eine einzelne Lösung, also nicht geeignet für eine Lib.
Also was bleibt: Eine universelle Servo-Lib gibt es nicht. Aber: Sehr gute Einzellösungen.
Gruß Dirk
Hi Dirk,
ich hab da grad wegen dem universell eine Idee:
man muss die Lib von mir halt noch erweitern, ich habe jetzt eine Software-PWM-Ansteuerung versucht, jetzt könnte man natürlich die anderen Möglichkeiten auch integrieren, einfach dann als Funktionen unterscheiden, z.B. task_Servos_Hardware(); oder task_Servos_Software();, ...
dann wäre sie für die meisten Zwecke universell...
das andere ist auch, dass ich mit universell hauptsächlich meinte, dass du bei jeder Anzahl von Servos zwischen 1 und 20 immer die gleiche Funktion aufrufst, nur andere Parameter (Überladene Funktion)
das erleichtert das Ansteuern meiner Meinung nach doch schon ein bisschen für den Benutzer, also den Programmierer
Ich werde so auf jeden Fall für insgesamt 4€ eine I²C-Servo-Steuerung bauen, die 20 Servos schaltet...
MfG Pr0gm4n
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.