Go Down

Topic: 16 verschiedene Schalterzustände über einen Analogeingang (Read 1 time) previous topic - next topic

erni-berni

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 (http://www.reichelt.de/Dip-Kodierschalter/KDR-16/3/index.html?;ACTION=3;LA=446;ARTICLE=9250;GROUPID=3287;artnr=KDR+16;SID=13TmKCyH8AAAIAAHb5YtI2a4c11519feceebd4f977687166b19f4) 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
Code: [Select]

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

mde110

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?!

Udo Klein

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.
Check out my experiments http://blog.blinkenlight.net

erni-berni


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.

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.

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

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.

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.

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 ;-)


Udo Klein

http://hackaday.com/2011/11/23/reading-inputs-from-shift-registers-using-just-one-single-pin/

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.
Check out my experiments http://blog.blinkenlight.net

Go Up