Datum:
Hallo, ich möchte gerne ein PWM Signal 50kHZ 1-2ms mit einem ATMega32 auslesen. Mein Programm ist meiner Meinung nach ok, ich zweifle eher daran, wie ich den RC-Empfänger an den ATMega angeschlossen habe. Der Empfänger und der Atmega werden von verschiedenen Spannungsquellen betrieben. Jetzt habe ich GND des Empfängers mit GND des Controllers verbunden. Das PWM Signal habe ich an PD6 (ICP PIN) gelegt, um die Input Capture Funktion von Timer 1 nutzen zu können. Das rote Kabel (Plus) ist nicht weiter verbunden, hat also keine Verbindung zum Controller. Ist das soweit einigermaßen richtig? Hier nocheinmal der wesentliche Teil meines Programms. Bei mir tritt leider immer ein Overflow ein und die entsprechende LED auf meiner Platine leuchtet auf.
void PWM_read_start() { TCCR1B |= (1 << ICNC1); //Rauschunterdrückung TCCR1B |= (1 << ICES1); //Steigende Flanke TCCR1B |= (1 << CS12); //256 Prescaler TIMSK |= (1 << TICIE1); //Input Capture Event aktivieren TIMSK |= (1 << TOIE1); //Overflow aktivieren } double get_timer() { time_difference = (timer2 - timer1)/312; //um in ms umzurechnen return time_difference; } ////////////////////////////////////////////////////////////////////////// ISR (TIMER1_OVF_vect) { overflow_timer1 = 1; //schaltet später einen LED an } ISR (TIMER1_CAPT_vect) { if(counting) { TIFR |= (1 << ICF1); //Flag löschen TCCR1B &= ~(1 << ICES1); //Fallende Flanke timer1 = ICR1; overflow_timer1 = 0; //Led würde dann später wieder ausgeschaltet werden counting = 0; } else { TIFR |= (1 << ICF1); //Flag löschen TCCR1B |= (1 << ICES1); //Fallende Flanke timer2 = ICR1; overflow_timer1 = 0; counting = 1; } } |
Wie gesagt, das Programm würde ich als ok bewerten, bin mir aber nicht sicher. Hoffentlich gibt es eine einfache Lösung und ich stolper einfach nicht drüber. Viele Grüße
Datum:
Die Funktion des Empfängers kannst du ja ganz einfach überprüfen, indem du ein Servo o.dergl daran anschließt. Ich mache das so:
//ICP-ISR ISR(TIMER1_CAPT_vect) { static unsigned int Startpunkt; // Zeitpunkt der steigenden Flanke static unsigned int LastDauer = 0; unsigned int Dauer; // Pulsdauer if (TCCR1B & (1<<ICES1)) { // steigende Flanke Startpunkt = ICR1; } else { // fallende Flanke Dauer = ICR1 - Startpunkt; // Berechnung der Pulslänge sendintdez(Dauer); // Ausgabe der Dauer per USART sendstring(" - "); sendintdez(LastDauer); // Ausgabe der vorherigen Dauer per USART putch(13); //CR } TCCR1B ^= (1<<ICES1); // Flankenerkennungsrichtung umkehren } |
Wie Du siehst, braucht man die Interruptflanke nicht "manuell" zurücksetzen...
Datum:
Angehängte Dateien:STK500-Besitzer schrieb: > Die Funktion des Empfängers kannst du ja ganz einfach überprüfen, indem > du ein Servo o.dergl daran anschließt. Die Elektronik, also Empfänger, Fahrtenregler usw. sind in meinem Modellwagen verbaut und funktionieren alle einwandfrei. Ich habe eine Platine mit 2 3-Pin Steckern. Auf den einen kommt der Ausgang des Empfängers und auf den anderen das Servo. Beide Stecker sind direkt miteinander verbunden. Dazwischen "zapft" sich der Controller dann das Signal ab. Ist das vll. der Fehler? Sollte ich lieber einen Y-Adaper vom Empfänger zum Servo und zum Controller verwenden, statt meiner jetzigen "Durchlauf"-Lösung? Mir ist auch aufgefallen, das das Servo, wenn meine Platine zwischengeschaltet ist, nicht mehr reagiert. Wenn es direkt angeschlossen ist aber sehr wohl. Im Anhang nochmal ein kurzer Schaltplan, wie meine Stecker an den ATMega angeschlossen sind. Das ist aber wirklich nur ein Ausschnitt und kein kompletter Plan. Der Rest ist aber korrekt angeschlossen.
Datum:
Und danke schonmal für den Programmvorschlag, werde ich gleich mal ausprobieren. War mein Programm denn im direkten Vergleich irgendwo falsch?
Datum:
Hab deinen Programmcode mal probiert bei mir einzubauen. Leider gibt es auch hier keinen Unterschied. Was ich aber feststellen konnte ist, dass beim Ein- und Ausstecken des Empfängers von meiner Platine einmalig Werte von 14ms und mehr auf meinem Display angezeigt werden. Es muss also irgendwas mit meiner Verbindung zum Empfänger falsch sein. Das Programm geht also. Kann mir einer sagen, wie ich den Empfänger richtig an meinen Controller anschließen muss? Wichtig ist, dass der Empfänger von einem Fahrtenregler gespeist wird, der wiederum von einem externen Akku. Es gibt also zwei verschiedene Spannungsquellen. Und muss PD6 (ICP-Pin) eigentlich als Aus- oder Eingang deklariert werden? Meiner ist aktuell ein Eingang und alle anderen PORTD Pins Ausgang, die einen LCD ansteuern, was auch wunderbar klappt. Vielen Dank schonmal.
Datum:
Ich habe leider übersehen, dass ich PD6 zwischendurch zufällig einmal auf High gesetzt habe und als Ausgang deklariert habe. Habe ich geändert und jetzt geht alles. Totzdem Danke!
Datum:
Jan12 schrieb: > Und muss PD6 (ICP-Pin) eigentlich als Aus- oder Eingang deklariert > werden? Meiner ist aktuell ein Eingang und alle anderen PORTD Pins > Ausgang, die einen LCD ansteuern, was auch wunderbar klappt. Als Eingang und der Pullup sollte auch eingeschaltet sein.
Datum:
Hallo, da ich zufällig eine ähnliche Sache vorhabe muss ich ja keinen neuen Beitrag erstellen. Auch mit einem ATMeag32. Ich würde gerne eine 3-Kanal Empfänger (50KHz) auswerten und ein Ultraschall Modul (Projet USM-18A - 40KHz). Kann ein Schieberegister, z.B. 74HC575, mit der Frequenz von 50KHz umgehen? Ist die Lösung mit einem Schieberegister überhaupt sinnvoll um mehrere Signale auszuwerten, oder macht man so etwas über Software? Ich finde immer nur Beiträge und Seiten wo nur ein Signal ausgewertet wird. Evtl. suche ich auch falsch. Im Datenblatt des 74HC575 steht fmax = 59MHz. Auf was bezieht sich das? Habe leider keine Ahnung von Elektronik und noch sehr wenig Erfahrung. Ich setze in der Regel fertige Module ein.
Datum:
Das mit dem Schieberegister hat sich schon wieder erledigt. Bin gerade auf den Begriff PPM aufmerksam geworden und das die Signale hintereinander ausgegeben werden. Ich dachte das passiert simultan. Den Ultraschallsensor schließe ich einfach an einem Interrupt Pin an.
