Hallo zusammen,
ich bin gerade dabei eine Servosteuerung über pwm mit einem Atmega32 (8
Mhz)zu programmieren.
Dabei soll der servo ein paar Sekunden in einer position stehen und dann
in eine andere Position drehen (Lenkung: von links nach rechts).
Dabei bereitet mir genau diese Wartezeit Probleme. Und zwar ist Timer 2
(8-bit-timer) für das pwm signal zuständig und für die Wartezeit möchte
ich Timer 1 (16 Bit-timer) verwenden.
Dafür habe ich mir folgendes überlegt: als Prescaler wähle ich 1024
---> 8 Mhz/1024 = 7812,5 Hz
---> 65534 / 7812,5 = 8,39 Sekunden, d.h. der Timer benötigt 8,39
Sekunden für einen Durchgang und 4,2 sekunden um bis 32767 zu zählen.
Diese 4,2 Sekunden passen sehr gut für meine Verweilzeit des Servos in
einer Position.
Also dachte ich mir ich programmiere zwei if-Entscheidungen um diese
beiden zustände (Timer <32767 bzw. > 32767) abzufragen und ordne die
jeweils gewünschten Sensorpositionen zu.
Hier der Quelltext:
//Timer 1 für Wartezeit, Initialisierung
void timer_warte_initial (void) {
TCCR1A = 0x00; //Normal Mode, Prescaler 1024
TCCR1B = 0x05;
TCNT1 = 0x0000; //Startwert 0
}
//Initialisierung des Timer 2 für PWM-Lenkung (Lenkservo)
void timer2_initial(void) {
TCCR2 = 0x73; //Mode 1, Signale invertieren,Prescaler 64
DDRD |= (1<<PD7); //OC2 (Pin 21) als PWM-Ausgang setzen
}
int main(void) {
timer_warte_initial();
timer2_initial ();
if ( TCNT1 < 0x7FFF) // Grenzwert:32767
OCR2 = 0xC4; //Servoposition ganz rechts
if (TCNT1 > 0x7FFF)
OCR2 = 0x71; //Servoposition ganz links
}
DasProblem ist, das OCR2 immer auf 0xC4 bleibt und auch bei
überschreiten des Grenzwertes (TCNT1>0x7FFF) nicht auf 0x71 umschaltet.
Und ich habe keine Ahnung warum er das nicht macht.
DieSensorpositionen stimmen alle, nacheinander angesteuert funktionieren
die Werte einwandfrei.
Hat hier jemand Vorschläge, warum es nicht funktioniert? Oder auch
generell für Tipps die Wartezeit zu realisieren bin ich dankbar. mit
delay möchte ich das nicht machen, da der Controller noch einen zweiten
servo steuern muss, und ich ihn deswegen nicht blockieren möchte.
Vielen Dank für alle Tipps/Hinweise, ich hoffe mein Problem ist klar
geworden.Wenn nicht, beantworte ich gerne alle auftretenden Fragen.
Herzliche Grüße,
Gregor
Gregor007 schrieb: > Und ich habe keine Ahnung warum er das nicht macht. Weil du die ganze Abfrage nur ein einziges Mal machst -- danach schickst du den Controller in die ewigen Jagdgründe, ähem, in die Funktion exit() (wird implizit beim Verlassen von main() aufgerufen). Mit anderen Worten: dein Programm braucht eine Hauptschleife. p.s.: bitte benutze die Formatierungskennzeichen, siehe auch Formatierung im Forum
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.