-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: einfacher schnellerer Timer zur Ansteuerung von Servos

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Ort
    Preetz
    Alter
    30
    Beiträge
    150

    einfacher schnellerer Timer zur Ansteuerung von Servos

    Anzeige

    Hallo,

    ich wollte mal fragen, ob es eine "Stopwatch" mit höherer auflösung als die vorhandene gibt?
    Selbst die sleep() Funktion ermöglicht nur eine Pulsgeneration auf 10° genau. Gibt es da vielleicht eine kleine Erweitrung für die Lib???

    Hier mal mein Code. Mein Testservo hängt am ADC3 des M32 Boards.
    Code:
    // Includes:
    
    #include "RP6ControlLib.h" 		// The RP6 Control Library. 
    								// Always needs to be included!
    #define		CLOCKWISE			4		//minimal value = 4
    #define		COUNTERCLOCKWISE	22		//maximal value = 22
    #define		SPEED				0		//set impulse increasement/decreasement Speed in ms (0 bis <40 ist Ruckelfrei)
    #define		ADJUSTTIME			200		//Set the servo's time needed to rotate 180° in ms (ausbauen und Pausenzeit auf ein minimum reudzieren)
    
    
    
    // Main function - The program starts here:
    
    int main(void)
    {
    	initRP6Control(); // Always call this first! The Processor will not work
    					  // correctly otherwise. 
    
    	setStopwatch1(0);
    	startStopwatch1();
    	DDRA |= (ADC3);
    	
    	uint8_t pulse = CLOCKWISE;
    	uint8_t countup = true;
    	
    	while(true) 
    	{
    		PORTA |= ADC3;
    		sleep(pulse);
    		PORTA &= ~ADC3;
    		mSleep(20);         //könnte man noch durch eine Stopwatch ersetzen
    		
    		if(getStopwatch1() >= SPEED)		// nach ablauf der Zeit wird die nächste Position angefahren
    		{
    			if (pulse>=COUNTERCLOCKWISE)	// wechsel der drehrichtung
    			{
    				countup = false;
    				mSleep(ADJUSTTIME);			// muss noch optimiert werden, damit es pausenlos läuft
    			}
    			else if (pulse<=CLOCKWISE)
    			{
    				countup = true;
    				mSleep(ADJUSTTIME);
    			}
    
    			if (countup == true)			// ändrung der Richtung
    				pulse++;
    			else
    				pulse--;
    				
    			setStopwatch1(0);
    		}
    	}
    	return 0;
    }
    Das ist schon recht Simpel gehalten, aber dennoch mit einem besseren Timer ausbaufähig.

    mfg WarChild
    (c) Rechtschreibfehler sind rechtmäßiges Eigentum des Autors (c)

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.01.2008
    Ort
    Schrobenhausen, München
    Alter
    24
    Beiträge
    583
    Hi,

    warum machst du das nicht mit einer Software-PWM?

    ich kann dir zwar noch nicht sehr viel darüber sagen, aber eins weis ich: Mit einer Software-PWM kann man Servos auf bis zu (1/255)*180° oder (1/1024)*180° verschiedene Stellwinkel bringen, je nachdem, ob man einen 16 Mhz Timer oder einen 8 Mhz Timer einsetzt

    Dazu kannst du dir vielleicht überlegen, einen M32 für 3,00€ bei Reichelt zu kaufen, der hat ein paar Timer, den lässt du dann per I²C die Servostellungen empfangen und kannst ihm dann mit ner Software-PWM die Servos ansteuern lassen

    ich sag deshalb Software-PWM, weil es auch µCs gibt, die eine eingebaute Hardware-PWM haben, wie man die dann ansteuert weis ich leider nich...

    ansonsten kannst du das natürlich auch direkt an der M32 machen, die hat ja auch ein paar freie Timer

    Ich weis jetzt auch nicht, was er kostet aber dieser Servochip für 20 Servos soll ja sehr empfehlenswert sein...

    MfG Pr0gm4n

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Ort
    Preetz
    Alter
    30
    Beiträge
    150
    Mit welchen Befehlen spricht man die internen Timer des AtMega32 an?

    Vielen Dank im vorraus.

    Was mir etwas fehlt ist der simple 10 us Takt, den den ich von der Siemens Step 7 kenne. Damit lassen sich beliebig viele "Stopwatches" erstellen, indem man einfach die takte zählt...
    (c) Rechtschreibfehler sind rechtmäßiges Eigentum des Autors (c)

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.411
    naja mit "befehlen" geht das nicht, du musst die steuerregister der timer entsprechend einstellen und evetuell die Timer-ISR schreiben ... ich verweise hier mal aud das datenblatt des mega32, ich würds dir ja gern erklären iss aber vll. n bisschen viel ohne das datenblatt zu rate zu ziehen

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Ort
    Preetz
    Alter
    30
    Beiträge
    150
    Ich hasse das Datenblatt

    Warum gibt es für die Atmega32 funktionen nur kein ähnliches Listing wie für die Standardbibliotheken...

    Aber trotzdem danke!

    mfg WarChild
    (c) Rechtschreibfehler sind rechtmäßiges Eigentum des Autors (c)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.411
    mh das datenblatt ist doch sehr übersichtlich ... nimm zum beispiel timer0 und liess dir die beschreibung zu den registern durch(im letztenabschnitt zu timer0), da sind die ganzen flags, register und ihre bedeutung wunderschön erklärt ... das datenblatt kann man nicht hassen man kann nur zu faul sein es zu lesen ... ich kanns ja wenigstens mal verscuhen zu erklären aber erst wenn ich zu hause bin


    EDIT wenn du schonmal mit den megas gearbeitet hast, müsste dir doch klar seni das es keine "funktionen" gibt, sondern ausschliesslich mit registern gearbeitet wird ?!

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    33
    Beiträge
    1.514
    Hallo WarChild,

    schau Dir doch nochmal den RP6Lib Header an: timer.
    Das ist eine Variable die alle 100us erhöht wird.

    MfG,
    SlyD

    Edit:
    die Variable heisst natürlich nicht system_timer sondern nur "timer".
    Sorry hatte ich grad irgendwie falsch im Kopf.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo WarChild,

    schon 'mal in diesem Thread gestöbert?
    Da gibt's (am 8.10.07) von mir z.B. eine fertige Hardware-PWM Servoansteuerung mit der M32:
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=34407

    Gruß Dirk

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Ort
    Preetz
    Alter
    30
    Beiträge
    150
    Ich habe bei durchlesen der Lib eine ganz simple funktion gefunden mit der ich wohl weiter kommen werde...

    delayCycles();

    Das ist zwar ne blockende funktion, aber ich denke mal dass der Chip in den 2,5 ms der pulsgeneration ruhig einmal aussetzen kann, da der Chip dann knapp 18ms bis zum nächsten Puls Zeit hat, um alles andere zu erledigen, finde ich sind 12,5% Auslastung kein problem.

    Ich plane in einer funktion alle 18 Servos, meines Hexpods anzusteuern. (folgede Werte sind auf meine Servos bezogen)
    400us Pulsdauer sind Minimum und Rechtsanschlag. 10us Pulsdauer mehr entsprechen ungefähr einem Grad. Also Lasse ich zunächst alle Ports High setzen, dann wird nach 400us im 10us Abstand, =160 delay Cycles später, überprüft welche Pulse hier enden und werden abgeschaltet bis er bei 2200us angelangt ist und eigentlich alle Ports low sein müssten. Also werden Nahezu beliebig viele Servos simultan mit verschiedenen pulsen versorgt. Allerdings müsste man die Bearbeitungsdauer, um die Ports abzuschalten noch von den delay cycles abziehen, damit das signal später nicht verfälscht ist. Wie lange mad das dauern, eine if-Bedingung zu prüfen und einen Pin auf low zu schalten? 1-2 cyclen???

    Allerding komme ich in Portbedrängnis, denn ich habe nur 6 freie ADCs und 8 freie I/Os also fehlen 4. Ich bin am überlegen welche Pins ich umfunktionieren kann. ich würde ungerne auf I²C und Display verzichten. Die LEDs sind anscheinend mit den LCD Pins doppelt belegt, sonst wäre es ja auch zu einfach, weils genau 4 sind...
    Da gibt es also noch Int0, Int1 und Int2. Die sind doch eigentlich überhaupt nicht belegt, die sind nur im XBus system überall verfügbar nicht wahr?(Ich habe sie auch bei der Base nicht belegt)
    Fehlt noch einer... im Zweifelsfall baue ich das Mic aus uns nutze den Ausgang.


    mfg WarChild
    (c) Rechtschreibfehler sind rechtmäßiges Eigentum des Autors (c)

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.01.2008
    Ort
    Schrobenhausen, München
    Alter
    24
    Beiträge
    583
    Oder du baust den Pieper weg und schaust dann, ob du deine Servos nich quasi mit beep(); steuern kannst

    Ich fänds witzig mal zu nem Motor zu sagen:

    "Hey du, gib mir mal ein a³ bitte...."

    und der Motor Stellt sich dann auf ne bestimmte Position^^


    MfG Pr0gm4n

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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