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


von Mark (Gast)


Lesenswert?

Hallo allerseits,

ich habe unter

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

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

von Mark (Gast)


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

von Gast (Gast)


Lesenswert?


von Karl H. (kbuchegg)


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
1
#define F_CPU 1000000UL
2
3
include <avr/io.h>
4
#include <util/delay.h>                         //Warteschleifen
5
6
int main()
7
{
8
  DDRDB = 0xFF;
9
10
  while( 1 ) {
11
    PORTB |= ( 1 << PB2 );
12
    _delay_ms( 1000 );
13
    PORTB &= ~( 1 << PB2 );
14
    _delay_ms( 1000 );
15
  }
16
}

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.

von Mark (Gast)


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

von Mark (Gast)


Lesenswert?

Wäre für jeden weiteren Tipp dankbar!!!

von Daniel B. (inox5) Benutzerseite


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.

von Daniel B. (inox5) Benutzerseite


Lesenswert?

hast du es inzwischen zum laufen gebracht? interessiert mich wegen 
meinem artikel.

MfG
Inox

von twizzler (Gast)


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

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.