16 verschiedene Schalterzustände über einen Analogeingang

Hallo,
für mein Projekt Timelapse Timer für Canon wollte ich unbedingt einen ATtiny85 einsetzen, weil der so schön klein ist und noch in meiner Bastelkiste lag.
Über einen Drehkodierschalter mit 16 Stellungen (KDR 16: Dreh-Codierschalter, 16 Positionen, vertikal bei reichelt elektronik) soll dem Programm gesagt werden, welche Zeitverzögerung gilt.
Eigentlich benötigt der Schalter 4 digitale Eingänge, der ATtiny hat aber nur 5, von denen ich bereits 2 als Ausgänge für die Ansteuerung von Focus und Auslöser benötige.
Mit der nachfolgenden Schaltung und dem Programmteil habe ich es geschafft die 16 Zustände des Schalters über einen Analogeingang des ATtiny einzulesen.
Ich habe lange rumgerechnet, bis ich möglichst große und gleichmäßige Abstände zwischen den Widerstandswerten der Stufen bekam. Die Widerstandswerte sind:
R1 (Comon) = 1k2
R2 (Bit 1) = 33k
R3 (Bit 1) = 15k
R4 (Bit 1) = 8k2
R5 (Bit 1) = 3k9
Die Spannung über R1 wird mit VCC als Referenz eingelesen, damit ist der Wert unabhängig von Schwankungen der Versorgungsspannung. Die Grafik zeigt die Verteilung der gemessenen Digitalwerte.
Mit dieser Funktion wird der Wert ausgewertet

byte kodierer() {
  int wert=analogRead(1);
  if (wert >=346 ) return 15;
  if (wert >= 330) return 14;
  if (wert >= 312) return 13;
  if (wert >= 296) return 12;
  if (wert >= 280) return 11;
  if (wert >= 260) return 10;
  if (wert >= 238) return 9;
  if (wert >= 216) return 8;
  if (wert >= 192) return 7;
  if (wert >= 166) return 6;
  if (wert >= 138) return 5;
  if (wert >= 112) return 4;
  if (wert >= 86) return 3;
  if (wert >= 52) return 2;
  if (wert >= 16) return 1; 
  else return 0;
}

Ich hoffe, dass diese Funktion in dem ein oder anderen Projekt hilfreich ist. Für Kommentare bin ich immer dankbar. Vielleicht schafft es ja jemand, dass die Abstände der Digitalwerte noch besser auf die 10Bit verteilt werden. Das komplette Timelapse Projekt wird demnächst veröffentlicht.
Gruß
Reinhard

Drehkodier2.png

Warum hast du denn kein Poti genommen? Ich vermute mal die Einstellung wird für die Impulszeit notwendig sein?

Am Rande bemerkt verstehe ich aber die Schaltung nicht. Der Drehcodierer schaltet deine benannten Widerstände (3,9 8,2 15 33) parallel. Durch die BCD Codierung dürfte sich dann aber kein linearer Verlauf der Spannung an R1 ergeben?!

Schieberegister sind die bessere Wahl. Und man kann ein SR auch mit nur einem Pin anschliessen.

Das was Du tust wird Dich verfolgen wenn im Sommer die Temperaturen höher sind und Du plötzlich andere Widerstandswerte bekommst. Ich würde sowas nicht tun.

Mardetuino:
Warum hast du denn kein Poti genommen? Ich vermute mal die Einstellung wird für die Impulszeit notwendig sein?

Weil ein Poti nicht "rastet" und ich eine genaue Einstellung haben wollte. Jede Schalterstellung steht für die Zeit zwischen zwei Fotos, In der SW sind dafür feste Einstellungen vorgesehen.

Mardetuino:
Am Rande bemerkt verstehe ich aber die Schaltung nicht. Der Drehcodierer schaltet deine benannten Widerstände (3,9 8,2 15 33) parallel. Durch die BCD Codierung dürfte sich dann aber kein linearer Verlauf der Spannung an R1 ergeben?!

Die Kurve ist ja auch nicht linear. Ich habe lange an der Kombination der Widerstände rumgetestet, bis ich diese Ergebnis hatte. Wenn du Interesse hast kann ich dir die Excel Tabelle zur Verfügung stellen.

Wie geht das - Schieberegister mit nur einem Pin? Hast du eine Schaltung dafür? Damit müsste ich dann den Drehkodierer einlesen. OK, wenn das funktioniert hätte ich zumindest ein IC und einen Stromverbraucher mehr.

Die Sicherheitsspanne bei den Analogwerten ist eigentlich ziemlich groß. Ich werde das mal simulieren. Mal sehen, ob ich Informationen zu der Temperaturabhängigkeit von Widerständen finde. Man könnte das ja auch aktiv über einen NTC kompensieren :wink:

Und ein Schieberegister verbraucht nur Strom solange Du es "bewegst". Dein ADC hingegen braucht in der Regel sehr viel mehr Strom. Wenn Du ein SR statt ADC nimmst und den ADC dann abschaltest brauchst Du unterm Strich vermutlich sogar weniger Strom.

Was hälst von dem PCF8574 I2C PortExpander den kannst du ohne weiteres an dem Attiny84 betreiben. Ich habe schon selber gut erfolge mit der TinyWire über die interne TWI-SChnittstelle gemacht. Damit hast du 6 Eingänge bzw. Ausgänge mehr (der pcf hat 8 I/Os aber du musst zwei vom Tiny opfern für I2C).
Gruß
Der Dani

Weil ein Poti nicht "rastet" und ich eine genaue Einstellung haben wollte. Jede Schalterstellung steht für die Zeit zwischen zwei Fotos, In der SW sind dafür feste Einstellungen vorgesehen.

Die könntest du ja auch rastend programmieren (genau wie den Dekoder). Der Vorteil wäre dass du den ganzen Bereich von 0 bis 1023 nutzen könntest. Du bräuchtest nur noch eine kleine Skala...

Könntest du mal die Spannung am R1 für zwei unterschiedliche Werte vorrechnen z.B. Wert 9 und 10.

Interessanter Ansatz, müsste man echt mal ausprobieren, ob das auch unter Temperatur stabil läuft. Immerhin hätte man 2 IC's mehr zu verbauen :frowning:
Der Strombedarf ist nicht so entscheidend. Der AD und die Versorgung des Widerstandsnetzes wird nur bei Inbetriebnahme kurz zum einmaligen messen eingeschaltet (< 1 Sekunde). Im übrigen ist der ATtiny die meiste Zeit sowieso im Sleep-Mode.
@ volvodani: I2C am ATtiny - interessant - wollte ich sowieso immer schon ausprobieren.
@Mardetuino: vielleicht doch gar nicht so schlecht der Ansatz, zumindest spielt dann der Temperaturkoeffizient keine Rolle mehr.

Der Temperaturkoeffizient liegt für diesen Widerstandsbereich (1k-100k) bei ca. +300ppm/°C. Also mal mit -10° als Extrem gerechnet bei ca. +30*300ppm=9000ppm=0,9%. Das spielt so gut wie keine Rolle, wenn sich alle Widerstände in die gleiche Richtung ändern. In der Realität kann man davon u.U. nicht ausgehen. Nicht umsonst gibt der Hersteller plus/minus xx ppm an. Mehr Sorge macht mir da noch die Herstellungstoleranz. Das kann man zwar durch ausmessen und per SW-Kompensation ausgleichen ist aber umständlich.

Mardetuino:

Weil ein Poti nicht "rastet" und ich eine genaue Einstellung haben wollte. Jede Schalterstellung steht für die Zeit zwischen zwei Fotos, In der SW sind dafür feste Einstellungen vorgesehen.

Könntest du mal die Spannung am R1 für zwei unterschiedliche Werte vorrechnen z.B. Wert 9 und 10.

gerne
R1 und die Widerstände oberhalb des Kodierschalters bilden einen Spannungsteiler. Je nach Schalterstellung werden unterschiedliche Kombinationen von Parallelschaltungen der Widerstände erreicht.
bei 9: Parallelschaltung der Widerstände R2 und R5 (weil 1001), also Rges=1/(1/R5+1/R2) -> 3488 Ohm, mit R1=1k2 im Spannungsteiler und 10Bit Auflösung ist das ein Digitalwert von 1024R1/(R1+Rges, also 10241200/(1200+3488)=262
bei 10: Parallelschaltung von R3 und R5 (0101), entsprechend eingesetzt ergibt sich 286 als AD-Wert.

Ich halte Reinhards Lösung für sehr gut, maximales Ergebnis bei minimalstem Aufwand.
Hier versuche ich mich gerade an einer Wochenzeitschaltuhr in ähnlicher Art:
Tageszeit wird über eine Widerstandsmatrix mit 2 Drehschaltern an analog_in eingelesen,

  1. Schalter 0 | 10 | 20, 2. Schalter 0-9
    Aufgebaut ist es noch nicht, aber rein rechnerisch (Idealwiderstände E12-Reihe) komme ich
    bei 5Volt auf eine minimalste Differenz von 51mV zwischen den einzelnen Schaltstellungen,
    womit eigentlich sämtlich mögliche (hier 30, 24 brauch ich) Stellungen sicher ausgewertet werden müßten.
    Eine eventuelle Temperaturdrift sollte da keine große Rolle spielen.
    Kleinste Widerstandskombination ist hier 680 + 4700 Ohm, also Stromaufnahme <1mA
    Größte Widerstandskombination 44380 + 32360 Ohm (Reihenschaltung), HF-Einstreuung wahrsch. auch kein Thema.

Jetzt habe ich den Fehler in meiner Berechnung :~

Fütter dein Excel mal mit diesen Werten:
R1 bis R5: 4,7 39,0 18,0 10,0 4,7

Der Strombedarf ist nicht so entscheidend. Der AD und die Versorgung des Widerstandsnetzes wird nur bei Inbetriebnahme kurz zum einmaligen messen eingeschaltet (< 1 Sekunde). Im übrigen ist der ATtiny die meiste Zeit sowieso im Sleep-Mode.

Wenn der ADC nicht explizit deaktiviert wird, dann läuft er auch im Sleep Mode und verbraucht dabei auch Strom.

Der Temperaturkoeffizient liegt für diesen Widerstandsbereich (1k-100k) bei ca. +300ppm/°C. Also mal mit -10° als Extrem gerechnet bei ca. +30*300ppm=9000ppm=0,9%. Das spielt so gut wie keine Rolle, wenn sich alle Widerstände in die gleiche Richtung ändern. In der Realität kann man davon u.U. nicht ausgehen. Nicht umsonst gibt der Hersteller plus/minus xx ppm an. Mehr Sorge macht mir da noch die Herstellungstoleranz. Das kann man zwar durch ausmessen und per SW-Kompensation ausgleichen ist aber umständlich.

In der Regel legt man Schaltungen so aus, daß sie im Toleranzbereich auch garantiert funktionieren. D.h. auch dann wenn die Widerstände sich gegen Dich "verschwören". Der Trick mit den Widerständen ist wirklich alt und es gibt einen guten Grund warum man den in professionellen Schaltungen so gut wie nie sieht. Ich hatte das Problem mal mit 10 Schaltern und fand die Lösung auch ganz toll. Bis ich dann im Sommer 2 Wochen lang das von mir bereits geschilderte Temperaturproblem entdecken durfte.

Ich mache sowas nie wieder mit Widerständen. Davon abgesehen braucht die SR Lösung weniger Bauteile. Beim Bestücken finde ich eine hohe Teilezahl schlimmer als eine hohe Pinzahl.

[quote author=Udo Klein link=topic=139982.msg1051614#msg1051614 date=1356964856]
Der Trick mit den Widerständen ist wirklich alt und es gibt einen guten Grund warum man den in professionellen Schaltungen so gut wie nie sieht[/quote]
Ja, dieser Grund wird sein das man im professionellen Bereich ganz andere Möglichkeiten hat,
es dort um große Stückzahlen geht und nicht um ein absolutes Einzelstück wie im Hobbybereich.

Mardetuino:
Fütter dein Excel mal mit diesen Werten:
R1 bis R5: 4,7 39,0 18,0 10,0 4,7

Schau dir dazu den anhängenden Screenshot an. Ich hoffe, das ist selbsterklärend

.. Deaktivierung des ADC ist bereits programmiert, der Stromverbrauch bei Sleep liegt irgendwo im 10-30 uA Bereich, leider kann ich so genau nicht messen, aber danke für deine Tips

Ich will jetzt nicht kleinlich sein, aber ich brauche 5xR, die SR Lösung zusätzlich 1xR, 2 IC's +Diode +C (konnte ich mir jetzt leider nicht verkneifen)
Also ich gehe das Risiko mal ein und teste mal mit finalem Layout bei verschiedenen Temperaturen. Wenn ich das Teil irgendwann mal vermarkten wollte, werde ich die i2c Porterweiterung bevorzugen.

Dein Sheet sieht fast so aus wie meins :wink:

Sind jetzt meine Werte nicht besser, im Gegensatz zu deinen? Du bekommst eine höhere Spannung und die Standardabweichung im Delta ist auch höher.

diagramm.png

Hallo Marteduino,
das kleinste Delta ist mit deinen Werten gleich groß wie bei meinen, nämlich 15. Die Anzahl der Deltas > 25 ist bei deinen Werten allerdings besser, bedeutet also bei Drifts der Widerstandswerte eine höhere Trefferquote. Wenn ich noch zu Temperaturtests komme, werde ich das mit diesen Werten mal ausprobieren.
Gruß
Reinhard