Spannung auslesen: Rauschen(?) sehr hoch

Hallo,
folgendes Problem: Ich möchte einen Spannungswert über einen Analog Eingang auslesen (Chip: Atmel Mega 2560). Da ich den Spannungswert von einem Achsenendtaster (Überprüfung auf Kollision) erhalte, reicht mir die Unterscheidung "Spannungswert hoch" oder "Spannungswert niedrig". Mit Rauschen oder sonstigen Firlefanz wird mein Spannungswert nie ganz 0 sein, daher soll erst bei Überschreiten eine Grenzspannung der Taster auslösen.
Zu Testzwecken habe ich daher an dem A0 Pin ein Jumpwire angebracht. Das Auslösen des Taster simuliere ich durch die Verbindung zum 5V Pin.

Leider ist der gemessene Analogwert bei offenem Kontakt ziemlich hoch. Selbst mit dem einfachen Code

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);    
  // print out the value you read:
  Serial.println(sensorValue);
  delay(500);
}

erhalte ich Werte bis 400. Wenn ich mit dem Finger den A0 Pin berühre, steigt der Wert sogar auf 1023. Das würde bedeuten, dass an dem Pin 5V anliegen...

Kann mir jemand dieses Problem erklären?

Viele Grüße

Ein offener Eingang floatet.
Er schwebt also irgendwo rum und es ist nicht definiert, was er tut.
Du musst immer einen irgendwie definierten Pegel anlegen.

In deinem Fall: einen Pulldownwiderstand, und der Taster schaltet nach 5V

So richtig werde ich aus deiner Beschreibung nicht schlau.
Einerseits nutzt du einen analogen Eingang, andererseits nutzt du einen Taster.
Bei der Verwendung eines Tasters kannst du doch einen digitalen Eingang mit Pullup-Widerstand nehmen.
Dann hast du nicht diesen beschriebenen Nebeneffekt.

Evtl. solltest du aber dein Vorhaben besser beschreiben.

Hi,

reicht mir die Unterscheidung "Spannungswert hoch" oder "Spannungswert niedrig".

Wäre da nicht ein digitaler Eingang die bessere Lösung?

JEder Digitale Eingang hat zuerst mal einen Schmitttrigger und definierte Spannungen die H oder L gewertet werden.

Bei 5V Versorgungsspannung ist alles unter 1,5V LOW.
Alles über 3V ist HIGH
Dazwischen bleibt der vorherige Zustand:
wenn die Spannung absinkt dann wird unter 1,5V LOW detektiert. Wenn von LOW die Spannung höher wird wird sie bei überschreiten von 3V als HIGH gesehen.

So hat man 1,5V Störabstand zwiscehn L und H und rauschen macht nichts aus.

Ein Eingeng muß jederzeit einen definierten Zustand haben. Das bedeutet er muß immer beschaltet sein, wenigstens mit einem Pullup- oder Pulldown-Widerstand (Widerstand vom Pin auf 5V bzw auf Masse) oder den internen Pullup aktiviert haben.

Grüße Uwe

HotSystems:
Bei der Verwendung eines Tasters kannst du doch einen digitalen Eingang mit Pullup-Widerstand nehmen.
Dann hast du nicht diesen beschriebenen Nebeneffekt.

Vollkommen richtig. Das Problem ist nur, dass meine digitalen Pins alle belegt sind und ich daher einen analog Pin nehmen muss.

Dh. wenn ich den Code wie folgt umschreibe, sollte es für meinen Anwendungsfall funktionieren?

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  pinMode(A0, INPUT); 
  digitalWrite(A0, HIGH); // set pullup on analog pin 0
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = digitalRead(A0);    
  // print out the value you read:
  Serial.println(sensorValue);
  delay(500);
}

BTW: Kann ich in der Codeformatierung etwas fett markieren? Also:

 [b]pinMode(A0, INPUT);[/b]

Ja, das funktioniert dann und du kannst im Setup auch folgendes schreiben:

"pinMode(A0, INPUT_PULLUP);"

Damit wird auch der interne Pullup definiert.

Du kannst (fast) jeden analogen I/O als digitalen I/O benutzen.

Die Eingänge A0 bis A5 können als digitale pins 14 bis 19 genutzt werden ( zb beim Arduino UNO)
Grüße Uwe

Die Eingänge A0 bis A5 können als digitale pins 14 bis 19 genutzt werden ( zb beim Arduino UNO)

Selbst diesen Zusammenhang musst du nicht in deinem Sketch verwenden:

es geht sogar so:

  pinMode(A0, INPUT_PULLUP);
  bool state = digitalRead(A0);

michael_x:

  pinMode(A0, INPUT_PULLUP);

bool state = digitalRead(A0);

Das Problem bei dem Code ist, dass der Pin bei offenem Kontakt immer auf "high" gesetzt wird, mein Sensor aber "high" bei Kollision liefert. D.h. ich bräcuhte also einen Pull-Down Widerstand, der bei offenem KOntakt auf "low" setzt. Leider scheint ein Pulldown Widerstand nicht verbaut zu sein. Kann man das trotzdem via Code lösen?

Schöne Grüße

100-200-00:
Das Problem bei dem Code ist, dass der Pin bei offenem Kontakt immer auf "high" gesetzt wird, mein Sensor aber "high" bei Kollision liefert. D.h. ich bräcuhte also einen Pull-Down Widerstand, der bei offenem KOntakt auf "low" setzt. Leider scheint ein Pulldown Widerstand nicht verbaut zu sein. Kann man das trotzdem via Code lösen?

Schöne Grüße

Nein, via Code geht es nicht.

Jetzt ist die Frage, liefert der Sensor Spannung oder hat dieser eine offenen Kollektor-Ausgang ?
Evtl. musst du im Code ja nur die Abfrage umstellen.

HotSystems:
Nein, via Code geht es nicht.

Jetzt ist die Frage, liefert der Sensor Spannung oder hat dieser eine offenen Kollektor-Ausgang ?
Evtl. musst du im Code ja nur die Abfrage umstellen.

Puhh, keine Ahnung, ich kenne mich da nicht so aus :slight_smile: Es handelt sich dabei um den Sensor INI-AB-I-025-B-AA
http://www.igus.de/wpck/8013/N11_6_21_position_switch?C=DE&L=de

100-200-00:
Puhh, keine Ahnung, ich kenne mich da nicht so aus :slight_smile: Es handelt sich dabei um den Sensor INI-AB-I-025-B-AA

Das Datenblatt ist leider nicht sehr aussagekräftig.
Daraus würde ich entnehmen, der Sensor liefert im Ruhezustant Betriebspannung am Ausgang.
Das solltest du mal nachmessen.
Dann müsstest du den Sensor über einen Spannungsteiler am Arduino anschließen.

INI-AB-I-025-B-AA Initiator, induktive, PNP, Öffner/NC

Also müßte der Ausgang normalerweise High Signal (Betriebsspannung 10 bis 30V) liefern und Du brauchst einen Pull Down Widerstand und einen Spannungsteiler.

Grüeß Uwe