-
        

Ergebnis 1 bis 8 von 8

Thema: Mit ATMega128 Servos steuern

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.06.2008
    Ort
    Wien
    Beiträge
    162

    Mit ATMega128 Servos steuern

    Anzeige

    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 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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    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
    Only entropy comes easy. - Anton Checkhov

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.06.2008
    Ort
    Wien
    Beiträge
    162
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    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
    Only entropy comes easy. - Anton Checkhov

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hallo XBert,

    das hier wird Dich sicher interessieren!

    MfG

    Fred
    Only entropy comes easy. - Anton Checkhov

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.06.2008
    Ort
    Wien
    Beiträge
    162
    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)

    Mfg XBert

    P.S: Wenn ich fragen habe melde ich mich wieder

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.785
    Blog-Einträge
    8
    Hallo

    Vielleicht etwas offtopic weil nur 8 Servos an einem 8MHz-Mega8:

    Code:
    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:
    Code:
    #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://www.youtube.com/watch?v=uyojMyb8V0s

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.06.2008
    Ort
    Wien
    Beiträge
    162
    Danke,
    aber momentan bin ich eher mit dem Schaltplan beschäftigt.
    Ich werde ihn posten sobald er fertig ist.
    Bis dahin
    Alles Gute

Berechtigungen

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