Forum: Mikrocontroller und Digitale Elektronik ATMega8 - C - Servo


von Jake f. (jake55)


Lesenswert?

hallo,
ich habe folgendes Problem und habe mich nach langem suchen in das Forum 
zu schreiben.

Also :
Ich versuche schon seit längerer Zeit einen Servo Motor mittels einem 
ATMega8 und mit der Programmiersprache C anzusteuern. Ich vermute mein 
Code ist nutzlos , dar ich damit den servo nur in eine Richtung bewegen 
kann in die andere Funktioniert es nicht. Zusätzlich habe ich es nur mit 
delay probiert.
Hoffentlich kann einer von euch das mit dem Timern simpel erklären.

Der Code (der Servo dreht sich nach rechts) :
1
int main(void)
2
{
3
  //DDRD = 0b00000001; 
4
  //PORTD = 0b00000001;
5
  
6
  
7
  DDRD |= 1 << PIND1;  
8
  
9
  DDRD |= 1 << PIND0;
10
  while(1)
11
  {
12
    
13
    PORTD ^= 1 << PIND1;
14
    _delay_ms(1);
15
    PORTD ^= 1 << PIND1;
16
    _delay_ms(19);       
17
    
18
      
19
  }
20
  
21
  
22
  return 0;
23
}
Wenn ich in der while schleife den delay wie folgt ändere dreht er sich 
auch nach rechts.
[/C]
    PORTD ^= 1 << PIND1;
    _delay_ms(2);
    PORTD ^= 1 << PIND1;
    _delay_ms(18);
[/C]

Sagt mir ob das alles Quatsch ist. Danke im voraus!

: Bearbeitet durch User
von Servus (Gast)


Lesenswert?


von Rolf Magnus (Gast)


Lesenswert?

Prozessortakt ist richtig gesetzt und F_CPU auch passend definiert?

von Jake f. (jake55)


Lesenswert?

Ich denke nicht.
Wahrscheinlich ist es der punkt , den ich nicht verstanden habe.
ich habe immer diese Grafiken gesehen und mit diesem Code versucht den 
servo anzusteuern.

Aber ich habe ihn gerade mithilfe von 
http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung
den servo zum laufen gebracht
Ich würde das trotz dem gerne verstehen.




ok... es hat am anfang nur eine zeile gefehlt :
#define F_CPU 1000000UL

: Bearbeitet durch User
von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Hallo Jake,

im Prinzip alles korrekt. Um das Servo auch in zwischenpositionen zu 
steuern, musst Du auf ca. 2µs genau den Impuls erzeugen. Schau Dir mal 
die PWM von Timer1 an (16 Bit).

Links und rechts angesteuert könnte dann so aussehen:
1
for (;;) {
2
  if (links) {
3
    1ms Impuls ausgeben
4
  } else {
5
    2 ms Impuls ausgeben 
6
  }
7
  15-20ms Warten
8
}
Wenn Du den Timer verwendest, lässt Du ihn mit 1µs Takt bis 20000 zählen 
und schaltest den Pin mit output compare bei der gewünschten Länge um. 
Da der ATmega8 bei Timer1 zwei OC-Werte zulässt, kann man zwei Servos 
ansteuern.

Grüße, Kurt

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Jake flint schrieb:
> Ich denke nicht.

Dann solltest du das rauskriegen.

mittels delay_ms( 1000 ) eine LED blinken lassen.
Entweder die LED ist 1 Sekunde an und 1 Sekunde aus, oder sie ist es 
nicht.

von Stefan (Gast)


Lesenswert?

Ich meine in einem anderen Thread gelesen zu haben, dass die delay 
Funktionen (genau genommen sind es IMHO Makros) auch mit 
Fließkomma-Konstanten aufgerufen werden können.

Ansonsten verwende delay_us.

Irgendwann soll das Programm neben der Steuerung des Servos aber auch 
noch was anderes tun, z.B. Befehle empfangen und verarbeiten. Spätestens 
dann wirst Du mit deinem delays nicht mehr klar kommen. Das 
Ausgangssignal wird unregelmäßig, der Servio wird zittern.

Wenn Du einen Timer verwendest, und in dessen Interrupt den Ausgang 
setzt oder einen OCR Ausgang verwendest, hast Du das Problem nicht.

von chris_ (Gast)


Lesenswert?


von Rolf Magnus (Gast)


Lesenswert?

Stefan schrieb:
> Ich meine in einem anderen Thread gelesen zu haben, dass die delay
> Funktionen (genau genommen sind es IMHO Makros) auch mit
> Fließkomma-Konstanten aufgerufen werden können.

Ja, können sie.

von Jake f. (jake55)


Lesenswert?

Ok...
Ich wollte mich bei euch allen bedanken , weil ihr mir gut 
weitergeholfen habt ich habe das jetzt verstanden und kann endlich 
meinen servo in zwei Richtungen bewegen  :D
Jake

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.