einfache Servoansteuerung

OP #1795248
Lesenswert?

Hallo,

ich habe heute mal versucht, einen Servo anzusteuern. Dazu wollte ich 
ganz einfach anfangen:

1
#include <avr/io.h>
2
#define F_CPU 8000000UL
3
#include <util/delay.h>
4

5
int main() {
6
 // Alle Pins des Ports B als Ausgang definieren:
7
  DDRD = 0xff; 
8

9
  while(1) {
10
  // 5 auf high
11
  PORTD=(1<<PD5);
12
  _delay_ms(1);
13
  // 5 auf low
14
  PORTD &= ~(1<<PD5);
15
  _delay_ms(9);
16
  _delay_ms(10);
17
 }
18
}

Ich benutze das Pollin Board, bei F_CPU habe ich 16, 8, 4, 1 
ausprobiert. Der Takt müsste auf intern gestellt sein.

Doch leider bewegt sich der Servo nur in eine Richtung bis zum Anschlag.

Wo liegt das Problem?

Grüße
Moderator (Firma: Titel) Persönliche Seite #1795267
Lesenswert?

> Wo liegt das Problem?
Hauptsächlich da:
> bei F_CPU habe ich 16, 8, 4, 1 *ausprobiert*
Warum mußt du da irgendwas ausprobieren?

Wenn du nachsiehst, welche Taktfrequenz du verwendest und ob deine 
Fusebits passend dazu programmiert sind (die kann man nämlich nicht im 
C-Programm einstellen), dann sollte das kein Ausprobieren mehr sein, 
sondern Wissen.

Und dann kannst du mit einer Mikrosekundenverzögerung _delay_us() die 
Pulsdauer mal (wie schon angesprochen) zwischen den beiden Endanschlägen 
1000us und 2000us verändern.
Gast #1795290
Lesenswert?

> Ich benutze das Pollin Board, bei F_CPU habe ich 16, 8, 4, 1
> ausprobiert. Der Takt müsste auf intern gestellt sein.

Wenn du Intern 1 MHz hast (gehe ich von aus) und im Code alles andere 
als 1 MHz einstellst, werden deine _delays verfälscht und dann sieht die 
PWM anders aus. Servo bewegt sich zwischen 1-2ms.

Gruß
OP #1795340
Lesenswert?

Laut Fuse-Bits müsste es externer Quarz sein, d.h. 16MHz
Den MC habe ich aus einer anderen Schaltung entnommen und dort hatte er 
keinen externen Quarz, daher habe ich dann doch mal 1MHz probiert.
Um ganz sicher zu gehen, dass es nicht am Quarz liegt, habe ich eben die 
anderen möglichen Frequenzen auch ausprobiert.

Auch habe ich beim ersten Delay schon mehrere Werte probiert z.B. 1; 2; 
1,4; 1,5

Der Fehler muss irgendwo anders liegen...
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.