Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit ATMega128 Servos steuern
Hi,
wie der Titel schon verrät möchte ich mit einem ATMega128 20 Servos steuern.
Im netz habe ich außer fertigen Modulen (das (http://www.acroname.com/robotics/parts/H3-MR-C3024.html) z.B.) nichts gefunden.
Deshalb wollte ich fragen wie eine entsprechende Schaltung aussähe. (Es muss nicht eine komplett fertige sein, es reich das Prinzip zu erklären)
MFG XBert
Hallo XBert,
Ausgangspins hat der ATmega128 ja genug ... also je eine Servo-Steuerleitung an einen der sonst nicht benutzten Ausgangspins, eine möglichst getrennte (oder wenigstens gut entkoppelte!) Stromversorgung für die Servos -- fertig!
Oder meinst Du mit "Schaltung" auch die Software??
Gruß
Fred
Danke,
für Code wäre ich natürlich sehr dankbar.
Ich dachte der µC hat nur ein paar (8 oder so) PWM-Ausgänge, die ich als solche verwenden kann.
Wie mache ich das dann?? mit einem Timer vermute ich mal
Und die Stromversorgung dürfte auch kein Problem sein, da ich einmal 5V und einmal 12V habe.
MFG XBert
Hallo XBert,
ich habe nur Erfahrung mit der Ansteuerung von bis zu 8 Servos mit einem Controller; dafür kommt man noch gut mit einem Timer aus (da [maximal] 8*2ms<20ms). Für 20 Servos würde ich 2 oder 3 Timer verwenden. Etwa so:
1. Ausgänge für Kanal 0 und Kanal 10 auf 1 setzen.
2. Ersten Timer mit dem zu Kanal 0 gehörenden CompareMatch-Wert starten, zweiten Timer mit dem entsprechenden Wert von Kanal 10.
3. Wenn ein CompareMatch eintritt, den entsprechenden Ausgang wieder auf 0 legen (wird also 2x passieren).
4. Für Kanäle 1&11 bis 9&19 wiederholen - fertig!
Natürlich kannst Du bei vielen AVR-Timern ja auch einen "A"- und einen "B"-CompareMatch setzen, so dass man mit einem Timer auskommt.
Damit ist sichergestellt, dass alles innerhalb von 20ms passiert, obwohl die meisten (analogen) Servos auch mit einer etwas längeren Pause (sagen wir mal bis zu 25ms; also 40Hz Wiederholrate) zufrieden sind. Hängt auch davon ab, welche zeitliche Genauigkeit Deine Anwendung erfordert.
Gruß
Fred
Hallo XBert,
das hier (http://www.mikrocontroller.net/topic/6529) wird Dich sicher interessieren!
MfG
Fred
Wow, danke
Das ist perfekt für mich.
Anscheinend gibt es auch einen ähnlichen Beitrag in diesem Forum hier den ich aber nicht gefunden habe (hier) (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=38160)
Mfg XBert
P.S: Wenn ich fragen habe melde ich mich wieder
radbruch
24.07.2008, 19:40
Hallo
Vielleicht etwas offtopic weil nur 8 Servos an einem 8MHz-Mega8:
ISR(TIMER2_COMP_vect)
{
static uint16_t count=0;
static uint16_t count2=1000;
static uint8_t impuls=0, servo=0;
static uint8_t impuls2=0, servo2=0;
if(!impuls)
{
if(servo == 0) { impuls=vla; servo0_on; }
if(servo == 1) { impuls=vli; servo0_off; servo1_on; }
if(servo == 2) { impuls=hla; servo1_off; servo2_on; }
if(servo == 3) { impuls=hli; servo2_off; servo3_on; }
if(servo == 4) servo3_off;
if(servo < 5) servo++;
} else impuls--;
if(!impuls2)
{
if(servo2 == 4) { impuls2=hra; servo4_on; }
if(servo2 == 5) { impuls2=hri; servo4_off; servo5_on; }
if(servo2 == 6) { impuls2=vra; servo5_off; servo6_on; }
if(servo2 == 7) { impuls2=vri; servo6_off; servo7_on; }
if(servo2 == 8) servo7_off;
if(servo2 < 9) servo2++;
} else impuls2--;
if(count < 2000) count++; else { count=impuls=servo=0; if(p) p--; }
if(count2 < 2000) count2++; else { count2=impuls2=0; servo2=4; }
}
vla bis hri sind die Servopositionen vornelinksaußen bis hintenrechtsinnen. Die defines dazu:
#define servo0_on PORTC |= (1<<PC1)
#define servo0_off PORTC &= ~(1<<PC1)
#define servo1_on PORTC |= (1<<PC0)
#define servo1_off PORTC &= ~(1<<PC0)
#define servo2_on PORTD |= (1<<PD4)
#define servo2_off PORTD &= ~(1<<PD4)
#define servo3_on PORTD |= (1<<PD5)
#define servo3_off PORTD &= ~(1<<PD5)
#define servo4_on PORTB |= (1<<PB1)
#define servo4_off PORTB &= ~(1<<PB1)
#define servo5_on PORTB |= (1<<PB2)
#define servo5_off PORTB &= ~(1<<PB2)
#define servo6_on PORTB |= (1<<PB4)
#define servo6_off PORTB &= ~(1<<PB4)
#define servo7_on PORTB |= (1<<PB5)
#define servo7_off PORTB &= ~(1<<PB5)
Die ISR wird mit 100kHz aufgerufen ( TIMSK |= (1<<OCIE2); TCCR2 = (1<<WGM21) | (1<<CS20); OCR2 = 80;) und die Servos werden nacheinander angesteuert. Bei maximal 2 ms pro Servo mal 8 Servos hat die ISR bei 20 ms Wiederholung noch ca. 4 ms Leerlaufzeit. Ein schnellerer Kontroller (16MHz) mit 200kHz-ISR-Frequenz sollte so genau 20 Servos schaffen. Der Hacken: Ich bin nicht sicher, ob die ISR nicht zu lange ist, ich habe die Ausführungszeit noch nicht berechnet. Bei meinem asuro sieht das dann so aus:
http://i.ytimg.com/vi/uyojMyb8V0s/1.jpg (http://www.youtube.com/watch?v=uyojMyb8V0s)
http://www.youtube.com/watch?v=uyojMyb8V0s
Gruß
mic
Danke,
aber momentan bin ich eher mit dem Schaltplan beschäftigt.
Ich werde ihn posten sobald er fertig ist.
Bis dahin
Alles Gute
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.