[Info]
Aktuelle Zeit: Fr 23. Feb 2018, 23:22

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Routine zum Ansteuern von Servos
BeitragVerfasst: So 11. Mär 2012, 14:58 
Offline
Wiki-Crew
Benutzeravatar

Registriert: Do 28. Jul 2011, 15:03
Beiträge: 739
Wohnort: Schwentinental

Spezialgebiet: ARM(besonders Cortex M4), USB
Nach langer Probierzeit ist die Include zum steuern von x Servos fetig. Sie ermöglicht es einem eigentlich unbegrenz viele Servos an verschiedenen Ports an zu steuern. Dabei ist eine maximale Auflösung von 0,7 Grad möglich. Das erreich man aber nur unter Idealbedingungen. Das würde bedeuten, das der verwendete Timer genau mit einer Frequenz von 1KHz läuft. Die Verwendung der Lib sieht in etwa so aus: Es müssen die passenden Konstanten definiert werden und der Timer initalisiert. Im Hauptprogramm muss dann nur noch das Array Servolist initalisiert werdem, indem die Funktion init_ServoArray() aufgerufen wird. Danach muss nur noch das Array selber mit Werten belegt werden. Achtung, bei Arrays fängt man bei 0 an zu zählen. Servo1 wird also wie folgt eingegeben
Code:
servolist [0].pin = PORTxy;  Anschlusspin des Servos
servolist [0].port =& PORTx; Port des Sevos
//der Drewinkel wird mit dieser Variable festgelegt:
servolis[0].angle = 0; // Null bedeutet Mittelstellung -127 linker Anschlag, 127 rechter Anschlag

Die eigentliche Lib:
Vielen Dank nochmal an SeriousD, Döme und Th3Falc0n, ohne die diese Lib hier nicht stehen würde :bier:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
/*
Wichtig für die korrekte Funktionsweise der Lib ist das richte Einstellen des Taktes vom 8-Bit Timer auf 1KHz Wichtig dabei CTC-Mode
logischerweise müssen die entsprechenden Ports in das Array Servolist eingetragen werden
Dazu muss in der Funktion init_ServoArray() nach initialisierung der Servos, dieses mit Pins,Port und evtl Winkeln gefüllt werden
Diese drei Konstanten müssen vor dem Einbinden der include definiert werden:
#define VEKTOR -> Der passenden Interruptvektor aus dem Datenblatt. BSP TIMER0_COMP_vect
#define NUMBER_OF_SERVOS
#define VERGLEICHSREGISTER BSP: ORC0
*/
typedef struct
{
   
    uint8_t PIN;
    volatile uint8_t *PORT;
    int8_t angle;
} servo;

volatile struct
{
    unsigned modus :1 ;
    unsigned index: 7;
} Servo;
 
volatile servo servolist[NUMBER_OF_SERVOS];
ISR (VEKTOR)
{
   
       VERGLEICHSREGISTER = 255;
   
         if (Servo.modus)
         {
             *(servolist[Servo.index].PORT) &= ~(1 << servolist[Servo.index].PIN );     //Alten Servo löschen
         
                  if (++Servo.index >=NUMBER_OF_SERVOS) //Wenn inkrementierter Index größer als Servoanzahl, reset
             {
                    Servo.index= 0;
             }   
         
             *(servolist[Servo.index].PORT) |= (1 << servolist[Servo.index].PIN ); //Neuen Servo setzen und...
             VERGLEICHSREGISTER = 255; //...1ms warten
             Servo.modus =0; //Servo als aus makieren
         }
         else
         {

          VERGLEICHSREGISTER = 127+servolist[Servo.index].angle; //Drehwinkel, "Restzeit" warten , Wertebereich [-127...127]
          Servo.modus = 1; //Servo als ein makieren
         }
   
}
void init_ServoArray() //lädt in alle Stellen des Arrays eine Null
{
    servo empty;
    empty.PIN = 0;
    empty.PORT = 0;
    empty.angle = 0;
    for(uint8_t i  = 0; i >= NUMBER_OF_SERVOS;i++)
   {
      servolist[i] = empty;
   }
   
           
   
 
   
}


Je mehr Servos man verwendet, desto größer wird die Zeit, die es dauert, bis eine Wertänderung in der Variable wirksam wird.
:headbang: 300. Post
Gruß Jannis


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Share on FacebookShare on Google+Share on Reddit
Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Gehe zu:  



Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de

moShBox © 2008, 2009, 2010 mosfetkiller-Community