- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Mal wieder Servo (greifarm), sorry

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    16.12.2009
    Beiträge
    34
    Anzeige

    Praxistest und DIY Projekte
    Nur eine kurze Meldung meinerseits:

    Es lag wohl an der Überstrom-Abschaltung vom Festspannungsregler.

    Der Tiefpass hat nix gebracht, auch wenn er sehr gut dimensioniert war.

    Besserung brachte eine Zweite Versorung (mit festspannungsregler) die ich auf die Base gelötet hab.

    Komisch ist nur dass sich ein Servo genau entgegengesetzt dreht wie er eigentlich sollte?! In "meinem" geposteten Programm sollten sich ja alle Servos gleich drehen, einer dreht komischerweise genau andersrum, irgendwie doof. Programmiermäßig zwar kein rießen Aufwand, stört aber trotzdem....

  2. #12
    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

    Ja, das ist komisch. Man kann das zwar softwaremäßig anpassen, aber da der Drehwinkel der Servos meist nicht linear ist, fahren impulsgespiegelte Servos unterschiedliche Positionen an. Abhilfe schafft dann nur ein "Umpolen" des Servos. Das würde ich auch der Softwarelösung vorziehen:

    https://www.roboternetz.de/phpBB2/vi...=462535#462535

    Gruß

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

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    16.12.2009
    Beiträge
    34
    Servus mal wieder.

    Ich habe mal wieder eine Frage was das verändern der Library betrifft, da bin ich nämlich absoluter Neuling.
    (ich hoff es is ok in dem fred)

    Und war bezieht sich das auf diesen Code:

    Code:
    #include "RP6ControlLib.h" 		// The RP6 Control Library. 
    								// Always needs to be included!
    
    /*****************************************************************************/
    // Variables and procedures:
    void configServoTimer (void);
    volatile uint16_t servo1, servo2, servo3, p;    // Servopositionen und Impulszähler
    uint8_t c;   									// freie variable
    
    /*****************************************************************************/
    int main(void)
    {
       initRP6Control();
       
       
       	showScreenLCD("################", "################");
    	mSleep(1000);
    	showScreenLCD("<<Mein Test", "<<LC - DISPLAY>>");
    	mSleep(2000); 
    	showScreenLCD(" Servo - Test 2 ", "  Version 1.00  ");
    	mSleep(2000);
    	clearLCD(); // Clear the whole LCD Screen
    	
    	
       
       configServoTimer();   
       DDRC = IO_PC5 | IO_PC6 |IO_PC7  ;	 // Servopins auf Ausgang setzen
       
       
       servo1=servo2=servo3=220;   	   // Servomitte?
       setLEDs(0b1001);                // und los!
    
       while(1)
       {
    	  showScreenLCD("In main", "<<test");
    	  mSleep(2000);
          for(c=0;c<6;c++)            // 6 mal ein einfaches Demo....
          {
             setLEDs(1<<c);
             servo1=servo2=servo3=220; // mitte
             p=50; while(p);          // warten bis 50 Impulse gesendet (ca. 1 Sek.)
             servo1=servo2=servo3=100; // links
             p=50; while(p);
             servo1=servo2=servo3=340; // rechts
             p=50; while(p);
          }
    
       }
       
       return 0;
    }
    
    void configServoTimer (void) {  
              
       cli();
    	// Timer 1:
    	// Clear OC1A when up-counting and set OC1A when down-counting,
    	// mode 8 (PWM, Phase and Frequency Correct, TOP ICR1), clk/8
    	TIMSK |= (1 << TOIE1);// Die Timer1 Overflow-ISR zur Servoansteuerung
    	
    	TCCR1A =  (1 << COM1A1) 
    			| (0 << COM1A0) 
    			| (0 << COM1B1) 
    			| (0 << COM1B0) 
    			| (0 << FOC1A) 
    			| (0 << FOC1B) 
    			| (1 << WGM11) //mode10
    			| (0 << WGM10);//mode10
    	TCCR1B =  (0 << ICNC1) 
    			| (0 << ICES1) 
    			| (1 << WGM13) //mode10
    			| (0 << WGM12) //mode10
    			| (0 << CS12)  //ohne vorteiler
    			| (0 << CS11)  //ohne vorteiler
    			| (1 << CS10); //ohne vorteiler
    	
    	ICR1  = 50;		// 8mhz/(2*100) =160 kHz
    	sei();
    	return 0;
    }
    
    ISR (TIMER1_OVF_vect)
    {
       static uint16_t servocount=1;
       if(servocount > servo1) PORTC &= ~IO_PC5; else PORTC |= IO_PC5;       // IO Pin 3
       if(servocount > servo2) PORTC &= ~IO_PC6; else PORTC |= IO_PC6;       // IO Pin 4
       if(servocount > servo3) PORTC &= ~IO_PC7; else PORTC |= IO_PC7;       // IO Pin 1
       if(servocount < 3200) servocount++; 
    		else {servocount=1; if(p) p--;}   // p = 1/50 Sek
    }
    Wie man sieht hab ich die Konfigurationen vom Timer als ersten schritt mal in eine eigene Procedur gepackt.
    Jetzt hab ich mir gedacht ich schreibe diese Prozudur in die Lib rein, damit sie "weg" ist.

    Also hab ich die Procedur erstellt und in die rp6control lib.c gepackt und compiliert. Im mainprogramm gibt es jetzt aber das problem dass die procedur wenn ich sie aufruf nicht "erkannt" wird.

    Wie gesagt, so wie ich es getan hätte wäre es für mich logisch gewesen, aber ich hab auch noch nie eine Lib verändert, von daher kann ich auch irgendetwas vergessen hab.


    PS: GANZ komisch ist, (das hab ich zuerst versucht) dass ich die ISR in die lib packe. komischerweiße wird die while schleife dann überhaupt nicht abgearbeitet. Das main-programm fängt immer wieder von vorne an?!?

    Wär super wenn mir jemand Hilfestellung geben könnte

  4. #14
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Haben sie auch diese Function in den rp6controllib.h gepackt ? Da muss ess auch declariert werden, aber nur die "heading". Die eigentliche function bleibt in controllib.

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    16.12.2009
    Beiträge
    34
    Zitat Zitat von RP6conrad
    Haben sie auch diese Function in den rp6controllib.h gepackt ? Da muss ess auch declariert werden, aber nur die "heading". Die eigentliche function bleibt in controllib.
    Das ist mir in Nachhinein auch gekommen.
    Also hab ich sie dort auch deklariert, aber es kommt immernoch der selbe Fehler...

    Aber mehr ist normal nichts zu tun oder, ich mal eine kleine Übersicht (so wie ICH denke):

    1. Komplette Funktion in die rp6controllib.c schreiben
    2. Den funktionskopf in der Headerdatei deklarieren
    3. Im Hauptprogramm die Funktion aufrufen

  6. #16
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    clean und make all?

    In Mode 10 zählt der Timer von 0 bis ICR1 und wieder zurück, Takt bei M32 ist dann bei ICR1=50 etwa 16MHz/100=160kHz ;)

    Gruß

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

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

12V Akku bauen