LED Frequenz mit atmega328 messen

Hallo!

Ich beschäftige mich erst seit kurzem mit Arduino und bräuchte deshalb etwas Hilfe für mein Projekt.

Also, ich würde gerne die Pulsrate bzw. die Frequenz einer gepulsten LED auslesen. Die LED besitzt ca. eine Wellenlänge von 900nm und sendet die Laserimpulse mit einer Frequenz von ca. 100 bis 200Hz aus. Ich möchte nun diese Frequenz mit meinem Arduino Board messen.

Manche LEDs werden mit einer variablen Frequenz gepulst.

Mein Ansatz wäre jetzt, dass ich einfach die Zeit zwischen den Inputs messe, im SerialMonitor ausgeben lasse und mit f=1/T die Frequenz berechne.

Da die variablen Frequenzen auch bis 15 KHz hochgehen können, müsste die Messung schon sehr genau sein.

Für den Anfang hätte ich mir die Anleitung "Infrared receiver modules" von Walter Anderson aufs Board geladen nur tut sich da leider gar nichts.
Script: arduino.cc/playground/Code/InfraredReceivers

Die Photodiode hätte ich mit Plus auf dig.pin 2, minus auf GND. Leider steht in keiner Anleitung wie ich diese Photodiode anschließen muss (ev. mit Widerstand und Kondensator?)

Nun wollte ich überhaupt mal wissen ob ich auf dem richtigen Dampfer bin? Kann man dieses Script für mein Projekt anwenden?

Vielen Dank!!

Also wenn ich Dich richtig verstehe willst Du nicht Daten auslesen sondern eine Pulsrate, also Frequenz ermittlen. Dann wäre doch eher sowas
http://interface.khm.de/index.php/labor/experimente/arduino-frequency-counter-library/
angesagt. Wie genau willst Du tatsächlich messen? +/- 100µs oder genauer? Sobald Du genauer als +/- 100µs werden willst reicht die Genauigkeit des Arduino nur noch bedingt. Es kann sein, daß Dein Quartz genau genug ist, aber ohne exakte Referenz wird das nur schwer festzustellen sein.

Ich würde zuwert einmal versuchen ohne Photodiode auszukommen und stattdessen direkt die Spannung an der LED abgreifen.

Gruß, Udo

Hallo Udo!

Danke für deine Antwort!

Genauer gesagt würde ich gerne die Zeit zwischen den Impulsen messen.

Folgendes Beispiel:
Eine LED bzw. Laser Diode wird mit einer Pulsrate von 100 Hz betrieben, also alle 0,01 Sekunden wird Infrarot Impuls ausgesendet. Die LED hat eine Wellenlänge von ca. 900nm bei einer Pulslänge von ca. 20ns.

Und genau diese 0,01 Sekunden würde ich gerne messen. Die Photodiode wird dann vor die LED gehalten und die Zeitabstände zwischen den ausgesendeten Impulsen gemessen. Eben ähnlich wie beim Auslesen des Codes einer Fernbedienung.

Nun kann es aber auch sein, dass die Pulsrate viel höher liegt (im KHz Bereich) und auch variabel ist. Dann liegt der Zeitabstand zwischen den Impulsen beispielsweise bei 80 Mikro Sekunden (bei 12500Hz).

Ich denke der Befehl pulseIn() müsste hier passen, nur dass ich nicht HIGH sonder LOW messe. Wenn ich die Beschreibung richtig verstanden habe, misst HIGH die Pulselänge (bei mir wären das 20ns, was aber nicht mehr messbar sein wird) und LOW die Zeit zwischen den Impulsen. Es wird zwar dann die Impulslänge nicht mitgemessen, aber ich denke 20ns kann man vernachlässigen.

Wenn im SerialMonitor dann
10000
10000
10000
10000
...
..
ausgebgeben wird beträgt die Pulsrate 100Hz

bei
1052.63
1052.63
1052.63
..
sind es 950Hz

(Daten in Mikro Sekunden, umgerechnet mit f=1/T)

Würde für diese Aufgabe so ein einfacher Coder ausreichen??

int pin = 7;
unsigned long duration;

void setup()
{
  pinMode(pin, INPUT);
  Serial.println("Messbeginn");
}

void loop()
{
  duration = pulseIn(pin, LOW);
  Serial.println(duration);
}

Als Photodiode würde ich eine OSRAM Silizium-PIN-Photodiode mit ähnlichen Spezifikationen von der LED auswählen (Wellenlänge von 800 bis 1100nm, 5ns Schaltzeit)

20nSec Pulsdauer sind teuflisch wenig. Ich würde ein Cmos-Monoflop damit triggern und dadurch den Impuls verlängern. Dazu ist auch zu klären, ob das Monoflop schnell genug ist...
Den verlängerten Impuls kann der Arduino dann verarbeiten.
Grüße Uwe

@Uwe: er will doch gar nicht die Pulsdauer messen. Er will die Abstände zwischen den Pulsen messen. Und er bleibt dabei unter 100kHz, also weniger als 160 Takte pro Puls. Klar schafft das ein Arduino.

@60secods: kommen die Pulse periodisch? Wenn ja wäre es von der Genauigkeit her besser die Pulse zu zählen. Das ist genau das was die Lib tun soll die ich verlinkt habe.

Gruß, Udo

Ja Udo, hab ich schon so verstanden.
Aber bei 20nSec Pulsdauer der High - Pulse schafft es der Arduino den Impuls zu triggern?
Periodendauer von 16MHz Systemtakt sind grade mal 62 nSec!!!
Grüße Uwe

Ah, guter Punkt. Laut Datenblatt muss er das nicht schaffen. Aber das kann man per RC Glied beheben. Da die Leitungskapazitäten sowieso schon im pF Bereicht liegen reicht es vermutlich den Pin mit einem 1M Widerstand anzuschliessen und fertig.

Gruß, Udo

genau das wollt ich sagen
Danke Udo
vergaß Dir zum 100. post zu gratulieren.
Grüße Uwe

Vielen Dank Udo und Uwe für die Antworten!

Die genaue Frequenz kenne ich leider nicht, genau diese möchte ich ja herausfinden. Ich gehe aber vom "Schlimmsten" aus, dass die Pulse nicht periodisch sind.

Mit dem Code werde ich selbst etwas herumspielen.

@Udo
Du meinst also es würde reichen, wenn ich den Minuspol der (Empfangs-)Photodiode auf GND setze und Plus auf einen PIN mit einem 1M Widerstand dazwischen?

Die Pinkapazität liegt bei 10pF; wenn man etwas pessimistisch noch mal das gleiche für die Verdrahtung dazu nimmt, dann steigt ein Signal damit während 20p*1M = ca. 20us an. Dies ist auch die Unschärfe der Flankenerkennung - wenn man da überhaupt von einer Flanke reden mag :slight_smile:

Na bitte, passt perfekt. Der Tiefpass macht die Signale breit genug für den AVR aber ist weit oberhalb von 200Hz.

Udo

Hab ich das richtig verstanden daß die Impulse 20nSekunden lang sind? Bein Euren Beiträgen kommt mit da der Zweifel.

Falls das so ist hilft ein RC-Glied gar nichts, weil es die ansteigende Flanke abflacht SOLANGE das signal HIGH ist; aber nach 20nSek, sobald das Signal wieder weg ist, geht die Spannung wieder Richtung null.
Das Ergibnis des RC-Glieds ist eine kleine Rampe von einigen mV und das wars.

Zum Impulsverlängern braucht man ein Monoflop das SICHER vom 20nSek Impuls getriggert wird.

Grüße Uwe

Mist, da hast Du recht.

Ja, da hat er recht ;D