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
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.
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.
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%.
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)
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?
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.
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?
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.
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.
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)
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.
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.
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.
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.
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.
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.
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.
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.
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?
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.
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:
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.
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
;-)
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 !
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.
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.
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.