Forum: Mikrocontroller und Digitale Elektronik Falsche Analogwerte im Seriellen Monitor


von Ron B. (simatic)


Lesenswert?

Moin moin!

ich habe ein Problem mit dem seriellen Monitor. An meinem PC möchte ich 
die  eingehenden analog und digital Eingänge meines Arduino Uno 
auslesen. Bei den digitalen Werten funktioniert das auch problemlos. An 
den analogen Eingängen A0-A2 ist jeweils ein 10k Ohm Poti angeschlossen. 
Diese funktionieren in der zu steuernden Anwendung auch einwandfrei. Nur 
werden im seriellen Monitor Werte angezeigt, die so nicht stimmen 
können. Diese Werte schwanken auch und gehen mal gegen "0" und mal gegen 
"1024". Im Mittel sind sie so bei ~"500". An den AI's A3 und A4 sind 
Schalter mit Pull-Down Widerstand angeschlossen. Theoretisch müsste der 
Wert bei Schalter offen ja "0" (=0V) sein und bei geschlossen "1024" 
(=5V). Doch bei Schalter offen sind beide Werte ~"500". Und jetzt das 
merkwürdige. Schließe ich den Schalter A3, geht sein Wert auf 0, 
schließe ich den Schalter A4, geht sein Wert auf 1024. Die 
Schalter/Potis haben keine Wirkung untereinander, deswegen schließe ich 
Kurz/Querschlüsse aus. Verdrahtungsfehler sind quasi ausgeschlossen.

Könnt ihr mir da weiterhelfen? Bin über jeden Tipp dankbar.

Viele Grüße
Ron

von Frager (Gast)


Lesenswert?

Ron B. schrieb:
> Könnt ihr mir da weiterhelfen?

Zeig Dein Programm.

von Joachim B. (jar)


Lesenswert?

AVCC mit Filter angeschlossen?
Interne Ref genutzt?
Kondensator an Aref?
Quelle niederohmig genug?

Frager schrieb:
> Zeig Dein Programm.

mindestens noch das Schaltbild und die Verdrahtung.

: Bearbeitet durch User
von Ron B. (simatic)


Angehängte Dateien:

Lesenswert?

Den Code findet ihr im Anhang. Ich bin noch nicht all zu lange beim 
Thema Arduino dabei. Im Job programmiere ich S7. Die Merker im letzten 
Teil werden noch nicht verwendet. Später sollen die Schalter S4 und S5 
diese Merker, in Abhängigkeit verschiedener Bedingungen 
setzen/rücksetzen. Mit AVCC ist die Versorgungsspannung für den Arduino 
gemeint? Diese kommt von einem 12V Schaltnetzteil. Einen kompletten 
Schaltplan kann ich euch nicht bieten. Habe den Teil für die 
Analogeingabe eben mal skizziert (Sorry das es nicht ordentlich ist :D 
).

von Karl M. (Gast)


Lesenswert?

Ron B.,

was die anderen Helfer, dir mitteilen möchten ist, wenn deine Hardware 
nicht korrekt ist - und dir wie hier dargestellt - unbekannt ist, dann 
kannst Du nicht logisch vorgehen.
Er muss deine Hardware korrekt konfiguriert und der AVR µC richtig 
beschaltet sein.

Also besorge Dir bitte einen Schaltplan und überprüfe ihn, lies die 
Atmel Application Notes zum ADC und zur Hardwarebeschalstung. Dann sehen 
wir weiter.

von kjghkfysd (Gast)


Lesenswert?

Karl M. schrieb:
> Also besorge Dir bitte einen Schaltplan und überprüfe ihn, lies die
> Atmel Application Notes zum ADC und zur Hardwarebeschalstung. Dann sehen
> wir weiter.

Und dann misst Du die Spannungen direkt an den Eingangspins.

Danach sehen wir weiter.

kjghkfysd

von Frager (Gast)


Lesenswert?

Karl M. schrieb:
> Ron B.,
>
> was die anderen Helfer, dir mitteilen möchten ist, wenn deine Hardware
> nicht korrekt ist


> Er muss deine Hardware korrekt konfiguriert und der AVR µC richtig
> beschaltet sein.
>
> Also besorge Dir bitte einen Schaltplan und überprüfe ihn, lies die
> Atmel Application Notes zum ADC und zur Hardwarebeschalstung. Dann sehen
> wir weiter.

Das ist ein Arduino, der ist korrekt beschaltet.

Ron, lies Dir alles zur Funktion Analogread und ihren Parametern durch 
und sieh Dir dann nochmals Deine seriellen Ausgaben an.

von Jim M. (turboj)


Lesenswert?

Das hier
1
int _S1_Value = 0;  
2
//...
3
Serial.print("Poti 1     ");
4
Serial.println(analogRead(_S1_Value));
5
//...                     ^^^^^^^^^
6
_S1_Value = analogRead(S1);
..kann nicht tun. Sieht für mich wie ein Copy&Paste Fehler aus.

von Ron B. (simatic)


Lesenswert?

Danke für die Antworten! Ich will mich hier nicht als Trottel 
darstellen, aber was sollte ich an der Hardware von meinem Arduino groß 
ändern? Der ist nach Standard bestückt und die Versorgung die er 
benötigt bekommt er, außer AREF. Dafür soll der DEFAULT Wert genommen 
werden. Das Auslesen funktioniert in einem anderen Sketch (der nur das 
Poti ausliest) problemlos (Baudrate war identisch). Deswegen denke ich, 
dass der Fehler im Programm liegt. Die Spannungen habe ich an jedem PIN 
geprüft, alles wie erwartet ohne Fehler oder Auffälligkeiten.


@Jim Meba

Der Befehl
1
Serial.print("Poti 1     ");
ist meines Wissens nach nur einfacher Text, der nix mit den Variablen zu 
tun hat. Das soll nur zur Übersichtlichkeit im seriellen Monitor 
beitragen.

von Manfred (Gast)


Lesenswert?

Ron B. schrieb:
> Doch bei Schalter offen sind beide Werte ~"500".
Die Beschreibung ist für mich etwas wirr, aber lässt mich nicht an eine 
korrekte Verdrahtung glauben.

Herumhampelnde A/D-Werte können auch aus einer unsauberen 
Versorgungsspannung resultieren - versorge den Kram mal mit einer 
Batterie und einem 7805!

In Zeile 87 Serial.println(analogRead(_S1_Value)); gibst Du einen Wert 
aus, obwohl dieser erst in Line 117 _S1_Value = analogRead(S1); gelesen 
wird.

Die "{}" in Zeilen 70 und 106 / 109 und 123 erschließen sich mir auch 
nicht so ganz. Zumindest meckert die Arduino IDE nicht.

von Einer K. (Gast)


Lesenswert?

Jim M. schrieb:
> Das hierint _S1_Value = 0;
> //...
> Serial.print("Poti 1     ");
> Serial.println(analogRead(_S1_Value));
> //...                     ^^^^^^^^^
> _S1_Value = analogRead(S1);
>
> ..kann nicht tun. Sieht für mich wie ein Copy&Paste Fehler aus.

Genau!
Damit muss da Mist raus kommen.


---------


Und die beiden Taster/Schalter an den Analogpins muss man auch nicht 
analog auslesen!
Das geht digital besser und viel schneller

von Ron B. (simatic)


Lesenswert?

Die AI's für die Schalter nutze ich nur, weil ich keine DI's mehr frei 
habe. Einen 7805 besitze ich leider (noch) nicht. Hab den µC jetzt nur 
über USB angeschlossen und die Antriebe abgeklemmt. Die Qualität der USB 
Spannung sollte doch ausreichen.
Habe ich da einen Logikfehler drin? Der Wert von Pin A1 wird auf 
_S1_Value geschrieben. Damit rechnet der µC und von _S1_Value liest der 
Serielle Monitor den Wert und stellt ihn dar (So meine Logik).
Die unnötigen Klammern habe ich entfernt und das Lesen der Eingänge vor 
das Lesen durch den Seriellen Monitor geschrieben.
1
   _Achse_A_0_Value = digitalRead(Achse_A_0);
2
    _Achse_A_1_Value = digitalRead(Achse_A_1);
3
    _Achse_B_0_Value = digitalRead(Achse_B_0);
4
    _Achse_B_1_Value = digitalRead(Achse_B_1);
5
    _Achse_C_0_Value = digitalRead(Achse_C_0);
6
    _Achse_C_1_Value = digitalRead(Achse_C_1);
7
    _S1_Value = analogRead(S1);
8
    _S2_Value = analogRead(S2);
9
    _S3_Value = analogRead(S3);
10
    _S4_Value = analogRead(S4);
11
    _S5_Value = analogRead(S5);
12
  
13
    
14
    Serial.print("Achse_A_0     "); 
15
    Serial.println(digitalRead(Achse_A_0));      
16
    Serial.print("Achse_A_1     ");
17
    Serial.println(digitalRead(Achse_A_1));    
18
    Serial.print("Achse_B_0     ");
19
    Serial.println(digitalRead(Achse_B_0)); 
20
    Serial.print("Achse_B_1     ");
21
    Serial.println(digitalRead(Achse_B_1));
22
    Serial.print("Achse_C_0     ");
23
    Serial.println(digitalRead(Achse_C_0));  
24
    Serial.print("Achse_C_1     ");
25
    Serial.println(digitalRead(Achse_C_1)); 
26
    
27
      
28
    Serial.print("Poti 1     ");
29
    Serial.println(analogRead(_S1_Value));   
30
    Serial.print("Poti 2     ");
31
    Serial.println(analogRead(_S2_Value));  
32
    Serial.print("Poti 3     ");
33
    Serial.println(analogRead(_S3_Value)); 
34
    Serial.print("Poti 4     ");
35
    Serial.println(analogRead(_S4_Value)); 
36
    Serial.print("Poti 5     ");
37
    Serial.println(analogRead(_S5_Value)); 
38
    Serial.print("Merker 1     ");
39
    Serial.println(digitalRead(Merker_1)); 
40
    Serial.print("Merker 2     ");
41
    Serial.println(digitalRead(Merker_2));

Ich kanns nur nochmal wiederholen im Arduino müssen die Werte richtig 
verarbeitet werden. Sonst würde die Anlage (bis auf die beiden Taster) 
nicht funktionieren.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Klar kann Das klappen - zumindest bei den Achsen, da die Werte oben nur 
ausgegeben werden.

Die Zeilen
Serial.println(analogRead(_S1_Value));
und
_S1_Value = analogRead(S1);
ergeben für mich, gerade in dieser Reihenfolge, keinen Sinn.
Auch würde ich den 2.ten Block vor den jetzt ersten Block setzen und im 
'Anzeigeblock' (also jetzt 1.ten, dann aber 2.ten) die Werte der 
gesetzten Variablen ausgeben.
So haben Programm und Nutzer zumindest die gleichen Informationen.

Denke, das 'analogRead(_S1_Value)' versucht, den Analog-Input mit der 
Nummer '_S1_Value' (den enthaltenen Wert) auszulesen - wäre Das so eine 
Möglichkeit?

MfG

von Einer K. (Gast)


Lesenswert?

Ron B. schrieb:
> Die AI's für die Schalter nutze ich nur, weil ich keine DI's mehr frei
> habe
Du kannst die Analogen Pins wie die Digitalen benutzen!
Aber wenn du das nicht willst, dann soll mir das auch egal sein.

Ron B. schrieb:
> Ich kanns nur nochmal wiederholen im Arduino müssen die Werte richtig
> verarbeitet werden. Sonst würde die Anlage (bis auf die beiden Taster)
> nicht funktionieren.

Und wie können immer wieder sagen:
Du baust bei der Ausgabe Mist!

Und dir ist die Stelle gezeigt worden.
Jetzt mittlerweile 5 Mal, oder so.

von Manfred (Gast)


Lesenswert?

Arduino F. schrieb:
> Und die beiden Taster/Schalter an den Analogpins muss man auch nicht
> analog auslesen!
> Das geht digital besser und viel schneller
Da hänge ich mal eine Frage dran: Kann man auch die A-Pins mit 
"(digitalRead(x))" lesen?

======

Ron B. schrieb:
> Habe ich da einen Logikfehler drin?
Ja, der Wald ist vor lauter Bäumen nicht mehr zu sehen :-)

Gehe mal durch, welche Werte die Variable "_S1_Value" annimmt:
Erstmal ist er Null, dann kommt also bei
Serial.println(analogRead(0)); der Wert von Port 0.

Weiter hinten wird mit _S1_Value = analogRead(S1); auf irgend_einen 
Wert gesetzt, den Du einliest.

Bei der nächsten Runde liest Du dann Analogport 1023 oder 815 oder was 
immer da zufällig gekommen ist.

von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> Da hänge ich mal eine Frage dran: Kann man auch die A-Pins mit
> "(digitalRead(x))" lesen?
Ja sicherlich....
Zumindest A0 bis A5.

Evtl vorhandene A6 und A7 sind beim 328 rein Analog.

von Ron B. (simatic)


Lesenswert?

So, jetzt ist auch bei mir der Knoten geplatzt. Dass ich die AI's auch 
als DI's wusste ich noch nicht. Guter Tipp.  Jetzt läuft es und ich 
bekomme meine Werte Top angezeigt.
Danke für eure Geduld und die Unterstützung. Ein tolles Forum habt ihr 
hier. :)

von Manfred (Gast)


Lesenswert?

Ron B. schrieb:
> So, jetzt ist auch bei mir der Knoten geplatzt. Dass ich die AI's auch
> als DI's wusste ich noch nicht.
Deine Serial.print für die Potis dürften noch immer zufallsbedingt sein, 
das hat mit analog- / digital-Read nichts zu tun.

----------

Arduino F. schrieb:
> Manfred schrieb:
>> Da hänge ich mal eine Frage dran: Kann man auch die A-Pins mit
>> "(digitalRead(x))" lesen?
> Ja sicherlich....
> Zumindest A0 bis A5.
>
> Evtl vorhandene A6 und A7 sind beim 328 rein Analog.

Danke!

von Ron B. (simatic)


Lesenswert?

Der Code für das Lesen der Potis sieht jetzt so aus:
1
Serial.print("Poti 1     ");
2
    Serial.println(analogRead(S1));


damit funktioniert es. Ich werde noch die _SX_Value durch SX ersetzen. 
So wie es jetzt ist, hab ichs "doppeltgemoppelt".

von Manfred (Gast)


Lesenswert?

Ron B. schrieb:
> Der Code für das Lesen der Potis sieht jetzt so aus:
> Serial.print("Poti 1     ");
>     Serial.println(analogRead(S1));
>
> damit funktioniert es. Ich werde noch die _SX_Value durch SX ersetzen.
> So wie es jetzt ist, hab ichs "doppeltgemoppelt".

Geschmackssache, ich würde in Serial.print garnicht analog lesen, 
sondern einfach nur _S1_Value ausgeben - das ist dann der Wert, der 
zuletzt verarbeitet wurde.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Dito

Das doppelte Analog_Read braucht doppelt Zeit und ob der Dir angezeigte 
Wert nur auch mit dem intern zur Berechnung/Entscheidungsfindung überein 
steht, auf einem gaaanz anderem Blatt.

Beim Einlesen in eine Variabel hast Du die Ausgabe schneller (da hier 
nicht erneut eingelesen/gewandelt wird) und auch die Gleiche, wie der µC 
selber für die Entscheidung nimmt.

Darin sehe ich durchaus Vorteile, gerade, wenn man z.B. die Grenzwerte 
abstecken möchte.

MfG

von Manfred (Gast)


Lesenswert?

Patrick J. schrieb:
> Das doppelte Analog_Read braucht doppelt Zeit
.. die er zur Genüge haben dürfte, aus Sicht des µC ist die Mechanik 
dahinter unendlich langsam.

Im Gegenteil: Muß die loop mit delay(1) in affenartiger Geschwindigkeit 
im Kreise laufen? Die größte Bremse werden die seriellen Ausgaben sein.

Ich sollte mal messen, ob sowas Auswirkungen auf die Stromaufnahme hat.

> und ob der Dir angezeigte
> Wert nur auch mit dem intern zur Berechnung/Entscheidungsfindung überein
> steht, auf einem gaaanz anderem Blatt.
Genau das war mein Ansatz!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.