Pfad: Home => AVR_DE => Anwendungen => Schalter und Tasten ADC => DIP-Schalter
Maeuseklavier Anwendungen von
AVR-Einchip-Mikrokontrollern AT90S, ATtiny, ATmega und ATxmega
DIP-Schalter und Widerstände an einem ADC-Eingang
Logo

Lesen von DIP-Schaltern mit einem AD-Wandler


1 DIP-Schalter (Mäuseklaviere)

DIP-Schalter Es kommt recht oft vor, dass man DIP-Schalter dazu benutzt, um zwei, drei oder mehr verschiedene Einstellungen während der Laufzeit eines Programms zu ändern. Wenn man derer vier braucht, kann man die vier Schalter an vier Portpins anbringen, die man mit dem DDRn-Port zu Eingängen erklärt, deren Pull-Up-Widerstände man mit dem Port PORTn einschaltet und deren PINn-Port man immerzu abfragt, ob und welche Schalter den Eingang auf Null gezogen haben.

DIP-Schalter an einem ADC Es geht aber auch anderst: mit dem Schaltbild links kann man die Anzahl benötigter Pins von 4 auf 1 reduzieren und die Spannung an dem einen Pin per AD-Wandler misst. Durch geschickte Auswahl der vier Widerstände kann man erreichen, dass die 16 verschiedenen Zustände des Klaviers jede ihre eigene Spannung erzeugt.

Eine Warnung gleich zu Beginn: versuche das nicht mit mehr als vier Schaltern, es wird misslingen. Nimm dann besser zwei ADC-Eingänge für 6 oder 8 Schalter.

Es ist klar, dass dazu vier verschiedene Widerstände nötig sind, damit jeder Schalter eine doppelt so große Spannung produziert als der Vorausgehende. Unglücklicherweise ist die Mathematik der parallel geschalteten oberen Widerstände, die mit Plus verbunden sind, etwas eigenwillig:
Rhoch = 1 / (1 / R1 + 1 / R2 + ... + 1 / RN)

Und daher die resultierenden Spannungen auch:
UADC = Uplus * R0 / (R0 + Rhoch)

Das ist alles andere als einfach und linear.

Daher ist das Aussuchen von geeigneten Widerständen auch eher eine Aufgabe für eine Tabellenkalkulation oder, besser, eine dynamische Näherungsaufgabe.

2 Optimierung der Widerstände

Die Optimierung hat zu berücksichtigen, dass
  1. Widerstandswerte in Reihen organisiert sind. Die E12-Reihe enthält 12 verschiedene Werte pro Dekade (1.0, 1.2, 1.5, ..., 8.2), während E24 derer 24 hat (1.0, 1.1, 1.2, 1.3, 1.5, ..., 9.1). Theoretisch gibt es auch E48 und E96, aber die gibt es praktisch nicht zu kaufen.
  2. die aufgedruckten Widerstandswerte nur innerhalb der Produktionstoleranz genau sind. Zu kaufen gibt es derer mit +/-5%, +/-2% und +/-1%. Misst Du den Widerstandswert manuell aus und sortierst allzu ungenaue aus, kannst Du weniger Toleranz erzielen, aber für Dutzende Nachbauten ist die Methode unpraktisch.
  3. der ADC in zwei Modi messen kann: als 10- oder 8-Bit-ADC. Noch höhere Auflösungen benötigen extra Chips und sind verdammt empfindlicher gegenüber Einstreuungen durch Rauschen, NF und HF. Daher vergiss das besser.
mousepiano.exe bei der Arbeit Diese Software, geschrieben in Lazarus Pascal and ausführbar unter Windows- und Linux (Wine)-Betriebssystemen erledigt die länglichen Näherungsprozesse.

Du kannst wählen:
  1. die Anzahl der DIP-Schalter (2, 3 oder 4),
  2. die Widerstandsreihe (E12, E24 oder E48 - wenn Du einen Händler findest der die auf Lager hat),
  3. die Widerstandstoleranz (5%, 2%, 1% oder 0.5% und 0.1% für handverlesen),
  4. die ADC-Auflösung (8 oder 10 Bits).
Die Schaltfläche "Restart" setzt die Widerstände auf ihren Anfangswert. Bitte beachten, dass jede Näherung zu anderen Widerstandskombinationen führen kann, da die Auswahl des nächsten anzunähernden Widerstands zufällig erfolgt.

Durch Drücken der Schaltfläche "Iterate1" wird
  1. ein Widerstand zwischen 1 und N ausgewählt,
  2. der nächsthöhere und der nächstniedrige Wert der Widerstandsreihe ermittelt,
  3. die quadrierte Summe der Abweichungen der Spannungen vom Sollwert gemittelt, und
  4. der Widerstand mit der niedrigsten gemittelten Summe ausgewählt.
Alle Werte werden in einem Fenster angezeigt, so dass der Näherungsprozess verfolgt werden kann.

Die Schaltfläche "Iterate100" wiederholt 100 solcher Näherungen auf einmal, gibt aber keine Zwischenwerte aus.

Die Widerstände sind im Fenster rechts oben dargestellt. Wenn Du in eine Zeile der Tabelle klickst, kannst Du den betreffenden Widerstandswert mit der Schaltfläche "Change Rn" manuell ändern. Widerstandswerte werden ausschließlich aus der eingestellten E-Reihe entnommen.

Das Ergebnisfenster unten zeigt an:
  1. den Zielwert der Spannung (in mV/V),
  2. den Nominalwert der Spannung wenn alle Widerstände den aufgedruckten Wert hätten,
  3. die niedrigste und die höchste Spannung, die sich unter ungünstigsten Bedingungen ergäbe,
  4. der nominelle, der niedrigste und der höchste Wert, der sich bei der AD-Wandlung mit der eingestellten Auflösung ergibt.
Bitte beachten, dass die Extrema der Spannungen jeweils unter den ungünstigsten Bedingungen ermittelt sind (niedrig: R0 hat den niedrigsten Toleranzwert, alle anderen liegen an der Toleranzobergrenze). Da dieser Fall selten vorkommen dürfte, kann man es riskieren, versuchshalber die nächstniedrigere Toleranzstufe anzusetzen und zu schauen, ob das noch ok wäre.

Die Schaltfläche "Source code" schreibt eine AVR-Assembler-Datei mit den Tabellenwerten, wie diese hier (Include-Quelldatei hier):

;
; Table for recognizing mouse piano state
;   4 switches, ADC resolution = 1024
;   Resistors E24, tolerance = 0.5%
;     R0 = 4k7
;     R1 = 68k
;     R2 = 27k
;     R3 = 10k
;     R4 = 2k4
;
PianoTab:
.dw 66,68 ; N=1
.dw 150,154 ; N=2
.dw 199,203 ; N=3
.dw 325,330 ; N=4
.dw 356,362 ; N=5
.dw 398,404 ; N=6
.dw 423,429 ; N=7
.dw 675,680 ; N=8
.dw 683,688 ; N=9
.dw 694,700 ; N=10
.dw 701,707 ; N=11
.dw 722,728 ; N=12
.dw 728,734 ; N=13
.dw 737,742 ; N=14
.dw 742,747 ; N=15
.dw 0,0 ; No more stages
;
; (+)
;  |   __    / S4
;  o--|R4|--O O--
;  |   --        |
;  |   __    / S3|
;  o--|R3|--O O--o
;      --        |
;  |   __    / S2|
;  o--|R2|--O O--o
;      --        |
;  |   __    / S1|
;   --|R1|--O O--o--> ADC input
;      --        |
;                -
;               | |R0
;               |_|
;                |
;               ---
;

Schaltplangrafik Die Schaltfläche "Schematic" zaubert einen Schaltplan mit den aktuellen Werten auf den Schirm. Durch Klicken auf das Bild kann man es als PNG- oder BMP-Grafik speichern.



©2018 by http://www.avr-asm-tutorial.net