Analog Inputs liefern unterschiedliche Werte bei verschiedenen Arduino Nanos

Gast #6673524
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
Gast #6673616
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%.
Gast #6673772
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)
Gast #6673826
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?
Gast #6673834
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?
Gast #6673960
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.
Gast #6673967
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.
Beitrag #6673983 wurde von einem Moderator gelöscht.
Gast #6674026
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.
Angehängte Dateien:
#6674034
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.
Gast #6674040
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.
Gast #6674068
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.
#6674073
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.
Gast #6674098
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.
Gast #6674124
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.
#6674257
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.
Gast #6674283
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.
Gast #6674309
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 
;-)
Gast #6674322
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 !
Gast #6674887
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.
Gast #6675146
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.
Gast #6675168
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren