Hallo,
ich möchte die Intensität von zwei hintereinander getakteten
Leuchtdioden messen. Im Anhang habe ich mal die Spannungsverläufe dazu
gemessen.
Kanal 1: Spannung über die beiden Leuchtdioden (sie leuchten abwechselnd
mit Dunkelphase, Leuchtdioden sind antiparallel geschaltet)
Kanal 2: Fotodiode 1 (mit Verstärker dazwischen)
Kanal 3: Fotodiode 2 (mit Verstärker dazwischen)
Ich möchte mit den gemessenen Intensitäten noch ein paar Berechnungen
durchführen, deshalb zwei unterschiedliche Fotodioden.
Ich habe die beiden Fotodioden an jeweils einen ADC des XMega128A1
angeschlossen. Ich kann auch schon prima die Messwerte am ADC auslesen.
Mein problem ist jedoch das Timing. Ich möchte, dass für jede
Leuchtdiode extra etwa 5 Messwerte aufnehmen. Dazu habe ich mir gedacht,
dass ich steigende und fallende Flanken erkenne und die beiden
Leuchtdioden so voneinander trenne. Meine Frage ist jetzt, kann der ADC
diese Flanken erkennen und einen Interrupt auslösen oder gilt das nur
für high und low Level? Wenn der ADC diese Flanken nicht erkennt, wie
kann ich das ganze System sonst noch triggern?
Vielen Dank schonmal im Vorraus!
Hendrik
Hallo Hendrik,
mir fällt dazu nur ein, laufend messen und die Messwerte je Kanal in
einem (Ring-)Puffer schreiben. Ein weiterer Prozess verarbeitet
(analysiert) diese Messwerte und detektiert auf eine "Flanke". Daraus
generierst Du dann ein Event / Tigger, der vom HP (main()) verarbeitet
wird.
Hendrik E. schrieb:> Meine Frage ist jetzt, kann der ADC diese Flanken erkennen und einen> Interrupt auslösen oder gilt das nur für high und low Level?
Der ADC ist strohdoof und kann überhaupt nichts erkennen. Der kann
einfach nur auf Befehl die analog anliegende Spannung in einen
Digitalwert umwandeln. Das steht aber auch im Datenblatt.
Du kannst das Signal deiner Photodiode aber mit einem Hochpaß
differenzieren, in ein Digitalsignal umwandeln und mit den Peaks bei
schnellem Helligkeitswechsel einen Interrupt auslösen.
Uwe S. schrieb:> mir fällt dazu nur ein, laufend messen und die Messwerte je Kanal in> einem (Ring-)Puffer schreiben. Ein weiterer Prozess verarbeitet> (analysiert) diese Messwerte und detektiert auf eine "Flanke".
Aber wie detektiere ich in dem Ringbuffer die Flanke?
Ich möchte außerdem mit den Flanken zeitgleich ein Signal wieder
ausgeben, wenn ich es aber mit Ringbuffer mache, dann ist es auf jeden
Fall "zeitverzögerter" als mit direkten Interrupt.
Michael schrieb:> Der ADC ist strohdoof und kann überhaupt nichts erkennen. Der kann> einfach nur auf Befehl die analog anliegende Spannung in einen> Digitalwert umwandeln. Das steht aber auch im Datenblatt.
Ja der ADC selber nicht, war vielleicht etwas falsch von mir formuliert.
Aber an dem Pin selber kann man doch Flanken erkennen oder?
Michael schrieb:> Du kannst das Signal deiner Photodiode aber mit einem Hochpaß> differenzieren, in ein Digitalsignal umwandeln und mit den Peaks bei> schnellem Helligkeitswechsel einen Interrupt auslösen.
Differenzieren und ein Hochpass würden meinen Messwert ja leider
verändern, den ich ja benötige. Das einzige was mir noch fehlt sind ja
eben die Zeitpunkte.
Hallo Hendrik,
warum benutzt du nicht einen I/O pin und lässt dir einen Interrupt/Event
generieren, was die ADC-Conversion triggert. Alternativ könnte man auch
den Analogcomparator verwenden um ein Interrupt/Event zu generieren.
Viele Grüße
Hi
Abgesehen davon, das du diese Frage auch an andere Foren stellst, hier
mal meine Antwort
Welche Flanke soll der ADC erkennen. Er liest "analog"-Signale.
Natürlich kannst du über den Vergleich alter Wert-> neuer Wert erkennen,
ob das Signal steigt oder fällt. Mir scheint aber, du vermischt da
Analogeingang mit Digitaleingang. Die interruptfähigen Eingänge
(digital) sind so parametrierbar, das sie auf steigende oder fallende
Flanken reagieren. Wo ist bei einem Analogwert der Punkt, wo er auf eine
Flanke reagieren soll....
Da wirst du schon selbst tätig werden müssen.
Gruß oldmax
Hendrik E. schrieb:> Differenzieren und ein Hochpass würden meinen Messwert ja leider> verändern, den ich ja benötige. Das einzige was mir noch fehlt sind ja> eben die Zeitpunkte.
Das Differenzieren liefert dir gerade die Umschaltzeitpunkte als
Flanken. Damit kannst du also deinen Interrupt auslösen und dann mit dem
ADC den Pegel bestimmen. Wegen der Zeitkonstanten, die in deinen
Signalen zu sehen sind, kannst du die Helligkeit sowieso nicht direkt
nach der Flanke bestimmen.
oldmax schrieb:> warum benutzt du nicht einen I/O pin und lässt dir einen Interrupt/Event>> generieren, was die ADC-Conversion triggert. Alternativ könnte man auch>> den Analogcomparator verwenden um ein Interrupt/Event zu generieren.
Erkennt der IO Pin die Flanken nur ab einen bestimmten Schwellwert?
Die Möglichkeit mit dem Komparator werde ich nachher mal ausprobieren
und mit durch den Kopf gehen lassen.
oldmax schrieb:> Welche Flanke soll der ADC erkennen. Er liest "analog"-Signale.>> Natürlich kannst du über den Vergleich alter Wert-> neuer Wert erkennen,>> ob das Signal steigt oder fällt. Mir scheint aber, du vermischt da>> Analogeingang mit Digitaleingang. Die interruptfähigen Eingänge>> (digital) sind so parametrierbar, das sie auf steigende oder fallende>> Flanken reagieren. Wo ist bei einem Analogwert der Punkt, wo er auf eine>> Flanke reagieren soll....
Ich hätte es gerne so wie bei einem Oszilloskop, welches auch Flanken
detektieren kann. Leider muss man da ja auch einen Schwellwert angeben.
Michael schrieb:> Das Differenzieren liefert dir gerade die Umschaltzeitpunkte als>> Flanken. Damit kannst du also deinen Interrupt auslösen und dann mit dem>> ADC den Pegel bestimmen. Wegen der Zeitkonstanten, die in deinen>> Signalen zu sehen sind, kannst du die Helligkeit sowieso nicht direkt>> nach der Flanke bestimmen.
Die Zeitkonstanten sind noch so hoch, weil ich keine kleineren
Kondensatoren habe. Die sind aber bestellt.
Ansich hast du aber recht ich muss auf das Plataeu warten und dann
messen, aber ich benötige die Flanken noch als Trigger für etwas
anderes.
Ich habe jetzt den Ansatz mit dem Komparator verfolgt.
Ich habe mir gedacht der Komparator löst jedes mal einen Interrupt aus,
wenn die eine LED mehr Strom liefert als die andere.
Ich habe in einem ersten Versuch probiert den Komparator über die
gleichen Pins laufen zu lassen wie den ADC.
Dabei habe ich festgestellt, dass es aufgrund des Multiplexers nicht
geht.
Jetzt habe ich die beiden Spannungen jeweils einmal zum ADC des Port A
und zum AC des Port B geführt.
1. Ich habe folgende Initialisierung des Ganzen und der Interrupt wird
einfach nicht ausgelöst. Eine Anzeige des Komparatorergebnisses über
PIN0 kommt auch nicht zustande. Ich habe die Atmel Library zum AC
verwendet.
1
voidTrigger_init(){
2
/* Enable Analog comparator submodule 0. */
3
AC_Enable(&AC,ANALOG_COMPARATOR0,false);
4
5
/* By defalut the Analog comparators interupt flag triggers on changes on
6
* both edges. If another trigger setting (INTMODE) is preferd use the
7
* AC_ConfigInterrupt function to change the settings. */
2. Mein ADC zeigt schon relativ hohe Werte an, obwohl keine Spannung
anliegt. Liegt es daran, dass der AC von Port B mit den ADC von Port A
sozusagen kurzgeschlossen ist? Was kann ich dagegen tun? Sobald der
Transimpedanzverstärker angeschlossen ist geschieht dies nichtmehr.
Problem ist gelöst.
Der Interruptvector ist im Datenblatt und im Atmel Beispielcode
fehlerhaft.
Der Vecter heißt "ACA_AC0_vect" und NICHT "ACA_COMP0_vect".
Danke für eure Hilfe!
Hendrik