- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 6 von 11 ErsteErste ... 45678 ... LetzteLetzte
Ergebnis 51 bis 60 von 110

Thema: RP6 Servo Ansteuerung

  1. #51
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    E-Bike
    Leute, ihr schafft mich ;)

    @Virus: Wenn die Servomitte ca. 1,5ms ist (manche Dokus sagen auch 1ms), dann ist 0,5 oder gar 3ms weit außerhalb des Drehbereichs.

    @schmiereck: Bei diesem Beispiel mit dem Deltabot verwende ich die LEDs (IO1-4 und BPL/BPR) am Userbus1 den ich bei meinem RP6 so belegt habe:
    SL1 1 - 2 GND
    SL2 3 - 4 Vcc
    SL3 5 - 6 ADC0
    SL4 7 - 8 ADC7
    SL5 9 - 10 ADC1
    SL6 10- 12 Vcc
    frei 13- 14 GND
    Dabei war mein Ziel möglichst viele Pins für externe Erweiterungen rauszuführen. An 2-4-6 bzw. 14-12-10 kann man direkt ein Servo einstecken. ADC7 ist übrigends der Batterie-ADC den ich auf der Platine unterbrochen und mit Jumper umgerüstet habe.

    Hier gibts die USRBUS-Belegung von Dirk die für den Anschluß einer Erweiterungsplatine viel sinnvoller ist:
    https://www.roboternetz.de/phpBB2/ze...ag.php?t=32549

    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!

  2. #52
    Erfahrener Benutzer Roboter Experte Avatar von Virus
    Registriert seit
    15.09.2009
    Ort
    Duisburg
    Alter
    30
    Beiträge
    527
    aber alle werte zwischen 5 und 30 hauen den servo gegen den linke anschag
    Mit hochohmigen Grüßen
    Virus

    Es lebe der Digitalkäse !

  3. #53
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo Virus,

    dass dein Servo immer an der selben Seite anschlägt habe ich leider überlesen. Da sleep() auch beim M32 (es geht doch um ein M32, oder?) mit 10kHz getaktet wird und deshalb ein sleep(1) wohl auch 0,1ms dauert, erscheint mir ein Fehler im aufrufenden Programm von servo() als Ursache für deinen Effekt. Wird initRP6Control() aufgerufen? Wie sieht das restliche Programm (aufs wesentliche reduziert) aus.

    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!

  4. #54
    OK, verstanden, danke vielmals.

    Das war das, was mir gefehlt hat.
    In der vermaldeteiten (und wirklich nicht schlechten) Doku habe ich nur die Infos auf die zwei freie Analog/Digital Wandler (ADC) Kanäle für eigene Sensoren." auf Seite 10 gefunden. Das irgendwo, bei bei Motorstrom und Batterie (S.90), noch zwei freie Kanäle dokumentiert sind, da muss man erst einmal drauf stossen... (danke für die Hinweisse)

    Mein Fazit, erst einmal, ich warte auf mein Erweiteruns-Board. Das "missbrauchen" von "Betriebssystem-Funktionen" ist mir zu krass, ich finde den Grundaufbau nicht schlecht und will ihn nicht unbedingt ändern (ADC7 vierbiegen) - nix gegen basten, ich liebe es - aber das ist mir dann doch alles zu komplex, ich will ja meine Software zum laufen bringen...
    Ich weiss schon was radbruch sagen wird: da musst du nur in der baseLib die Zeilen xy rausnhemen, und dann...

    @radbruch: Warum benutzt du nicht so ein Erweiterungs-Borad? Sind das praktische Erwägungen?

    Gruß,
    smk

  5. #55
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    Laut den ganzen Beschreibung müsste dieser Code doch eigentlich funktionieren (mit den versch. Werten).

    Code:
    //Beschreibung: imp ist die Impulslänge (0.1ms=1)
    void servo_io6 (int imp)
    	//Kanal als Ausgang
    	//Impuls für imp . ms
    	//Pause bis zum nächsten Impuls
        {
        DDRC |= IO_PC6;
        PORTC |= IO_PC6;   
        sleep(imp);         
        PORTC &= ~IO_PC6; 
        sleep(200-imp);        
       }
    Ich habe jetzt schon die verschiedenen Werte probiert (von 10 bis 20).
    Das Servo bewegt sich zwar, aber überhaupt nicht weit (ca. 10 Grad, wenn es überhaupt 10 sind).
    Die Mittelstellung liegt im Vergleich mit einem Graupner Empfänger bei 13ms.

    Soll ich mal andre Werte versuchen, wenn ja welche oder habe ich einen Fehler eingebaut, etc.?

    PS: Das Servo soll nach Möglichkeit am Leben bleiben ... ist eigentlich das Höhenruderservo eines Modellfliegers und auch noch eingebaut

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

    Mal ehrlich, was soll man mit den Codebrocken anfangen die ihr uns hier vorwerft? Wenn die Servo()-Funktion von Virus nicht funktioniert und deine quasi identische Funktion (außer der Mitdenkeränderung sleep(200-imp);) auch nicht funktioniert, woran könnte das dann liegen? Funktionieren meine beiden sleep()-Beispiele von oben wenn ihr sie ans M32 anpasst? Wie sieht das angepasste Programm aus? Ich weiß immer noch nicht, ob ihr überhaupt ein M32 verwendet. Wie und wo ist IO_PCx definiert? Warum ist bei dir imp ein Integer?

    @schmiereck: Für's M32 bin ich schlicht zu geizig ;)

    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!

  7. #57
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    Ich kann mir nicht vorstellen wo sonst der Fehler liegen sollte ... hoffe ja doch dass ich ne übergabe eines Wertes in ein Nebenprogramm zusammenbringe.

    Code:
    #include "RP6ControlLib.h" 
    
    
    //Beschreibung: imp ist die Impulslänge (0.1ms=1)
    //Servo an PC5
    void servo_io5 (int imp)
    	//Kanal als Ausgang
    	//Impuls für imp . ms
    	//Pause bis zum nächsten Impuls
    	{
        DDRC |= IO_PC5;
        PORTC |= IO_PC5;   
        mSleep(imp);         
        PORTC &= ~IO_PC5;
        mSleep(200-imp);       
    	} 
    
    
    
    
    int main(void)
    {
    	initRP6Control();
    	initLCD(); 
    	
    	showScreenLCD("RP6 Control", "RP6");
    	clearLCD(); 
    	sleep(500);
    	
    	showScreenLCD("Servobewegung", "");
    	sleep(1500);
    	
    	int i=0, x;
    	
    	while(i<100) //2000ms
    	{
    	servo_io5(13);
            //i=i+1;
    	}
    
    	i=0;
    	x=10;
    	while(true)
    	{
    		while(i<10) //200ms
    		{
    		servo_io5(x);
    		}
    	x=x+1;
    		if (x>=20)
    		{
    		x=10;
    		}
    	}
    
    	
    		
    	
    	
    	while(true) 
    	{
    		showScreenLCD("Endlosschleife", "");
    	}
    	return 0;
    }
    Ich verwende die Erweiterungsplatine M32 und IO_PC6 (in diesem Fall) ist in der Library RP6ControlLib.h definiert.
    Man kann mit den Befehlen dann die verschiedensten Sachen machen:
    Wenn man einen I/O Pin als Ausgang verwenden will, um z.B. eine LED zu schalten,
    muss man das entsprechende Bit im DDRx Register auf 1 setzen.
    Beispiel:
    DDRC |= IO_PC7; // PC7 ist nun Ausgang
    DDRC = IO_PC7 | IO_PC6 | IO_PC5; // PC5, PC6, PC7 sind nun Ausgang,
    // alle anderen Pins sind Eingänge!
    Dann kann man über das PORTx Register den Ausgang auf high oder low pegel schalten.
    Beispiel:
    PORTC |= IO_PC7; // High
    PORTC &= ~IO_PC7; // Low
    Ist ein Bit im DDRx Register 0, so ist der zugehörige Pin als Eingang konfiguriert.
    Beispiel:
    DDRC &= ~IO_PC6; // PC6 ist nun Eingang
    Dann kann man über das PINx Register den Zustand des Pins auslesen, also ob high
    oder low Pegel am Pin anliegt.
    if(PINC & IO_PC6)
    writeString_P("PC6 is HIGH!\n");
    else
    writeString_P("PC6 is LOW!\n");
    aus der Beschreibung des M32 Moduls

    Ich habe den Code jetzt auf PC5 umgeschrieben. Ich bin mir allerding bei der Sache mit sleep(.ms) mittlerweile nicht mehr sicher.

    Wie sollte ich die imp - Variable sonst deklarieren? Müsste doch eigentlich passen.

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

    Ich vermute, die IO-PCx werden in iom32.h der AVR-Includes definiert, bin aber grad zu faul zu suchen

    Wie kommt man denn aus diesen Schleifen wieder raus:
    Code:
       while(i<100) //2000ms
       {
       	servo_io5(13);
       }
    ...
          while(i<10) //200ms
          {
             servo_io5(x);
          }
    i wird nirgends verändert.

    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!

  9. #59
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    ich glaub das war noch der code bevor ich es probiert habe ... werds umbessern

    ... wir sind ja alle nur Menschen

    @radbruch:
    Wenn die IO Port in einer anderen Lib definiert sind, wieso funktioniert es dann z.B. einen Tranistor so (fast so) anzusteuern?

    edit:
    ich hab beim probiern das i++ weggenommen ...
    dann bleibt das servo immer in der mittelstellung und ich muss nichts im Code ändern

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

    Die IO_PCx werden in RP6Control.h als (1<<PCx) definiert, das ist also ok. Sonst würde sich wohl auch gar nichts tun. iom32.h wird automatisch von avr/io.h eingebunden, dieses wiederum steht ebenfalls in RP6Control.h

    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 6 von 11 ErsteErste ... 45678 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test