Servosteuerung - Neuland

Gast #254405
Lesenswert?

Hallo zusammen!

Ich muss einen Servo über einen ATMega128 ansteuern... kenn moch aber
mit Servos Null aus!
Könnte mir jemand sagen, wie ich ihn anschließe ? (PWM, Port,...)
Und, hätt eventuell jemand einen source code für mich.. oder einige
funktionen ?
Und andere Wichtige Sachen ?

Mit bestem Danke, lg Nickl
Gast #254407
Lesenswert?

Danke Rahul...
Jetzt kenn ich mich mit der theorie aus... aber nach was ich noch auf
der sucha bin wäre ein source beispiel wo genau 1 servo angesteuert
wird.. möglichst einfach, damit ich mich auch auskenna...

danke niki
#254408
Lesenswert?

// Steuerung zweier Servos über einen ATmega162 und dessen Timer1
// Setzen der Portpins durch das Overflow-Interrupt
// Rücksetzen der Portpins durch die Output-Compare-Interrupts.
// Servo1 an PORTE 0, Servo 2 an PORTE 1
// 15.Oktober 2005

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define Startwert 0x0E66   // Timer-Ticks für 1ms bei 3,686MHz
#define Endwert 0x1CCC     // Timer-Ticks für 2ms bei 3,686MHz
#define Mittelwert 0x1599  // Timer-Ticks für 1,5ms bei 3,686MHz

volatile unsigned int Servo1, Servo2;  // Reload-Werte
volatile unsigned int inkrement1, inkrement2; // Änderungswerte
volatile unsigned char umsch1, umsch2; // Richtungsangabe
volatile unsigned char dec,dec0;  // Refresh

volatile unsigned char Buffer[BufferMax];
volatile unsigned char Buffercount, send;

SIGNAL(SIG_OVERFLOW1)
{
  PORTE = 0x06; // beide Servos "einschalten"
  dec--;
  if (dec == 0)
  {
    dec = dec0;
    if (umsch1 == 0)
    {
      Servo1 += inkrement1;
    }
    else
    {
      Servo1 -= inkrement1;
    }

    if ((Servo1 < Startwert) || (Servo1 >= Endwert))umsch1 = ~umsch1;

    if (umsch2 == 0)
    {
      Servo2 += inkrement2;
    }
    else
    {
      Servo2 -= inkrement2;
    }

    if ((Servo2 < Startwert) || (Servo2 > Endwert)) umsch2 = ~umsch2;

    OCR1A = Servo1;
    OCR1B = Servo2;
  }
}

SIGNAL(SIG_OUTPUT_COMPARE1A)
{
  PORTE &= ~0x02;  // Servo 1 ausschalten
}

SIGNAL(SIG_OUTPUT_COMPARE1B)
{
  PORTE &= ~0x04; // Servo 2 ausschalten
}

int main(void)
{
  DDRE = 0x06;  // zwei Pins als Ausgang
  PORTE = 0x01;  // low am Ausgang. Pull-Up einschalten

  Servo1 = Mittelwert;
  Servo2 = Startwert;

  OCR1A = Servo1;
  OCR1B = Servo2;

  inkrement1 = 0x25;
  inkrement2 = 0x12;

  dec0 = 1;
  dec = dec0;

  umsch1 = 0;
  umsch2 = 0;
  TIMSK = ((1<<TOIE1) | (1<<OCIE1A) | (1<<OCIE1B) | (1<<TICIE1));

  sei();

  TCCR1B = (1<<CS10);

  for(;;)
}

ganz einfach ist es nicht. Aber du willst ja noch was lernen...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren