- LiTime Speicher und Akkus         
Seite 9 von 11 ErsteErste ... 7891011 LetzteLetzte
Ergebnis 81 bis 90 von 110

Thema: RP6 Servo Ansteuerung

  1. #81
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    Anzeige

    Powerstation Test
    ich schätze der Fehler liegt beim Sleep schreib mal statt 200-20 einfach 180
    und auserdem schreibt man Sleep am Anfang groß
    MfG Martinius

  2. #82
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Dass dieser Code so übersetzbar ist kann ich schlichtweg nicht glauben. So könnte es vielleicht funktionieren:

    Code:
     #include "RP6ControlLib.h"
    
    int main(void)
    {
       uint8_t i;
       initRP6Control();
    	DDRA |= 4; // ADC2 (PA2) auf Ausgang schalten
    	while(1)
       {
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 4;
             sleep(8);
             PORTA &= ~4;
             sleep(200-10);
          }
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 4;
             sleep(20);
             PORTA &= ~4;
             sleep(200-20);
          }
    
           for(i=0;i<100; i++) // 100 mal Impuls
           {
              PORTA |= 4;
            sleep(14);
            PORTA &= ~4;
            sleep(200-10);
    
              }
       }
       return(0);
    }
    Da ich aber kein M32 besitze kann ich es nicht testen...

    Die Portbezeichnungen entsprechen den Zweierpotenzen. Pin0 ist 2^0 oder 1, Pin1 ist 2^1 oder 2, weiter gehts dann über 4, 8, 16, 32 und 64 bis 2^7 oder 128 für den achten Pin.

    Dass der ADC2 beim Mega32 der Pin PA2 (Port A Pin2) ist, findet man im Datenblatt des Mega32 oder im Schaltplan des M32.

    Gruß

    mic

    [Edit]
    200-20 funktioniert natürlich. In der RP6-Library ist sleep() mit kleinem S definiert:

    Code:
    /**
     * Delay with the help of the 10kHz timer.
     * sleep(10) delays for *about* 1ms! Not exaclty, as we do not use assembly routines
     * anywhere in this library!
     *
     * This is a blocking routine, which means that the processor
     * will loop in this routine and (except for interrupts) the
     * normal program flow is stopped!
     * Thus you should use the Stopwatch functions wherever you can!
     *
     * Example:
     *		sleep(1); // delay 1 * 100us = 100us = 0.1ms
     *		sleep(10); // delay 10 * 100us = 1000us = 1ms
     *		sleep(100); // delay 100 * 100us = 10000us = 10ms
     *		// The maximum delay is:
     *		sleep(255); // delay 255 * 100us = 25500us = 25.5ms
     */
    void sleep(uint8_t time)
    {
    	delay_timer = 0;
    	while (delay_timer <= time+1);
    }
    (Aus RP6ControlLib.c)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #83
    Benutzer Stammmitglied
    Registriert seit
    03.08.2010
    Beiträge
    33
    erstmals danke für die genauen portbezeichnungen. denke wird mir helfen bei weitern versuchen einen code selber zu schreiben.

    leider funktioniert es noch nicht. das servo macht keine bewegung, zudem ist das horn nicht blockierend. habe den code von radbruch 1:1 übernommen.

    also muss man kein code auf die base vom rp6 laden damit m32 läuft?

    habe kein selftest ausführen können da ich nicht über ein lcd display verfüge. soweit ich weiss braucht man kein lcd auf dem m32 um Servos anzusteuern? habe ein paar codes von den rp6control_examples ausprobiert und die laufen so wie sie sollen.

    gruss RAW

    thx

  4. #84
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    du must Sleep und nicht sleep schreiben
    MfG Martinius

  5. #85
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Ich vermute, die ADC2-Pins am M32 entsprechen nicht der Belegung am Servostecker. VDD sollte in der Mitte der Stiftleiste sein:

    [Edit]
    Nach der Doku des M32 Seite 27 ist die Stiftleiste nicht für Servos ausgelegt. Abhilfe schafft ein "Umbau" des Servosteckers:

    Bild hier  

    sleep() mit kleinem S ist schon richtig. Interessanterweise wird die Funktion in der RP6RobotBaseLib.c so definiert:
    Code:
    void sleep(uint8_t time)
    {
    	for (delay_timer = 0; delay_timer < time;);
    }
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken rp6controladcx.jpg  

  6. #86
    Benutzer Stammmitglied
    Registriert seit
    03.08.2010
    Beiträge
    33
    habe das rote kabel in vdd, das schwarze in gnd und das weisse kabel in adc2.

    habe sonst das servo bei io1-6 und adc0/adc1/int1 zum bewegen gebracht. nur nicht auf dem m32.
    gibt es eine andere möglichkeit das servo zu bewegen d.h mit int2 auf dem m32.

    danke

  7. #87
    Benutzer Stammmitglied
    Registriert seit
    03.08.2010
    Beiträge
    33
    ok habe es jetzt hinbekommen. hatte ein fehler im programmers notepad.
    danke an euch.
    mfg

    RAW

  8. #88
    Benutzer Stammmitglied
    Registriert seit
    03.08.2010
    Beiträge
    33
    hallo

    M32: möchte zwei Servos anschliessen. der eine an adc2 der andere adc3.
    habe die codes einzeln getestet mit einem servo (acoms as-12) und funktioniert. sobald ich den zweiten servo anschliesse (futaba fp-s14 funktioniert es nicht mer. wenn der (futaba fp-s14 ein kleinen widerstand auf dem horn hat läuft es. frage mich wiso das so ist und was man da machen könnte?
    Meine codes lauten:


    ADC2: acoms
    Code:
    #include "RP6ControlLib.h"
    
    int main(void)
    {
       uint8_t i;
       initRP6Control();
       DDRA |= 4; // ADC2  auf Ausgang schalten
       while(true)
       {
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 4;
             sleep(20);
             PORTA &= ~4;
             sleep(200);
           }
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 4;
             sleep(9);
             PORTA &= ~4;
             sleep(200);
           }
         
           for(i=0;i<100; i++) // 100 mal Impuls
           {
              PORTA |= 4;
              sleep(0);
              PORTA &= ~4;
              sleep(200);
             
           }
       }
       return(0);
    }


    ADC3: futaba
    Code:
    #include "RP6ControlLib.h"
    
    int main(void)
    {
       uint8_t i;
       initRP6Control();
       DDRA |= 8; // ADC3  auf Ausgang schalten
       while(true)
       {
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 8;
             sleep(20);
             PORTA &= ~8;
             sleep(180);
           }
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 8;
             sleep(9);
             PORTA &= ~8;
             sleep(180);
           }
         
           for(i=0;i<100; i++) // 100 mal Impuls
           {
              PORTA |= 8;
              sleep(0);
              PORTA &= ~8;
              sleep(180);
             
           }
       }
       return(0);
    }
    ziel ist es den acoms an adc2 und den futaba an adc3 in einem code laufen zu lassen. kann mir da jemand helfen?

  9. #89
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    So vielleicht?

    Code:
     #include "RP6ControlLib.h"
    
    int main(void)
    {
       uint8_t i;
       initRP6Control();
       DDRA |= 8 + 4; // ADC2 und ADC3  auf Ausgang schalten
       PORTA &= ~(8+4); // beide Pins auf Low
       while(true)
       {
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 4; // Impuls servo 1 an
             sleep(20);
             PORTA &= ~4; // Impuls servo 1 aus
             PORTA |= 8;  // Impuls servo 2 an
             sleep(20);
             PORTA &= ~8; // Impuls servo 2 aus
             sleep(200-20-20); // 20ms minus Impuls1 minus Impuls2 ist Impulspause
           }
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 4;
             sleep(9);
             PORTA &= ~4;
             PORTA |= 8;
             sleep(9);
             PORTA &= ~8;
             sleep(200-9-9);
           }
    
    /* sleep(0) erzeugt einen extrem kurzen Impuls!
           for(i=0;i<100; i++) // 100 mal Impuls
           {
              PORTA |= 4;
              sleep(0);
              PORTA &= ~4;
              PORTA |= 8;
              sleep(0);
              PORTA &= ~8;
              sleep(200-0-0);
    
           }
    */
       }
       return(0);
    }
    (ungetestet)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #90
    Benutzer Stammmitglied
    Registriert seit
    03.08.2010
    Beiträge
    33
    der code ist super. danke. nur läuft der eine servo nur kurz und danach bricht das programm ab. wenn ich nur ein servo anschliesse läuft das programm durch, dies geschieht aber nur mit dem acoms ic as-12. das servo (futaba) ist soweit ich das beurteilen kann das problem. habe verschidene Servos ausprobiert und nur der acoms läuft. auf der base gehen mehrere servos. thx

Seite 9 von 11 ErsteErste ... 7891011 LetzteLetzte

Berechtigungen

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

LiTime Speicher und Akkus