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


von Jan12 (Gast)


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.
1
void PWM_read_start()
2
{
3
  TCCR1B |= (1 << ICNC1); //Rauschunterdrückung
4
  TCCR1B |= (1 << ICES1); //Steigende Flanke
5
  TCCR1B |= (1 << CS12); //256 Prescaler
6
  TIMSK |= (1 << TICIE1); //Input Capture Event aktivieren
7
  TIMSK |= (1 << TOIE1); //Overflow aktivieren
8
}
9
10
double get_timer()
11
{
12
  time_difference = (timer2 - timer1)/312; //um in ms umzurechnen
13
  return time_difference;
14
}
15
16
//////////////////////////////////////////////////////////////////////////
17
ISR (TIMER1_OVF_vect)
18
{
19
  overflow_timer1 = 1; //schaltet später einen LED an
20
}
21
22
ISR (TIMER1_CAPT_vect)
23
{
24
  if(counting)
25
  {
26
    TIFR |= (1 << ICF1); //Flag löschen
27
    TCCR1B &= ~(1 << ICES1); //Fallende Flanke
28
    timer1 = ICR1;
29
    overflow_timer1 = 0; //Led würde dann später wieder ausgeschaltet werden
30
    counting = 0;
31
  }
32
  else
33
  {
34
    TIFR |= (1 << ICF1); //Flag löschen
35
    TCCR1B |= (1 << ICES1); //Fallende Flanke
36
    timer2 = ICR1;
37
    overflow_timer1 = 0;
38
    counting = 1;
39
  
40
  }    
41
  
42
  
43
}

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

von STK500-Besitzer (Gast)


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:
1
//ICP-ISR
2
ISR(TIMER1_CAPT_vect)
3
{
4
  static unsigned int Startpunkt;  // Zeitpunkt der steigenden Flanke
5
  static unsigned int LastDauer = 0;
6
  unsigned int Dauer;        // Pulsdauer
7
  
8
      
9
  if (TCCR1B & (1<<ICES1))
10
  {  // steigende Flanke
11
    Startpunkt = ICR1;
12
13
14
  }
15
  else
16
  {  // fallende Flanke
17
    Dauer = ICR1 - Startpunkt;  // Berechnung der Pulslänge
18
19
    sendintdez(Dauer);              // Ausgabe der Dauer per USART
20
    sendstring(" - ");
21
    sendintdez(LastDauer);         // Ausgabe der vorherigen Dauer per USART
22
    putch(13);  //CR
23
    
24
        }
25
  TCCR1B ^= (1<<ICES1);  // Flankenerkennungsrichtung umkehren
26
}

Wie Du siehst, braucht man die Interruptflanke nicht "manuell" 
zurücksetzen...

von Jan12 (Gast)


Angehängte Dateien:

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.

von Jan12 (Gast)


Lesenswert?

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

von Jan12 (Gast)


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.

von Jan12 (Gast)


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!

von STK500-Besitzer (Gast)


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.

von Max D. (Firma: Hobby) (fmhweb)


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.

von Max D. (Firma: Hobby) (fmhweb)


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.

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.