www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8, 38kHz erzeugen


Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen ATmega8, der über eine IR-LED Daten verschicken soll. 
Diese Daten werden von einem TSOP an einem anderen Mikrocontroller 
empfangen. Meine Frage ist jetzt, wie ich, möglichst sparsam 38kHz für 
die LED erzeugen kann.

Timer2 ist bereits belegt, Timer0 und Timer1 sind noch frei.

Es wäre schön, wenn die Modulationsroutine "von alleine" läuft, ich also 
zwischen Senden/nicht Senden einfach durch Ein-/Ausschalten des Timers 
umschalten könnte. Wenn der Timer selbstständig den Ausgang togglet, 
dann würde das ja nicht einmal Rechenzeit in Anspruch nehmen.

Ich freue mich auf die Lösung von Euch Profis! :-)

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wo ist jetzt die Frage?
Welcher Timer CTC kann und welche Pins er toggeln kann steht im 
Datenblatt.
Wie man ihn programmiert auch.

Wolltest Du jetzt die Init für einen der Timer haben?
Hngt zumindest teilweise davon ab, mit welchen Takt der AVR überhaupt 
läuft...

Gruß aus Berlin
Michael

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da Timer 0 keine PWM kann, bleibt nur Timer 1.
Was hier sinnvoll wäre, ist Modus 14: Damit kann man eine PWM mit frei 
einstellbarer Frequenz erzeugen.
ICR1 wird daher auf F_CPU/38kHz-1 eingestellt. OCR1A auf etwa 1/4 davon 
für 25% Tastverhältnis, was bei IR Übertragungen üblich ist.
Wenn du nun das COM1A1 Bit setzt, ist das 38kHz Signal am OCR1A Ausgang 
zu sehen, wenn du das Bit löschst, wird der normale Portwert an dem 
Ausgang ausgegeben.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Benedikt,

>OCR1A auf etwa 1/4 davon für 25% Tastverhältnis, was für IR Übertragungen >üblich 
ist.

Das Verstehe ich nicht. Müssen High- und Low-Pegel gleich lang sein und 
zwar genau 1/(2 * 38kHz) ?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, üblicherweise wählt man bei Infrarotübertragungen die 
Einschaltzeit deutlich kürzer als die Ausschaltzeit, so dass man den 
entweder Strom spart, oder den Spitzenstrom höher wählen kann, um eine 
höhere Reichweite zu erzielen.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heißt das, dass ich OCR1A auf 256 / 4 setze?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn 256 der passende Wert ist, um die 38kHz zu erreichen, dann ja.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,

irgendwie habe ich noch nicht alles verstanden.

Wenn ich ICR1 auf F_CPU/38000 - 1 setze, muss der Timer dann mit 
Prescaler 1 laufen?

Kannst Du mir vielleicht die Timer-Initialisierungszeilen kurz 
aufschreiben?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anja schrieb:
> Wenn ich ICR1 auf F_CPU/38000 - 1 setze, muss der Timer dann mit
> Prescaler 1 laufen?

Ja.

> Kannst Du mir vielleicht die Timer-Initialisierungszeilen kurz
> aufschreiben?

Schau mal ins Datenblatt unter Mode 14, da siehst du alle Bits die du 
setzen musst.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Belastet ein Timer ohne Prescaler die CPU stärker, als einer, der mit 
Prescaler läuft?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Belastet ein Timer ohne Prescaler die CPU stärker, als einer, der mit
>Prescaler läuft?

Nur, wenn das Programm dann dauernd in eine ISR springt. Dann wird zwar 
immer noch nicht der Controller belastet, aber der Programmablauf wird 
sehr zähflüssig.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke.

Wenn ich jetzt alles richtig verstanden habe, dann müsste folgender 
Code:
TCCR1A |= (1 << WGM12) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << CS10);
ICR1 = 14745600 / 38000 - 1;
OCR1A = (1475600 / 38000 - 1) / 4;

den Pin OC1A (alias PB1) togglen. Und zwar zu 1/3 auf High und 3/4 auf 
Low.

Stimmt das so?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, und wenn du jetzt das COM1A1 Bit setzt, kommt das Signal an OC1A 
raus.

Autor: Holger H. (onifred)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, habe mir auch schon gedanken gemacht.
Werde wohl ein Timer IC 555 zur 38kHz Takt Erzeugung benutzen. Damit 
sind die Timer weiterhin frei für andere Dinge.
Im Internet gibts ein Programm, mit dem man die nötigen Bauteilwerte 
berechnen kann. Muss nur noch sehen wie ich den Takt am besten per 
ATmega ein und ausschalten kann.
Vielleicht ist es auch für dich einen Alternative.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>den Pin OC1A (alias PB1) togglen. Und zwar zu 1/3 auf High und 3/4 auf
>Low.

Wenn du im TCCR1A noch COM1A1 setzt, dann brauchst du dich nicht per 
Hand um das Togglen kümmern.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie klappt es nicht. Hier der komplette Code
TCCR1A |= (1 << WGM12) | (1 << WGM11) | (1 << COM1A1);
TCCR1B |= (1 << WGM13) | (1 << CS10);
ICR1 = 14745600 / 38000 - 1;
OCR1A = (1475600 / 38000 - 1) / 4;

sei(); // habe ich nicht vergessen !

Muss ich den Pin als Ausgang konfigurieren?

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, es funktioniert doch. Allerdings ist die Reichweite sehr bescheiden. 
Meine 5mm-IR-LED betreibe ich ohne Vorwiderstand. Gespeist wird der 
ATmega8L von einer CR2032. Warum ist die Reichweite so gering (10cm)?

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist mein Code:
char i;
while(1)
{
  for (i = 0; i < 20; i++)
  {
    TCCR1A |= (1 << COM1A1);
    _delay_us(500);
    TCCR1A &=~(1 << COM1A1);
    _delay_us(500);
  }
  _delay_ms(10);
}

Der Empfänger schaltet immer, wenn der TSOP auf LOW geht eine LED an. 
Mit einer Fernseher-Fernbedienung ist die Reichweite gigantisch und auf 
die Reflexe von weit entfernten Wänden werden noch wahrgenommen. Mit dem 
µC allerdings erreiche ich gerade mal lächerliche 10cm...

Autor: Markus ---- (mrmccrash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einer "normalen" Fernbedienung wird die LED mitunter auch mit einem 
deutlich höheren Strom gepulst. Ich meine, dort schon mal etwas von bis 
zu 1A gelesen zu haben! Allerdings hast du dort auch gerne 2-3 LEDs in 
parallel.

_.-=: MFG :=-._

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine CR2032 ist etwas schwach. Hast du einen großen Elko dran, der die 
kurzen Stromimpulse puffert? Hast du die LED direkt am AVR? Der kann bei 
3V recht wenig Strom liefern. Rund 100mA Spitzenstrom über einen 
Transistor sollte man der LED schon gönnen.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die LED hängt direkt am Ausgang. Einen 100µF-Kondensator hab ich 
aber dran am µC.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, jetzt hab ichs mal drauf ankommen lassen und hab anstelle der CR2032 
zwei CR2016 genommen. Leider ist die Reichweite nicht wirklich 
gestiegen...

Die Fernbedienung läuft doch auch mit 3V... wie schafft die das?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du den Transistor eingebaut? Passt die LED auch zum Empfänger 
(Wellenlänge) und ist ausreichend gebündelt?
Meine Fernbedienung mit AVR und einer CR2032 geht etwa 5-10m weit.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, Transistor habe ich nicht eingebaut. Wellenlänge passt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon gesagt: Mit mehr Strom! Schau mal ins Datenblatt was die LED 
bei kurzen Impulsen verkraftet und schalte sie mit einem Transistor und 
einem passenden Vorwiderstand.
Portpins des AVRs schaffen nicht viel mehr als 20 mAh und das ist 
definitiv zu wenig. 100 mAh wären für den Anfang nicht schlecht. Evt 
auch mehr wenn du die Impulse noch kürzer machst (dann aber im 
Datenblatt nachsehen ob die LED das mitmacht).

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann baue ich jetzt so einen Transistor ein:

 Vcc o-------------+
                   |
                   _
        IR-Diode   V  ->
                   -  ->
                   |
An: Vcc  _     |/
    o---|___|----|   NPN
Aus: GND         |>
                   |
 GND o-------------+

Doch wie berechne ich den Vorwiderstand für die Basis?

Ich verwende eine SFH4605 und möchte meine Schaltung mit ~5V (2*CR2016) 
betreiben.

Dem Datenblatt entnehme ich, dass die LED bei 5V abraucht...
http://catalog.osram-os.com/catalogue/catalogue.do...

Also wie muss ich den Basiswiderstand dimensionieren?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anja schrieb:

> Doch wie berechne ich den Vorwiderstand für die Basis?

Rund 1k Ohm sind ok. Das ergibt etwa 4mA Basisstrom, was bei einer 
Stromverstärkung von >100 bei den typischen kleinen Transistoren wie 
BC337 ausreichend ist.

> Ich verwende eine SFH4605 und möchte meine Schaltung mit ~5V (2*CR2016)
> betreiben.

Die SFH460x ist sehr gut, die habe ich auch verbaut. Gegenüber einer LED 
aus einer alten Fernbedienung hat sich die Reichweite mehr als 
verdoppelt.

> Dem Datenblatt entnehme ich, dass die LED bei 5V abraucht...

Die LED hält dauerhaft 100mA aus, kurzzeitig 1A.
Da du rund 12% Tastverhältnis in der Sendeschleife verwendest, könntest 
du fast die 1A ausnutzen, so dass der mittlere Strom nur rund 100mA 
beträgt, aber das schafft die Batterie sowieso nicht. Daher würde ich 
den Strom auf 100-200mA auslegen. Etwa 22 Ohm als Vorwiderstand sollten 
rund 100-200mA fließen lassen.

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

Bewertung
0 lesenswert
nicht lesenswert
Als Basiswiderstand dimensionierst du so dass der Transistor etwa den 5 
bis 10-fachen Basisstrom bekommt, der nötig wäre um bei seiner 
Verstärkung den gewünschten Strom zwischen C und E fließen zu lassen.
Beispiel: I_CE=300 mA, Verstärkung=100 -> Basisstrom = 3 mA * 10 = 30 
mA. Bei 3 V macht das 3 V / 30 mA = 100 Ohm.

Schau dir mal das letzte Diagramm von Seite 5 an. Dem kannst du den 
Impulsstrom bei vorgegebenen Pulszeiten und Tastverhältnis entnehmen.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mit Transistor und mehr Strom gehts jetzt wunderbar auch über 5m!
Vielen Dank.

Allerdings ist der 100µF-Tantal jetzt auch bitter nötig: Ohne stürzt der 
µC ab.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.