PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit ATMega128 Servos steuern



XBert
24.07.2008, 09:29
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

fhs
24.07.2008, 10:36
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

XBert
24.07.2008, 10:58
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

fhs
24.07.2008, 11:07
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

fhs
24.07.2008, 11:41
Hallo XBert,

das hier (http://www.mikrocontroller.net/topic/6529) wird Dich sicher interessieren!

MfG

Fred

XBert
24.07.2008, 14:50
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

XBert
25.07.2008, 09:22
Danke,
aber momentan bin ich eher mit dem Schaltplan beschäftigt.
Ich werde ihn posten sobald er fertig ist.
Bis dahin
Alles Gute