Forum: Mikrocontroller und Digitale Elektronik Problem mit PWM und Servo


von Max (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich habe mir anhand einiger Beiträge aus diesem Forum ein Programm zum 
ansteuern von zwei Servos geschrieben. Dazu benutze ich die PWM Funktion 
von Timer1. Der Timer arbeitet soweit gut, aber wenn ich versuche die 
Servos drehen zu lassen wird der µC zurückgesetzt. Ich gebe zum Debuggen 
einzelne Zeichen über die serielle Schnittelle aus. Im Terminal sehe ich 
dann folgende Ausgabe: abcabcabcabcabcdeabcabcabcabcabcdeab usw.. Daraus 
entnehme ich das er erst beim 4 Durchlauf bis "e" kommt und dann auch 
nicht in der Main Schleife bleibt. Außerdem drehen die Servos nur 
ständig hin und her. Habe ich bei der Konfiguration des Timers einen 
Fehler gemacht oder liegt es an einer anderen Stelle?

mfg
Max

Hardeware: STK500 mit ATMega16 bei 14,7456 MHz
Compiler: avr-gcc 4.3.0 unter Ubuntu 8.10

von aha (Gast)


Lesenswert?

Die Servos benoetigen 0.8 .. 2.2ms Einschaltzeit bei ca 20ms Periode. 
Wenn das Timing nicht stimmt, wegen einem Interrupt oder so, kommt das 
Servo aus dem Tritt. Es gibt servos, die fahren bei fehlendem, oder 
fehlerhaftem Steuersignal auf eine Deafultposition, andere halten die 
aktuelle position bei fehlendem Steuersignal. Ohne visuelle kontolle des 
Steuersignales mit einem Oszilloskop kann man keinerlei Aussagen machen.

von Max (Gast)


Lesenswert?

Hallo aha

Das halten einer Position ist ja kein Problem. Ich kann auch mit einiger 
Kraft am Servo drehen und er hält trotzdem die Stellung. Deshalb gehe 
ich mal davon aus das es kein Problem mit der Signallänge gibt.
Habe gerade noch ausprobiert den Wert von ICR1 auf ca 22ms anzuheben, 
was aber keine Veränderung gebracht hat.

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Was willst du in der for-Schleife machen?? Wenn ich das richtig sehe 
setzt du 50 mal den gleichen Wert in die compare-Register!!

von Matthias L. (Gast)


Lesenswert?

>m Terminal sehe ich
>dann folgende Ausgabe: abcabcabcabcabcdeabcabcabcabcabcdeab usw.. Daraus
>entnehme ich das er erst beim 4 Durchlauf bis "e" kommt und dann auch
>nicht in der Main Schleife bleibt.

Da deine main-while-Schleife leer ist, und vorher ein 'e' ausgegeben 
wurde, schließe ich, dass die korrekte Ausgabe so aussehen sollte:

abcde

Da es immer wieder von vorn losgeht, bedeutet dass das der µC (ständig) 
resettet.
Da du keine ISR freischaltest, kann es eigentlich nur ein hardware-reset 
sein.

Möglich wäre zB ein brown-out-detect.

Vielleicht ist der Aufbau hardwaremäßig, also im Sinne von EMV und 
Abblockkondensatoren, Spannungsversorgung,... nicht ganz "optimal" ??

von holger (Gast)


Lesenswert?

Richtigen Controller im makefile eingetragen?

von Max (Gast)


Lesenswert?

@Mixer S.
Die for-Schleife gibt den Servos nur zeit die Position zu erreichen.

@holger
Ja, ich arbeite mit Eclipse und dem AVR-Plugin. Alle Einstellungen sind 
korrekt.

@Matthias
Du hatest Recht. Danke!
Habe die Brown-out detection deaktiviert und es läuft. Wass kann ich da 
an der Hardeware ändern um mich in zukunft besser vor sowas zu schützen? 
Reicht da ein 100nF Kondensator zwischen VCC und GND aus?

von Matthias L. (Gast)


Lesenswert?

>Reicht da ein 100nF Kondensator zwischen VCC und GND aus?

Naja, das sollte nur eine Maßnahme sein.

Google mal nach
"emc desgin considerations"
Das ist ne AppNote von Atmel. Lies die dir mal durch. Die gilt für jede 
digitale Schaltung.

Schon lange Zuleitungen und ein schwaches Netzteil reichen da, um 
Probleme zu machen...

von Max (Gast)


Lesenswert?

@Matthias
Ok, werd ich machen.

Danke nochmal an alle für die schnelle Hilfe.

von STK500-Besitzer (Gast)


Angehängte Dateien:

Lesenswert?

Deine Zahlen für OCR stimmen nicht.
1ms OCR=1843
2ms OCR=3686

Ich hänge mal ein ziemlich umfangreiches Programm an, das auch noch 
Multiswitch-Module von futaba auslesen kann...
Es ist zwar für den ATMega162 (scheinbar mein LIeblings-AVR) 
geschrieben, sollte aber Dank der Kommentare leicht änderbar sein.
Die Servos hängen an "normalen" Portpins.

"fosc" und die Registernamen müssten nur deinen Controller angepasst 
werden.

von Max (Gast)


Lesenswert?

Hallo  STK500-Besitzer

Danke für den Code. Ich werd mal schaun ob  das was für mich ist. Hab 
leider seit Dienstag keine Zeit mehr gehabt an dem Programm zu arbeiten. 
Auf jeden Fall Danke für den Code.

von STK500-Besitzer (Gast)


Lesenswert?

>sollte aber Dank der Kommentare leicht änderbar sein.
Die sind wohl irgendwie auf der Strecke geblieben...
Ich finde es aber relativ verständlich (naja, es ist ja auch von 
mir...).

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.