Forum: Mikrocontroller und Digitale Elektronik Servosteuerung - Neuland


von Nickl (Gast)


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

von Rahul D. (rahul)


Lesenswert?

Mit der Suche kennst du dich wohl auch nicht aus:

http://www.mikrocontroller.net/forum/read-1-75205.html

von Nickl (Gast)


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

von Rahul D. (rahul)


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...

von Nickl (Gast)


Lesenswert?

Bist a guade haut! danke

von Hannes L. (hannes)


Lesenswert?

auf www.hannes.de.md findest du ein Beispiel für mehrere Servos am
AT90S4433. Ist in Assembler, aber gut kommentiert.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.