analogRead Probleme SOLVED

Hallo, ich bin neu im Forum und hoffe das ich nicht übersehen habe, aber ich habe per SuFu nix passendes gefunden.

Zum Thema:

Ich habe eine Photodiode die ich auslesen möchte. Die Photodiode wird mit einer Roten- und einer IR- LED beleuchtet. Später soll aus der Signaländerung ein Quotient gebildet werden (soweit bin ich noch nicht). Den Spannungswert der Photodiode wird per analogRead am A1-Pin ausgelesen. Diesen Wert gebe ich auf ein 16x2 Display aus. Mein Problem ist, dass der Analogwert nicht stabil ist.

Aus der Photodiode kommt mit zugehöriger Elektronik in Abhängigkeit der Beleuchtungsstärke eine Spannung von 0,05-3,50V
Die Spannung am Eingang ist bei gleicher Beleuchtungsstärke konstant. Mein Analogwert hingegen schwankt ziemlich(sinnvolles Ablesen per Display ist nicht möglich)
Ich weiß nicht ob ich auf der Leitung stehe, aber ich finde den Fehler nicht.

//Festlegen der Variablen
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,10,11,12,13);
//(rs,enable,d4,d5,d6,d7)

int indikatorR = 5;
int indikatorG = 4;
int ledR = 3;
int ledIR = 2;
int sensorR = 0;
int sensorIR = 0;



void setup () {
  pinMode(ledR, OUTPUT);
  pinMode(ledIR, OUTPUT);
  pinMode(indikatorR, OUTPUT);
  pinMode(indikatorG, OUTPUT);
  lcd.begin(16,2);  
//   Serial.begin(9600);
  
}

void loop (){
  

 digitalWrite(ledR,HIGH);
 digitalWrite(ledIR,LOW);
 delay(1);
 sensorR = analogRead(A1);
 lcd.setCursor(0,0);
// lcd.print("Rot");
// lcd.setCursor(5,0);
 lcd.print(sensorR);
 delay(500);
//  Serial.println(sensorR);
 
 digitalWrite(ledR,LOW);
 digitalWrite(ledIR,HIGH);
 delay(1);
 sensorIR = analogRead(A1);
 lcd.setCursor(0,1);
// lcd.print("IR");
// lcd.setCursor(5,1);
 lcd.print(sensorIR);
// Serial.println(sensorIR);

 
  delay(500);
  
}

Ich hoffe mir kann einer helfen.
Beste Grüße
Florian

FlorianRudek:
Ich weiß nicht ob ich auf der Leitung stehe, aber ich finde den Fehler nicht.

Die ms-delays mit extrem kleinen Zahlen sind nicht besonders genau.
Versuche statt "delay(1)" stattdesen mal "delayMicroseconds(1000)".

Und formatiere außerdem mal auf stets selbe Spaltenbreite von maximal 4 Zeichen.

Wenn bei Dir nacheinander beispielsweise erst der Wert 102 und danach 99 angezeigt wird, erscheint ja tatsächlich erst 102 und danach 992 in der Anzeige.

Also die Werte entweder vorher auf 4 Stellen formatieren oder so in der Art ausgeben:

  if (sensorIR<1000) lcd.print(' ');
  if (sensorIR<100) lcd.print(' ');
  if (sensorIR<10) lcd.print(' ');
  lcd.print(sensorIR);

Oder die Anzeige stets mit lcd.clear() löschen bevor neue Werte in die Anzeige geschrieben werden.

Was für Vorwiderstände hast Du denn an den Sendedioden hängen bzw. welche Stromstärke ziehst Du aus den Outputs mit den Sendedioden?

Danke erstmal für den Tip, die großen Schwankungen sind jetzt erstmal weg jedoch schwankt der Wert um 100 Punke somit ~ 0,5 V die beiden LED´s sind mit je 150 Ohm versehen und besitzen ein Leistungsaufnahme von je ca. 20 mA

Die Fotodiode hat eine Anstiegszeit von einigen ns somit sollte ich mich durch den Delay auch nicht mehr im Anstieg befinden.

Was ich auch etwas verwunderlich finde ist jetzt, dass die Werte sich im selben "Modus" befinden sie steigen beide oder fallen beide...

Von lcd.Clear bin ich abgekommen. Da das Display dann erheblich flackert

FlorianRudek:
Was ich auch etwas verwunderlich finde ist jetzt, dass die Werte sich im selben "Modus" befinden sie steigen beide oder fallen beide...

Vielleicht einfallendes Fremdlicht, das auf den Sensor fällt und nicht von Deinen Sendedioden stammt?

Sagen wir mal erst kommt eine Wolke und es wird dunkler im Raum, danach kommt die Sonne raus und es wird heller, und die Messwerte ändern sich? Oder mit welcher Frequenz ändern sich die Werte?

Das mit dem Fremdlicht kann ich ausschließen. Zum einen ist die Beleuchtungsstärke bei LED-An so hoch, dass es sich nichts ändern dürfte. Und zum zweiten in einer Schublade in einem Karton (nahe zu Lichtleer) Schwanken die Werte zwischen 0 und 100

Die Abtastung erfolgt ja 500 ms nach dem Delay. Die LEDs kann ich auch ausschalten sowie im cw-mode betreiben. Immer kommt es zur Schwankung.

Da ich ein Openframe Netzteil mit 20W verwende schließe ich einen Einfluss von der Spannungsversorgung aus. Bis auf die beiden LEDs ist kein weiterer Verbraucher mit dem Arduino verbunden.

Ich habe das Gefühl, dass es an der Signalverarbeitung liegt.

EDIT:

ich habe über Serial.println die Werte des Sensors ausgelesen:
69
0
0
136
0
0
111
0
1
94
0
0
16
0
24
64
0
48
0
0
114
0
0
137
0
2
82
0
3
89
0
91
24
0
84
0

Das ist jetzt der "Dunkelstrom" die Spannung beträgt jetzt konstant 0,08 V

FlorianRudek:
Ich habe das Gefühl, dass es an der Signalverarbeitung liegt.

Ich habe das Gefühl, dass es an Deiner Schaltung liegt.

Das kann schon sein, müsste ich aber dann nicht die veränderliche Spannung mit dem Multimeter bzw. dem Oszi messen können?

Anbei ein Bild meiner Schaltung:

ICh werde jetzt nochmal Testen was mit das Arduino bei 5V Eingangs sagt und ebenfalls noch einen anderen Analog-Pin nutzen.

Vielen Dank erstmal für Deine Hilfe
Florian.

5V und 0V liefern "richtige Werte" kann es sein, dass die der Analog-Pin durch den Delay im Nirvana befindet und macht was er will?

Das Bild der Schaltung ist pfui. Damit kann man nichts anfangen. Sinnvoller sind Stromlaufpläne.

Worüber schließt du GND und VCC an? Externes Netzteil? Sieht für mich so aus, als ob dein GND in der Luft liegt.

Ja, würde da auch sagen, dass die Masse-Verbindung fehlt. Die Versorgungsspannung kann ruhig unterschiedlich sein, aber du musst eine gemeinsame Masse haben.

Wie gesagt, Spannungsversorgung ist durch ein Netzteil realisiert. Die beiden Massen des Arduinos sind mit dem GND der Platine verbunden (Massefüllung).

Einen Stromlaufplan habe ich leider nicht, ich weiß dass der Schaltplan ohne meine Idee im Kopf nicht so sehr hilfreich ist. Ich werde jetzt nochmal einen Pulldown-Widerstand an den Ausgang des OPVs Basteln und sehen ob das was bringt.

EDIT:

Nochmal zur Masse, sind denn nicht linker und rechter GND am Arduino verbunden?

Kannst du die Schaltung auf dem Breadboard nachbilden?

Laut dem Fritzting Teil besteht keine Verbindung zwischen der PCB und dem Arduino. Sollte aber über eine angelötete Stitftleiste funktionieren. Wo bekommen die anderen Komponenten ihren GND her?

sschultewolter:
Laut dem Fritzting Teil besteht keine Verbindung zwischen der PCB und dem Arduino.

Man sieht es schlecht, aber bei den zwei GND Anschlüssen unten scheint doch eine Verbindung zur Kupferfläche zu bestehen.

Die restlichen Masse-Verbindungen auf der Platine müssen dann natürlich auch passen.

Hallo zusammen,

ich habe den Schuldigen gefunden. Software und Layout(Stiftleisten sind eingelötet) sind in Ordnung, nochmal Danke jurs.
Das Netzteil ist das Problem, sehr viele störende Frequenzkomponeten. Am Labornetzteil funktioniert alles prima.

Ich dachte die Openframe-Netzteile sind besser als die üblichen Steckernetzteile, dem ist aber leider nicht so.

Ich versuche das Netzteil zu glätten, sollte das nicht ausreichend gehen, wird ein anderes verwendet.

Vielen Dank nochmal
Florian

FlorianRudek:
Ich versuche das Netzteil zu glätten, sollte das nicht ausreichend gehen, wird ein anderes verwendet.

Die ADC-Pins der Arduino-Boards sind nicht vollkommen unabhängig voneinander, denn der Controller hat eigentlich nur einen einzigen ADC, der auf verschiedenen Pins messen kann.

Wenn Dir Störungen über Leiterbahnen Deiner Platine, die als Antenne wirken, in die ADC-Messungen reinstreuen, kann es daher hilfreich sein, alle nicht verwendeten Analog-Pins auf GND zu legen, um die Störungen beim Messen am tatsächlich verwendeten Pin zu reduzieren.

Vielen Dank für den Tip, das werde ich dann auch noch umsetzen :slight_smile: