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?
Martin schrieb: > Wie machen denn Firmen mit Großserienfertigung diese Kalibrierung Die machen keinen solchen Pfusch á la Arduino.
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)
Beitrag #6673983 wurde von einem Moderator gelöscht.
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.
Leg die Schaltung als Matrix an, dann brauchst du den Unsinn mit den Widerständen nicht.
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.
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.
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 nimmt halt einen Taster ohne Widerstand (0 Volt) und einen mit 47kΩ (deutlich mehr als 0 Volt).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.