PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Versuche Servo zu verstehen.



mcnanuk
20.10.2007, 23:59
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#ifndef F_CPU
#define F_CPU 4000000
#endif


int main(void)
{
cli(); //interrupts aus
uint8_t i;
TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0); //9-Bit PWM, Invertierend
TCCR1B = (1<<CS12); //Prescaler 256

DDRD |= (1<<PD7);
PORTD |= ( 1 << PD7 ); //pullup

sei();

while(1)
{



OCR1A = 500;

}

}

Hallo,

nachdem ich heute einige tutorials gemacht habe, und ein LCD an dem STK 500 zum laufen gebracht habe, habe ich mich daran gemacht ein Servo anzuschliessen, und versucht es sich zum bewegen zu ermuntern. Leider ist das einzige was passiert ein müdes zucken, was nicht wirklich dolle ist.

Ich habe ein Atmega 32 mit 4 mhz interner clock, und ein hitec hs-300 standard Servo (Analog, Datenblatt kann ich leider keines finden)
Ich nutze 9 Bit PWM, Invertierend und prescaler 256.

Das Servo hat 0,15 s Stellzeit (Was auch immer das bedeutet)
Der Puls wird mit meinen Einstellungen alle 16,3 ms gesendet.

Ich habe bereits verstanden, dass mein Counter und mein Vergleichswert
OCR1A beeinflussen, wielange ein high anliegt.
Leider verstehe ich nicht, wie ich die Vergleichswerte berechnen. Ich habe einfach mal 500 gewählt, und alles was passiert, ist dass der Servo im Uhrzeigersinn vor sich hinruckelt mit minimalen Bewegungen.
Manchmal bewegt er sich auch gar nicht.

Ich hoffe mir kann jemand weiterhelfen, denn ich habe jetzt schon stunden damit verbracht da rumzuprobieren. :-)

Hubert.G
21.10.2007, 08:48
OC1A ist auf PD5 oder hast du auf PD5 was anderes. Wenn du den Port7 auf Ausgang stellst dann setzt du nicht den PullUp sondern das Port7 auf high.

Meinte auf PD7 was anderes.

Dirk
21.10.2007, 10:35
Hallo mcnanuk,

in diesem Thread ...
https://www.roboternetz.de/phpBB2/viewtopic.php?t=34407
... für den RP6 gibt es einige Varianten, ein Servo in C anzusprechen.

Angefangen von einer vollständig blockierenden Lösung (Impuls wird durch Delays bei gesperrten Interrupts erzeugt) über eine Lösung mit Timer-overflow bis hin zu einer PWM-Lösung ist alles drin.

Da kannst du bestimmt was anpassen!

Gruß Dirk

mcnanuk
21.10.2007, 13:07
@hubert: muss OCR1A auf PD5 sein ? Mein Servo hat doch ein gelbes Kabel, sozusagen das Signalkabel, und das habe ich mittels eines Steckers auf PD7 gelegt ? kann das dann gar nicht funktionieren ?
Woher weiss ich denn sowas, dass OCR1A auf PD5 ist ?

@ Dirk: danke, ich werde mir die ösungen anschauen. Thread ist gebookmarked...

Dirk
21.10.2007, 13:32
Woher weiss ich denn sowas, dass OCR1A auf PD5 ist ?

OC1A! Aus dem Datenblatt deines Prozessors!

Gruß Dirk

oberallgeier
22.10.2007, 10:28
Hi, mcnanuk


...Woher weiss ich denn sowas, dass OCR1A auf PD5 ist ? ...das komplette Datenblatt ist zu haben bei:
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

... und das Blatt mit der Pindefinition ist beispielsweise hier als attmnt. Da siehst Du den OC1A auf Pin 15 ;-)

Hessibaby
23.10.2007, 09:51
Der Steuerimpuls muß alle 20ms wiederholt werden. Die Impulslänge ist 1-2 ms, wobei 1ms maximaler linker Ausschlag, 1,5ms Neutralstellung und 2ms maximaler rechter Ausschlag darstellt.
Wenn Du die 20ms nicht einigermaßen genau einhälst zappelt das Servo rum.
Gruß

oberallgeier
23.10.2007, 16:15
Hi, Ihr,

Der Steuerimpuls muß alle 20ms wiederholt werden. Die Impulslänge ist ... Wenn Du die 20ms nicht einigermaßen genau einhälst zappelt das Servo rum.
Gruß
Servo zappelt beispielsweise auch, wenn die Impulslänge falsch ist, wenn die Versorgungsspannung zu klein ist oder wenn z.B. eine Strombegrenzung (zu kleines Netzteil, zu kleiner Akku oder wie ich es gemacht hatte - blos am tiny-port angeschlossen ](*,) ) den erforderlichen Strom nicht bereitstellt.
Siehe auch meine früheren Probleme (mit zwei kleinen Schaltbildern im Code) unter
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=34751&highlight=
Viele Grüße, viel Erfolg