Forum: Mikrocontroller und Digitale Elektronik Analog Inputs liefern unterschiedliche Werte bei verschiedenen Arduino Nanos


von Martin (Gast)


Lesenswert?

Hallo zus.,

ich habe größere Unterschiede der Werte an den analogen Inputs bei 
Verwendung verschiedener Arduino Nanos. Die sonstigen Komponenten sind 
gleich (selbst entwickelte Platine).

Ich werte Taster an die analogen Inputs aus. Je analogem Input Taster 
einmal über 10kOhm und über 47kOhm. Die Inputs nutzen den internen 
PULLUP.

Im Sketch wird der gemessene Wert über Toleranzgrenzen abgeglichen und 
im Code entsprechend abgearbeitet.

Die Toleranzgrenzen wurden einmalig ermittelt und im Sketch definiert.

Jetzt habe ich eine 2. Platine bestückt und festgestellt, dass hier 
einige Tasten nicht erkannt werden, da die Referenzwerte des ersten 
Nanos anders sind. Es ist ein Nano-Clone von einer anderen Firma.

Warum gibt es hier so große Unterschiede? Ich hatte gehofft, dass ich 
nicht jeden Nano einzeln kalibrieren muss und die Werte in einem 
ähnlichen Bereich liegen sowie über die Toleranzgrenzen eindeutig wären.

Gruß
Martin

von Beo Bachta (Gast)


Lesenswert?

Martin schrieb:
> Die Inputs nutzen den internen PULLUP.

Interne Pullups sind sowas von ungenau und streubehaftet
dass man sich da auf fast gar nichts verlassen kann.

von Jim M. (turboj)


Lesenswert?

Martin schrieb:
> Warum gibt es hier so große Unterschiede?

Weil Widerstände mit 'nem Gate eines kleinen Transistors (FET) 
realisiert werden, wo kleine Produktionsunterschiede einen verdammt 
großen Einfluss auf den Ohmschen Wert haben.

von Stefan F. (Gast)


Lesenswert?

Martin schrieb:
> einmal über 10kOhm und über 47kOhm. Die Inputs nutzen den internen
> PULLUP.

Ich bin ziemlich sicher dass das Datenblatt Quellen mit maximal 10kΩ 
empfiehlt.

> Warum gibt es hier so große Unterschiede?

Wie groß sind sie denn konkret, und auf welche Referenz bezieht sich die 
Messung?

Die internen Widerstände können locker um 20% variieren und die interne 
Referenz um 10%.

von Martin (Gast)


Lesenswert?

Besten Dank für die Antworten! Hätte nicht gedacht, dass das von den 
internen Toleranzen der "Pullup-FETs" verursacht wird.

Hier die Beispielwerte an den Eingängen (diese Werte waren quasi meine 
Referenz) bei einzeln gedrückten Tastern:

1. Nano: const int Analog_Vgl_A[servos] = {260, 260, 260, 260};
// Array mit den Vergleichswerten für die A-/B-Tasten
const int Analog_Vgl_B[servos] = {623, 623, 623, 623};
// mit diesen Werten werden die analogRead-Werte verglichen, um 
festzustellen ob A oder B gedrückt wurde.

2. Nano: const int Analog_Vgl_A[servos] = {230, 230, 230, 230};
const int Analog_Vgl_B[servos] = {562, 562, 562, 562};

Also >10 % Unterschied. Muss mal testen, ob ich 2 gleiche Nanos finde, 
wie hier das Ergebnis aussieht.

Als +/- Toleranz hatte ich byte Toleranz_analog_read = 30 definiert.
Hat dazu geführt, dass Taste A erkannt wurde, Taste B leider nicht.

Abgefragt wird das im Coding so:
if (Tastenwert < Analog_Vgl_B[i] + Toleranz_analog_read && Tastenwert > 
Analog_Vgl_B[i] - Toleranz_analog_read)

von HildeK (Gast)


Lesenswert?

Martin schrieb:
> Muss mal testen, ob ich 2 gleiche Nanos finde,
> wie hier das Ergebnis aussieht.

Du musst nicht nach zwei gleichen Nanos schauen sondern nach zwei 
Boards, die mit Prozessoren bestückt sind, die aus dem selben Die 
stammen. Wird schwierig! Dann zumindest ist die Chance groß, dass du 
sehr ähnliche Werte erhältst.
Warum nicht einfach einen externen PU einbauen? Damit ist schon mal die 
Toleranz der internen Rs weg.
Wie viele Tasten willst du denn dabei unterscheiden?

von Harry L. (mysth)


Lesenswert?

Martin schrieb:
> Also >10 % Unterschied.
Sind deine Widerstände denn auch besser als 10%?

Leg doch deine Vergleichswerte einfach mal sinnvoll fest!
<400 -> Taste A
>=400 -> Taste B

Damit liegst du einigermaßen in der Mitte deines Arbeitsbereich du 
brauchst auch kein Array mit Referenzwerten pro Kanal.

von Martin (Gast)


Lesenswert?

Für externe PUs war ich zu geizig. ;-)
Beim nächsten Layout weiß ich es nun besser.
Unterscheiden will ich 8 Taster an 4 Eingängen (jeweils 2).

Das Kalibrieren ist nicht wirklich störend bei meinen paar Platinen. 
Mich hat nur interessiert, woher der Effekt kommt.

Wie machen denn Firmen mit Großserienfertigung diese Kalibrierung, die 
sicher bei ein paar tausend Stück nennenswert auftritt? Wird da jeder µC 
vorher getestet? Das betrifft ja sicher auch die ganzen Microchip-PICs 
mit ihren ADC-Inputs, oder?

von Beo Bachta (Gast)


Lesenswert?

Martin schrieb:
> Wie machen denn Firmen mit Großserienfertigung diese Kalibrierung

Die machen keinen solchen Pfusch á la Arduino.

von Manfred (Gast)


Lesenswert?

HildeK schrieb:
> Du musst nicht nach zwei gleichen Nanos schauen sondern nach zwei
> Boards, die mit Prozessoren bestückt sind, die aus dem selben Die
> stammen. Wird schwierig! Dann zumindest ist die Chance groß, dass du
> sehr ähnliche Werte erhältst.

Na ja ... Ich habe mal bei ein paar NMOS-FETs aus der gleichen Charge 
RDS gegen UGS gemessen, streute erheblich. Warum soll das bei einen µC 
besser sein?

> Warum nicht einfach einen externen PU einbauen?

Ich wäre garnicht auf die Idee gekommen, einen internen PullUp verwenden 
zu wollen. Mir ist auch nicht klar, ob die sich an einen Analogeingang 
überhaupt dauerhaft setzen lassen.

Ich glaube an ein hausgemachtes Problem, unglücklich beschaltet und im 
Programmcode sinnlos abgefragt.

Wir reden hier über zwei Tasten, da ist genug Luft für eine Abfrage. 
Wenn V(ref) = Ub ist, fällt deren Toleranz schon einmal raus. Jetzt muss 
man natürlich Fenster bauen:
Größer 1000 = offen
Von 500..600 = Taste 1
Von 300..400 = Taste 2
Anderer Wert entweder Fehler oder beide Tasten gedrückt.

Die Abfrage auf genau einen Wert geht garantiert schief. Ich habe sowas 
mal mit 8 Tasten bauen müssen, da steht in meiner Abfrage "KeyWert 
+/-25".

Martin schrieb:
> Beim nächsten Layout weiß ich es nun besser.
Der A*-Nano ist groß genug, 2,54er-Raster, um nachträglich ein paar SMD 
anzufummeln.

Beo Bachta schrieb:
>> Wie machen denn Firmen mit Großserienfertigung diese Kalibrierung
> Die machen keinen solchen Pfusch á la Arduino.

Knalltüte!
Auch in Serienprodukten werden µCs eingesetzt und Schalter / Tasten mit 
Widerständen funktionieren in Millionen von Autos. Da sind Entwickler, 
die das ausrechnen und sinnvoll programmieren können.

von Beo Bachta (Gast)


Lesenswert?

Manfred schrieb:
> Knalltüte!

Selber Knalltüte!

Manfred schrieb:
> Auch in Serienprodukten werden µCs eingesetzt und Schalter / Tasten mit
> Widerständen funktionieren in Millionen von Autos. Da sind Entwickler,
> die das ausrechnen und sinnvoll programmieren können.

Aber nicht alleinig mit internen Pullups. Darauf verlässt sich
kein vernünftiger Mensch.
Höchstens Knalltüten in Knalltüten-Firmen.

von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> Mir ist auch nicht klar, ob die sich an einen Analogeingang
> überhaupt dauerhaft setzen lassen.
Aua...
Natürlich geht das!
(wenn der Pin eine Digitalstufe hat)

Beitrag #6673983 wurde von einem Moderator gelöscht.
von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Manfred schrieb:
> Größer 1000 = offen
> Von 500..600 = Taste 1
> Von 300..400 = Taste 2
> Anderer Wert entweder Fehler oder beide Tasten gedrückt.

Schon mit solchen willkürlichen Wertfestlegungen fängt das Problem an.
Die Werte für die Entscheidungsschwellen wird man so legen, dass sie 
schön in der Mitte des Toleranzfeldes liegen.

Wenn bei einem ATmega328 laut Datenblatt der Wert für den interne 
Pull-Up zwischen 20kΩ und 50kΩ liegt und die Pull-Downs an den Tastern 
Werte von 10kΩ und 47kΩ haben sollen, wird man Schwellwerte zur 
Unterscheidung offen- Taster1-Taster2 eher bei 850 und 420 hinlegen. 
Sonst geht das gleich wieder schief.

von Mikki M. (mmerten)


Lesenswert?

Die interne Referenz ist zwar recht stabil, hat aber typisch +- 10% 
Toleranz vom typ. Nennwert. Lösung wäre hier den Wert im EEPROM bei der 
Inbetriebnahme zu speichern für spätere Korrektur-Berechnungen. Für 
stabile Werte sollte die ADC Quelle auch entsprechend niederohmig sein. 
Interne PullUp für Spannugsteiler, ganz schlechte Idee. Die sind ja 
schlechter als externe Widerstände mit 20% Toleranz. Dabei sind da heute 
1% preiswertes Hühnerfutter.

von Manfred (Gast)


Lesenswert?

Wolfgang schrieb:
> Schon mit solchen willkürlichen Wertfestlegungen fängt das Problem an.

Ich hätte es anders formulieren sollen, dass ich meine Zahlen nicht 
gerechnet habe und nur das Prinzip darstellen will.

> Die Werte für die Entscheidungsschwellen wird man so legen, dass sie
> schön in der Mitte des Toleranzfeldes liegen.

Richtig!

> Wenn bei einem ATmega328 laut Datenblatt der Wert für den interne
> Pull-Up zwischen 20kΩ und 50kΩ liegt und die Pull-Downs an den Tastern
> Werte von 10kΩ und 47kΩ haben sollen, wird man Schwellwerte zur
> Unterscheidung offen- Taster1-Taster2 eher bei 850 und 420 hinlegen.
> Sonst geht das gleich wieder schief.

Gut, dass Du es gerechnet hast, ich rechne gleich mal nach:
491..716 / 170..340, da sind wir uns einig, wenn der interne 50..20k 
streut. Zwar nicht toll, aber sollte sich beherrschen lassen.
Beide Knöpfe komme ich auf 143..298, wäre also nicht auswertbar.

Wie gesagt: Ich würde einen externen R nachsetzen, dann wird das 
zuverlässiger.

Jetzt warten wir mal ab, ob Martin sich jemals wieder meldet und das 
umsetzen kann.

von Wolfgang (Gast)


Lesenswert?

Mikki M. schrieb:
> Die interne Referenz ist zwar recht stabil, hat aber typisch +- 10%
> Toleranz vom typ. Nennwert.

Es geht um eine ratiometrische Messung. Da hat die interne Referenz 
nichts zu suchen, es sei denn der Pull-Up hängt da auch dran.

von Wolfgang (Gast)


Lesenswert?

Manfred schrieb:
> Beide Knöpfe komme ich auf 143..298, wäre also nicht auswertbar.

Mit ein bisschen Trickserei ließe sich da etwas retten. Der µC könnte zu 
Anfang seines Arbeitslebens ein bisschen Statistik über die Werte 
treiben und dadurch lernen, wie groß der Pull-Up ist.  ;-)

Einmal im EEPROM abgelegt, sähe das mit der Doppelerkennung dann besser 
aus. Das würde aber eben eine vernünftig Lernphase voraussetzen.

von Mikki M. (mmerten)


Lesenswert?

Wenn ich ratiometrisch messe, kann ich auf die interne Ref. verzichten.
Allerdings wenn ich mir so einige Arduino Designs anschaue, da herrscht 
wohl nur die Geiz ist geil Mentalität. Besonders was die Beschaltung von 
Vcc AVcc und Aref angeht, da werden die Atmel/Microchip Design rules 
geflissentlich ignoriert. LC an den Versorgungsanschlüssen und nen 100 
nF an Aref kostet ja nur unnötig Geld. Und dann wundern sich einige über 
Prozess-Reset bei schaltenden Relais und ähnlichen Fehlfunktionen. Viele 
tausend AVR funktionieren bei sauberem Design absolut problemlos und 
liefern auch bei ratiometrischen Messungen z.B. bei Potis absolut 
statbile Werte ohne zusätzlichen Abgleich.

von Manfred (Gast)


Lesenswert?

Mikki M. schrieb:
> Allerdings wenn ich mir so einige Arduino Designs anschaue, da herrscht
> wohl nur die Geiz ist geil Mentalität. Besonders was die Beschaltung von
> Vcc AVcc und Aref angeht, da werden die Atmel/Microchip Design rules
> geflissentlich ignoriert.

Ich habe mehrere Anwendungen, wo ich von China-Nanos die Analogeingänge 
benutze und bekomme dort sinnvoll verwertbare Ergebnisse.

Höre bitte auf, hier zu stänkern, Deine Ausführungen tragen nichts zum 
Basisproblem bei.

von Martin (Gast)


Lesenswert?

Das ganze ist ein privates Projekt für eine Servoansteuerung. Wie 
gesagt, die Platinenspezifische Kalibrierung der Werte ist nicht das 
Problem. Die Grenzen kann ich ja noch im Sketch anpassen. Ursprünglich 
wollte ich auch beide Tasten gedrückt bzw. bis zu 4 Taster abfragen. Die 
10k und 47k waren haufenweise in der Bastelkiste, drum kamen die zum 
Einsatz.

Einen externen PULLUP benötige ich nicht; die Schaltung plus Software 
funktionieren ja nach der Kalibrierung wunderbar. In einem anderen 
Projekt habe ich A6 und A7 verwendet, da muss ein ext. PU rein, da diese 
Pins keinen int. PU haben.

An ein Anlernen und Abspeichern der Werte im EEPROM hatte ich auch schon 
gedacht. Momentan lasse ich einfach den Sketch laufen, drücke alle 
Tasten und lasse mir die Werte im seriellen Monitor anzeigen, dann packe 
ich die ermittelten Werte in die Arrays im Sketch.

von Schlaumaier (Gast)


Lesenswert?

Leg die Schaltung als Matrix an, dann brauchst du den Unsinn mit den 
Widerständen nicht.

von Martin (Gast)


Lesenswert?

Schlaumaier schrieb:
> Leg die Schaltung als Matrix an, dann brauchst du den Unsinn mit
> den
> Widerständen nicht.

Wie muss ich mir so eine Matrix an den analogen Inputs vorstellen?

von Jens M. (schuchkleisser)


Lesenswert?

Martin schrieb:
> Wie machen denn Firmen mit Großserienfertigung diese Kalibrierung, die
> sicher bei ein paar tausend Stück nennenswert auftritt? Wird da jeder µC
> vorher getestet? Das betrifft ja sicher auch die ganzen Microchip-PICs
> mit ihren ADC-Inputs, oder?

Die bauen eine vernünftige Schaltng, sie sich auf 1%-Widerstände 
verlässt und dann 8 Taster locker auch an einem Eingang abfragen kann, 
mit etwas Arbeit sogar gleichzeitig, also Mehrtastenfest.

Beo Bachta schrieb:
> Pfusch á la Arduino.

hahaha
Weder die verwendete IDE noch das Framework, der Compiler oder die 
Microcontrollerbasis haben mit dem Problem was zu tun.

Mikki M. schrieb:
> Die interne Referenz ist zwar recht stabil, hat aber typisch +- 10%
> Toleranz vom typ. Nennwert. Lösung wäre hier den Wert im EEPROM bei der
> Inbetriebnahme zu speichern für spätere Korrektur-Berechnungen.

Die Lösung wäre, ratiometrisch gegen die Betriebsspannung zu messen. Da 
liegt schließlich auch der Pullup dran.

von Stefan F. (Gast)


Lesenswert?

Bei zwei Tastern ist es doch ganz simpel:
1
        +--Taster1--+--Taster2--+
2
        |           |           |
3
GND |---+---[===]---+---[===]---+---[===]---o VCC
4
             2,2k   |   2,2k        100Ω
5
                    |
6
                    |
7
                    |
8
                    o Zum A/D Wandler

In Ruhelage sieht der ADC 1/2 der Versorgungsspannung. Der eine Taster 
liefert 0 Volt, der andere liefert VCC. Das lässt sich
trotz aller Toleranzen absolut sicher erkennen.

Der 100Ω Widerstand schützt vor Kurzschluss. Ich habe bewusst weniger 
Ohm vorgeschlagen, damit ein gewisser Mindest-Strom (Wetting-Current) 
durch die Taster fließt, was für die Lebensdauer ihrer Kontakte 
vorteilhaft ist.

In meinem alten Yamaha Receiver haben sie 4 Taster mit unterschiedlichen 
Widerstandswerten verwendet:
1
    +--Taster1--+--Taster2--+--Taster3--+--Taster4--+
2
    |           |           |           |           |          VCC
3
|---+---[===]---+---[===]---+---[===]---+---[===]---+---[===]---o 
4
         R1           R2          R3          R4    |    R5
5
                                                    |
6
                                                    |
7
                                    zum A/D Wandler o

Bei dieser Variante kann der µC zum Programmstart eine Kalibrierung auf 
den Ruhepegel durchführen. Der Rest ist einfache Mathematik. Das schöne 
hierbei ist, dass sogar mehrere gleichzeitig gedrückte Tasten korrekt 
erkannt werden können.

von Martin (Gast)


Lesenswert?

Ok, das war mit Matrix gemeint. Vielen Dank für das Beispiel!

Das Prinzip kenne ich. Jedoch müssen dann die Taster jeweils mit 2 
Kabeln an unterschiedlichen Stellen angeschlossen werden. Da meine 
Schalter ggf. ein paar Meter entfernt liegen, hatte ich nach einer 
Variante gesucht, beide Taster gegen GND zu legen. Spart dann ein Kabel 
;-)

von Stefan F. (Gast)


Lesenswert?

Dann nimmt halt einen Taster ohne Widerstand (0 Volt) und einen mit 47kΩ 
(deutlich mehr als 0 Volt).

von Martin (Gast)


Lesenswert?

Dann wäre der Fall „beide Taster gedrückt“ nicht identifizierbar 
gewesen. Irgendeinen Tod stirbt man immer. Für meinen Zweck wären ext. 
Pullups und 2 Widerstände gegen GND am besten gewesen.

Again what learned !

von Schlaumaier (Gast)


Lesenswert?

Martin schrieb:
> Wie muss ich mir so eine Matrix an den analogen Inputs vorstellen?

Ungefähr so.

https://arduino-projekte.webnode.at/meine-libraries/16er-tastatur/

oder so.

https://arduino-projekte.webnode.at/meine-libraries/16er-tastatur-mit-i2c/


Das ist zwar für eine 16 Tastatur aber es geht für JEDE Tastatur. Bei 
nicht quadratischen Summen (zb. 8) bleibt halt eine Knotenpunkt immer 
auf "aus".

Wobei ich persönlich die I2C Bus Variante bevorzuge, weil nur 2 Kabel 
zur Tastatur. Und da ich bei 2 meiner Projekten die Tastatur "Extern" 
also außerhalb der Hauptplatine hatte, war es mit 4 Leitungen einfach 
als mit ein Kabelbaum = 2 x  Wurzel aus Anzahl_der_tasten.

von Manfred (Gast)


Lesenswert?

Wolfgang schrieb:
> Die Werte für die Entscheidungsschwellen ...
Martin schrieb:
> Das ganze ist ein privates Projekt für eine Servoansteuerung. Wie
> gesagt, die Platinenspezifische Kalibrierung der Werte ist nicht das
> Problem.

Er hat es nicht verstanden, schade um die Mühe:
Beitrag "Re: Analog Inputs liefern unterschiedliche Werte bei verschiedenen Arduino Nanos"

Martin schrieb:
> Wie muss ich mir so eine Matrix an den analogen Inputs vorstellen?

Garnicht, die will digitale Ein- und Ausgänge haben.

Schlaumaier schrieb:
> Ungefähr so.
> xttps://arduino-projekte.webnode.at...
Oh Gott, es hat mal wieder nicht für einen Schaltplan gereicht, nur für 
dusselige Fritzingbildchen.

von Schlaumaier (Gast)


Lesenswert?

Manfred schrieb:
> Garnicht, die will digitale Ein- und Ausgänge haben.

Quatsch.

Analog und Digital ist fast das selbe. Mit einen kleinen Unterschied, 
Digital kennt nur HIGH (Strom) oder LOW (Kein Strom). Analog kennt noch 
das das zwischen, was dann meist digital in 256 Häppchen unterteilt 
wird. ;)

Schaltungstechnisch ist das aber in den hier beschriebenen Fall das 
selbe.

Und ob das Fritzing ist, oder ein "Echter Schaltplan" ist in den Fall 
auch egal. Es geht darum das der User das Prinzip versteht.  Und diese 
Fritzing-Teile sind für so kleine Spielereien prima geeignet.

Aber ist mir klar, das die hoch edelen Ing. hier erst mal ein Schaltplan 
machen. Die Ing. machen viele Pläne bloß in der Praxis kommt dabei 0,NIX 
raus. Beispiele : Siehe Presse. Oder warum kommt alle High-Tech aus 
Asien.

Die Abfrage macht man dann halt in einer Doppelschleife.

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.