www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anschluss von RC Empfänger an ATMega32


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Jan12 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

Autor: STK500-Besitzer (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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...

Autor: Jan12 (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Jan12 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Und danke schonmal für den Programmvorschlag, werde ich gleich mal 
ausprobieren. War mein Programm denn im direkten Vergleich irgendwo 
falsch?

Autor: Jan12 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Jan12 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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!

Autor: STK500-Besitzer (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Max Durst (Firma: Hobby) (fmhweb)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Max Durst (Firma: Hobby) (fmhweb)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net