Pages: [1]   Go Down
Author Topic: 16 verschiedene Schalterzustände über einen Analogeingang  (Read 1804 times)
0 Members and 1 Guest are viewing this topic.
Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 511
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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


* Drehkodier.png (13.84 KB, 1059x615 - viewed 51 times.)

* Drehkodier2.png (8.41 KB, 581x337 - viewed 38 times.)
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 311
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3495
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Check out my experiments http://blog.blinkenlight.net

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 511
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3495
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Check out my experiments http://blog.blinkenlight.net

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1130
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 311
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.
Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 511
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
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 :-(
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.
Quote
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 1024*R1/(R1+Rges, also 1024*1200/(1200+3488)=262
bei 10: Parallelschaltung von R3 und R5 (0101), entsprechend eingesetzt ergibt sich 286 als AD-Wert.
Logged

MK (D)
Offline Offline
Full Member
***
Karma: 8
Posts: 170
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Gruß Peter

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 311
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Jetzt habe ich den Fehler in meiner Berechnung smiley-confuse

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

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3495
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

Quote
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.
Logged

Check out my experiments http://blog.blinkenlight.net

MK (D)
Offline Offline
Full Member
***
Karma: 8
Posts: 170
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
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.
Logged

Gruß Peter

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 511
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Wenn der ADC nicht explizit deaktiviert wird, dann läuft er auch im Sleep Mode und verbraucht dabei auch Strom.
.. 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
Davon abgesehen braucht die SR Lösung weniger Bauteile. Beim Bestücken finde ich eine hohe Teilezahl schlimmer als eine hohe Pinzahl.
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.


* Drehkodier3.png (35.5 KB, 1066x331 - viewed 29 times.)
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 311
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dein Sheet sieht fast so aus wie meins smiley-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 (6.07 KB, 359x286 - viewed 27 times.)
Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 511
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: