mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo Ansteuerung basierend auf das Mikrocontroller.net Beispiel


Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

ich habe unter

http://www.mikrocontroller.net/articles/Modellbaus...

ein Beispiel für eine Servo Ansteuerung gefunden und folgendermaßen 
verändert:

#include <avr/io.h>                             //Grundfunktionen
#ifndef F_CPU                                   //Vordefinieren für 
delay.h
#define F_CPU 1000000UL                         //Definition von F_CPU 
in Herz
#endif
#include <util/delay.h>                         //Warteschleifen
#include <stdint.h>                             //Variablen
#include <avr/interrupt.h>                      //Interruptroutinen

ISR(TIMER1_COMPA_vect)
{
  OCR1A=2500-OCR1A;                             //Das Servosignal wird 
aus der Differenz von Periodenlänge ((2500*0,008ms)=20ms)
                                               //und letztem 
Vergleichswert (OCR1A) gebildet
}


int main (void)                                 //Hauptfunktion
{                                               //Anfang der 
Hauptfuktion
  unsigned int direction = 1;

  DDRB=0b11111100;                             //Alles Ausgänge bis auf 
PB0 und PB1
  PORTB=0b00000011;                             //Pullup für PB0 und PB1
  TCCR1A=0b01010000;                           //Tooglen von PB3
  TCCR1B=0b00001010;                           //CTC-Mode und; Prescaler 
8; Prozessortakt
  TIMSK=0b01000000;                             //Interrupt
  OCR1A=2250;                                   //Startposition ganz 
link bzw. ganz rechts, werde ich noch herausfinden
  sei();                                       //Interrupt an
  while(1)
  {
    if ( (OCR1A < 2375)  && (direction == 1) )
    {
      cli();
      OCR1A=OCR1A+5;
      sei();
      _delay_ms(50);                           //Verlangsamung der 
Veränderung
    }
    if ( (OCR1A == 2375) && (direction == 1) )
    {
      direction = 0;
    }

    if ( (OCR1A > 2250) && (direction == 0) )
    {
      cli();
      OCR1A=OCR1A-5;
      sei();
      _delay_ms(50);                           //Verlangsamung der 
Veränderung
    }
    if ( (OCR1A == 2250) && (direction == 0) )
    {
      direction = 1;
    }
  }
  return 0;
}


Ich möchte also, dass mein Servo periodisch zwischen den Stellungen ganz 
links und ganz rechts hin und her fährt. Was ich an dem Beispiel aber 
noch nicht verstanden habe: An welchem Pin wird die Steuerleitung des 
Servos angeschlossen? An einem der PB Pins 2 - 7?

Denn bei mir tut sich noch nichts am Servo. Was mache ich falsch?

LG Mark

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin noch recht neu im Umgang mit µCs und habe hier zum Spielen ein 
STK500 Board. Könnte das oben beschriebene Problem vielleicht damit 
zusammenhängen, dass ich den Taktgeber (d. h. Quarz oder interner RC 
Oszillator, etc.) nicht explizit vorgegeben habe? Woher weiß ich 
überhaupt mit welcher Frequenz mein Programm läuft? Oder wie müsste ich 
vorgehen um den internen 1MHz Takt auszuwählen?

LG Mark

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Woher weiß ich
> überhaupt mit welcher Frequenz mein Programm läuft?

Normalerweise, weiss man was man eingestellt hat, bzw. welcher Quarz da 
drann hängt :-)

Kannst du an irgendeinem Pin eine LED anschliessen?
(ICh gah mal davon aus, dass du das am Pin 2 vom Port B (also PB2) 
machen kannst

Probier mal folgendes Programm aus
#define F_CPU 1000000UL

include <avr/io.h>
#include <util/delay.h>                         //Warteschleifen

int main()
{
  DDRDB = 0xFF;

  while( 1 ) {
    PORTB |= ( 1 << PB2 );
    _delay_ms( 1000 );
    PORTB &= ~( 1 << PB2 );
    _delay_ms( 1000 );
  }
}

Und schalte auf jeden Fall die Optimierung des Compilers auf -Os

Blinkt die LED im Sekundentakt (1 Sek ein, 1 Sek aus)?
Wenn ja, dann läuft dein µC mit 1Mhz.

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dank eurer Tipps (Link zu Fuses Doc. und LED Bsp) weiß ich nun ganz 
sicher, dass der interne Oszillator arbeitet. Der extern aufgesteckte 
Quarz macht nämlich genau 4 Mhz und die LED blinkt im 1 Sek. Takt.

Nun denn, vielleicht kann mir einer verraten, ob und wie ich das obige 
Bsp. modifizieren müsste, um den Servo mit dem Signal zu versorgen.

LG Mark

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre für jeden weiteren Tipp dankbar!!!

Autor: Daniel B. (inox5) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche doch mal überhaupt das Programm an sich zum laufen zu bringen.
Wenn du das geschafft hast, modifizier den Code.

Das Steuersignal liegt an PB3, wenn ich meinen Code da gerade überschau.

Autor: Daniel B. (inox5) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du es inzwischen zum laufen gebracht? interessiert mich wegen 
meinem artikel.

MfG
Inox

Autor: twizzler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel,

meine Anwendung läuft mittlerweile. Ich benutze jetzt allerdings den 
16Bit Timer im PWM Mode. Mit deiner Anwendung hatte ich zuletzt noch 
Schwierigkeiten gehabt. Das liegt aber wohl eher an mir als an deinem 
Code.

Mark

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.