Signal mehrerer Fotodioden (Lichtintensität) mit µC auswerten (Signalkonditionierung)

Im Unterforum Projekte im Selbstbau - Beschreibung: Selbstbau von Elektronik und Elektro

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 30 9 2024  11:36:27      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Projekte im Selbstbau        Projekte im Selbstbau : Selbstbau von Elektronik und Elektro


Autor
Signal mehrerer Fotodioden (Lichtintensität) mit µC auswerten (Signalkonditionierung)

    







BID = 481049

Lupin III.

Schriftsteller

Beiträge: 616
Wohnort: Salzburg
 

  


Das Problem ist noch immer das gleiche wie in diesem Thread (schalten ohne physikalischen Schalter), jetzt allerdings mit anderem Ansatz. Ich habe zuerst ja mal an einen kapazitiven Schalter gedacht, aber da davon mehrere (zumindest 8 ) auf engem Raum - Größenordnung 10x10 cm - sein sollten und ich bis jetzt noch nichteinmal einen stabil aufbauen konnte, möchte ich jetzt einen anderen Ansatz probieren (der Vorschlag stammt aus dem anderen Thread).

Die Idee ist mit IR-LEDs von der Seite in eine Plexiglasscheibe hineinzuleuchten, sodass das die IR Strahlung total reflektiert wird und nicht austreten kann. Unter der Platte sind an verschiedenen Stellen Fotodioden. Drückt man nun mit dem Finger auf die Scheibe, wird an der Stelle die Totalreflexion gestört und die Strahlung kann auf der anderen Scheibenseite austreten. Ist dort eine Fotodiode, "sieht" diese ein Signal (ich habe mir extra eine billige Webcam auf IR umgebaut, um das sichtbar zu machen; es gibt tatsächlich sehr deutliche Flecken).

Die Stärke des Signals ist dazu noch abhängig von der Entfernung des Druckpunkts von der Fotodiode. (aus zwei Fotodioden könnte damit eine Art optisches Poti werden).


Mein Frage ist jetzt: was ist die beste Methode die Intensität in einen Zahlenwert im µC (AVR) umzuwandeln?

Mein Ansatz ist der Versuch unten (und ich bin gar nicht böse, wenn er total umgekrempelt wird). Die Schaltung wird nur einmal aufgebaut und die einzelnen Fotodioden nacheinander ausgewählt (+5V an "SELECT Dx"; bis jetzt habe ich nur mit einer einzigen getestet; gibt's einen Demultiplexer der die anderen Ausgänge auf "High Impedance "schaltet?). Die Fotodiode bekommt dabei 1V in Sperrichtung ab (mehr geht sich bei 5V nicht aus ohne das Ausgangssignal zu stark einzuschränken), am Ausgang des ersten Opamps liegt dann eine dem Fotostrom entsprechende Spannung an. Der zweite Opamp ist ein Impedanzwandler.

Für eine Messung wir der Kondensator C2 über den Transistor voll geladen. Sobald der Transistor geschlossen ist, entlädt sich C2 je nach der Ausgangsspannung am zweiten Opamp unterschiedlich schnell.

Was mir daran nicht gefällt: ich habe die gewöhnliche exponentielle Entladekurve, möchte aber gerne eine Gerade. Ich weiß allerdings nicht, wie ich einen zum Fotostrom proportionalen Entladestrom für den Kondensator hinbekomme.

Außerdem stellt sich noch die Frage, wie ich die Spannung am Kondensator am besten auswerte. Der ADC des µC braucht relativ lange und wenn ich mehrere Fotodioden mehrere Male pro Sekunde auslesen möchte geht sich das möglicherweise nicht aus. Die andere Möglichkeit wäre die Spannung mittels Komparator zu vergleichen und sobald ein bestimmter Wert unterschritten ist einen Interrupt auszulösen (ein Timer gibt mir dann die Wartezeit an). Das Problem dabei: im Dunkelfall wird der Kondensator nie unter 4 V entladen werden, die Schwelle müsste also sogar noch darüber liegen. Das wird wahrscheinlich sehr ungenau.

Ich danke normalerweise nicht schon im ersten Post für die Antworten, aber wer es bis hierher geschafft hat, bekommt schon mal vielen Dank und hat hoffentlich auch noch Zeit mir Tipps zu geben (oder gleich einen neuen Vorschlag machen ;-).



BID = 481251

teotihuacan

Gesprächig



Beiträge: 170
Wohnort: Winterlingen
ICQ Status  

 

  

Wenn du bei den Fotodioden nur zwischen "Keine Berührung" und "Berührung" also zwischen nicht beleuchtet und beleuchtet unterscheiden willst, dann reicht ein Widerstand in Reihe zur Fotodiode und das Ganze geht dann auf einen Schmitt-Trigger. Die Empfindlichkeit lässt sich dann bequem per Widerstandswert einstellen und die Schaltung ist relativ kompakt. Damit kannst dann auch direkt auf einen digitalen Eingang des µCs gehen. Wie ich im anderen Thread schon gemeint habe, kann man den Rest programmieren, also dass der µC die Zeit des Impulses misst und dementsprechend ein digitales Ausgangssignal ausgibt, das dann wiederum auf einen DA-Konverter geht und damit die Helligkeit einstellt.
Der Vorteil wäre hier, dass die Schaltung sich hardwaremäßig in Grenzen hält, den Programmteil der Zeitmessung kann man einfach kopieren, es entfällt also jeglicher Demux. Außerdem kann der µC so mehrere Signale gleichzeitig verarbeiten statt nur das eine, das vom Demux ausgewählt wird.

BID = 481262

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo,

ich habe mit einem AVR schon ca. 50ksamples/s geschafft (mit anschließender Datenverarbeitung versteht sich)
Der Trick liegt dabei in der Reduzierung der Auflösung auf 8 Bit und die Genauigkeit ist dann etwas geringer. Ein Impedanzwandler ist schonmal nicht verkehrt.

Du kannst die Dioden in einer Matrix anordnen, per ADC-Muxer dann jeweils eine Diode anwählen, den Wert sampleln und mit dem vorherigen Vergleichen. Der Vergleich sollte nicht auf Gleichheit, sondern auf größere Unterschiede (also nicht nur 1 sondern 2-3 Bits) stattfinden.

Dieser Prozessor wäre dann zwar gut ausgelastet, aber es ist sowieso nicht unüblich, für die Bedienungseinheit eines Gerätes einen gesonderten Kontroller zu nutzen. So machen das namhafte Hersteller und so habe ich es auch öfters gemacht.

Die Daten werden dann mit einem frei wählbaren Protokoll und auf Hardwareebene per I²C oder SPI oder ähnlich zum Master verschickt.

Läuft tadellos und der Hauptprozessor wird nicht mit Polling o.ä. belastet. Wenn was auf der Bedienungseinheit geschieht wird ein IRQ gesendet und sobald der Master kann, holt er sich die Daten in der Empfangseinheit ab.

_________________

BID = 481291

Lupin III.

Schriftsteller

Beiträge: 616
Wohnort: Salzburg


Zitat :

ich habe mit einem AVR schon ca. 50ksamples/s geschafft (mit anschließender Datenverarbeitung versteht sich)
Der Trick liegt dabei in der Reduzierung der Auflösung auf 8 Bit und die Genauigkeit ist dann etwas geringer. Ein Impedanzwandler ist schonmal nicht verkehrt.


Hast du noch einen Plan der Schaltung davor? Der Analogteil ist das was mir am meisten Schwierigkeiten macht. Ich weiß noch nicht, wie ich ein verlässliches Signal bekomme bzw. mit mit welcher Methode ich es am besten auswerte. Auf den Kondensator bin ich z. B. vor allem deswegen gekommen, weil ich dadurch per Komparator einen Interrupt erzeugen könnte und der µC bis dorthin anderes tun kann.

BID = 481303

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Moin, "Plan" ist übertrieben.
Das Layout ist bei meinem Umstieg von Windows zu Linux leider flöten gegangen. War alles sehr klein.

Es ging um Audiosignale, die digitalisiert wurden.

Ein Teil habe ich mal hier aufgeschrieben. Ein Timer wird so initialisiert, dass bei jedem Positiven Vergleich ein Interrupt ausgelöst wird. In diesem wird dann der Wert eingelesen und weiterverarbeitet. Dieser Teil dürfte uninteressant sein, da er auf mein Problem zugeschnitten ist. Es wurde abwechseln immer zwei Kanäle (ADC0 und ADC1) gesampelt.


Code :


;Interrupt-Vektorenliste
.org RESETaddr rjmp INT_reset ; Reset Interrupt Vector
.org INT0addr reti ; External Interrupt 0
.org INT1addr reti ; External Interrupt 1
.org OC2addr rjmp INT_timer ; Timer/Counter2 Compare Match
.org OVF2addr reti ; Timer/Counter2 Overflow
.org ICP1addr reti ; Timer/Counter1 Capture Event
.org OC1Aaddr reti ; Timer/Counter1 Compare Match A
.org OC1Baddr reti ; Timer/Counter1 Compare Match B
.org OVF1addr reti ; Timer/Counter1 Overflow
.org OVF0addr reti ; Timer/Counter0 Overflow
.org SPIaddr reti ; SPI Serial Transfer Complete
.org URXCaddr reti ; USART, RX Complete
.org UDREaddr reti ; USART Data Register Empty
.org UTXCaddr reti ; USART, TX Complete
.org ADCCaddr reti ; ADC Conversion Complete
.org ERDYaddr reti ; EEPROM Ready
.org ACIaddr reti ; Analog Comparator
.org TWIaddr rjmp INT_I2C ; Two-wire Serial Interface
.org INT2addr reti ; External Interrupt Request 2
.org OC0addr reti ; TimerCounter0 Compare Match
.org SPMRaddr reti ; Store Program Memory Read

;Hauptprogramm
INT_reset:
;Stackpointer initialisieren
ldi ar1, LOW (RAMEND)
ldi ar2, HIGH(RAMEND)
out SPL, ar1
out SPH, ar2

;Standard-Werte laden
ldi ar1, low (tabelle_balkenmodus*2) ;Standard: Balkenmodus
ldi ar2, high(tabelle_balkenmodus*2)
sts var_mode_l, ar1
sts var_mode_h, ar2
ldi ar1, low (tabelle_exponentiell_normal*2) ;Standard: Exponentiell
ldi ar2, high(tabelle_exponentiell_normal*2)
sts var_func_l, ar1
sts var_func_h, ar2
ldi ar1, low (0x00FF) ;Standard: Verzögerungswert 0x00FF
ldi ar2, high(0x00FF)
sts var_delay_l,ar1
sts var_delay_h,ar2

;Timer einstellen - Frequenz: 50kHz, 20µs Periodendauer; OCR=39, Vorteiler: 8; CTC-Modus, IRQ an
ldi ar1, 1<<WGM21|0<<WGM20|2<<CS20
out TCCR2, ar1
ldi ar1, 39
out OCR2, ar1
in ar1, TIMSK
ori ar1, 1<<OCIE2
out TIMSK, ar1

;Analog-Digital-Wandler konfigurieren - Linksausgerichtet, Referenzspannung intern 2.56V; Vorteiler=2
ldi ar1, 1<<REFS0|1<<REFS1|1<<ADLAR|0<<MUX0
out ADMUX, ar1
ldi ar1, 1<<ADEN|4<<0
out ADCSRA, ar1



Du musst eben das Programm sehr genau aufs Problem zuschneiden. Das sollte aber machbar sein.
Jetzt musst du nur noch überlegen, wie du die Fotodioden betreiben kannst.

Edit:
Taktfrequenz sind 16MHz und das ist nur ein Auszug.
Weiß grad nicht, ob das exakt 50kHz bringen, aber in der Größenordnung auf jeden Fall.

_________________


[ Diese Nachricht wurde geändert von: DonComi am 13 Dez 2007 23:32 ]

BID = 481306

Lupin III.

Schriftsteller

Beiträge: 616
Wohnort: Salzburg

Der Programmteil ist mir eigentlich klar. Die Frage ist an welcher Stelle ich das Signal abgreife und ob der Aufbau wie ich ihn aufgezeichnet habe überhaupt sinnvoll ist? Oder vielleicht gibt es doch einen besseren Weg? Inzwischen kommt mir nämlich grade der Transistor und Kondensator am Ende ziemlich sinnlos vor.

BID = 481577

DrZoidberg

Stammposter

Beiträge: 277

Das mit dem Laden eines Kondensators klingt mir auch nach einem Umweg.
Ich würde einfach einen Timerinterrupt benutzen und dann halt 1000 mal pro Sekunde sämtliche Photodioden per ADC messen. Also Photodiode in Reihe mit einem Widerstand und mit ADC Spannungsabfall überm Widerstand messen.
Oder nimm 2 verschiedene uCs. Dann kann einer ständig messen ohne irgendwelche Interrupts. Läuft dann halt einfach in ner Endlosschleife und "weckt" den zweiten bei Bedarf.
Und natürlich sollte die IR Lichtquelle nicht konstant sein, sondern mit einer bestimmten Frequenz moduliert werden, damit die Elektronik es vom Umgebungslicht unterscheiden kann.

BID = 481779

Lupin III.

Schriftsteller

Beiträge: 616
Wohnort: Salzburg


Zitat :
Das mit dem Laden eines Kondensators klingt mir auch nach einem Umweg.


Ich weiß zumindest ungefähr wieder, wieso ich damit angefangen habe: Ich bin irgendwie bei meinen Berechnungen (CPU-Clock, ADC-Clock und -Samplerate, Anzahl Fotodioden, Messungen pro Diode pro Wert) auf eine Anzahl von Abtastungen pro Sekunde gekommen, der mir zu niedrig war (ich wollte genug Spielraum, falls ich mal auf die Idee komme, noch mehr Dioden zu verwenden). Mit Kondensator, Komparator und externem Interrupt wäre ich da drum herumgekommen. Ich muss an dem Tag aber irgendwo die ganze Zeit einen Denkfehler dringehabt haben, denn jetzt geht sich's auch ohne aus (zumindest wenn man 500 Abtastungen pro Sek. als genug ansieht).



Zitat :
Und natürlich sollte die IR Lichtquelle nicht konstant sein, sondern mit einer bestimmten Frequenz moduliert werden, damit die Elektronik es vom Umgebungslicht unterscheiden kann.


Ist das in Software möglich? Bis jetzt habe ich mir überlegt, jede Fotodiode einmal mit und einmal ohne IR-"Beleuchtung" auszulesen und die beiden Werte zu vergleichen. Aber da ist auch schon ohne Finger drüber ein Unterschied (die Reflexion ist eben nicht ganz total), dessen Betrag nochdazu vom Umgebungslicht abhängt.

BID = 482079

DrZoidberg

Stammposter

Beiträge: 277

Die Helligkeit einmal mit und einmal ohne Beleuchtung auszulesen scheint mir eine gute Lösung. Es bringt wahrscheinlich keinen Vorteil, das IR Licht stattdessen mit einer hohen Frequenz zu modulieren.
Natürlich hast du auch ohne den Finger drüber schon nen Unterschied, aber der sollte eigentlich viel kleiner sein als der Unterschied mit Finger.
Vielleicht hilft es was, wenn du über die Photodiode ein kleines Rohr stülpst, so dass nur Licht gemessen wird, das direkt von oben kommt.

Ausserdem könntest du messen, wie groß der Unterschied bei verschieden hellem Umgebungslicht jeweils ist. Du stellst dann eine Messreihe auf. Das Ziel ist es eine Liste von Faktoren zu ermitteln, die du im uC speichern kannst.
Das sieht dann z.B. so aus:

Messwert ohne | Faktor
IR Beleuchtung |
----------------------------
1V | 1
2V | 1,1
10V | 1,5
usw.

Und die Differenz zwischen dem Messwet mit IR Beleuchtung und dem Messwert ohne Beleuchtung multipliziert der uC dann mit dem Faktor, um so unabhängig vom Umgebungslicht bei gleicher Position des Fingers immer den gleichen Wert zu erhalten.

[ Diese Nachricht wurde geändert von: DrZoidberg am 16 Dez 2007 21:44 ]


Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 18 Beiträge im Durchschnitt pro Tag       heute wurden bisher 2 Beiträge verfasst
© x sparkkelsputz        Besucher : 182099596   Heute : 1875    Gestern : 6149    Online : 558        30.9.2024    11:36
5 Besucher in den letzten 60 Sekunden        alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0631060600281