Ports mit ADC ansteuern

Gast #2148736
Lesenswert?

Guten morgen! Ich suche nach einer Möglichkeit, mit einem 
Drehpotentiometer 4 Ports eines uControllers (Atmel ATmega8) zu 
schalten. Das Potentiometer schaltet also je nach Drehstellung einen der 
4 Ports auf HIGH.
Ist dies überhaupt möglich? Wenn ja, hättet ihr vielleicht ein kleines 
Codebeispiel, ich steige durch die ADC-Materie noch nicht wirklich durch 
;)
Laut dem ADC-Tutorial muss man ja noch etwas "Hühnerfutter" um das Poti
schalten, muss das wirklich sein? (Die "Auflösung" liegt ja nur bei 4 
Stufen, deshalb ist die Genauigkeit ja eigentlich nicht so relevant)
mfG, Daniel Fröder
#2148743
Lesenswert?

Daniel F. schrieb:
> Guten morgen!

oha!

Daniel F. schrieb:
> Das Potentiometer schaltet also je nach Drehstellung einen der
> 4 Ports auf HIGH.
> Ist dies überhaupt möglich?

Ja das ist trivialst.

Daniel F. schrieb:
> Wenn ja, hättet ihr vielleicht ein kleines
> Codebeispiel, ich steige durch die ADC-Materie noch nicht wirklich durch
> ;)

Schau dir mal das AVR Tutorial an und mach es durch. Es dauert nicht 
lange ist aber gut - wenn man C Programmieren kann.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Daniel F. schrieb:
> Laut dem ADC-Tutorial muss man ja noch etwas "Hühnerfutter" um das Poti
> schalten, muss das wirklich sein? (Die "Auflösung" liegt ja nur bei 4
> Stufen, deshalb ist die Genauigkeit ja eigentlich nicht so relevant)

Das Hühnerfutter besteht hauptsächlich aus höchstens einem Widerstand 
pro Poti - wenn überhaupt. Einfach als Spannungsteiler verschalten. 
Fertig.
Was nötig ist sind die Abblockkondensatoren (100nF) für jeden AVR so wie 
ein Kondensator für die ADC Referenzsspannung. That's it!
#2148755
Lesenswert?

Daniel F. schrieb:
> Laut dem ADC-Tutorial muss man ja noch etwas "Hühnerfutter" um das Poti
> schalten, muss das wirklich sein?

Das ist für Messung mit dem Komparator. An den ADC kannst du das Poti 
einfach so anschliessen.
Eine Seite an +, die andere an GND, die Mitte an den ADC. Refenzspannung 
auf Vcc.

ADLAR-Bit setzen, das Highbyte einlesen und die oberen 4 Bits auswerten, 
wobei dir für deine 4 Schaltzustände auch nur die oberen 2 Bits reichen.

mfg.
Gast #2148768
Lesenswert?

Ginge das eigentlich auch mit Bascom? Das kann ich nämlichhalbwegs :)
@Thomas Eckmann: Was meinst du ADLAR-Bit und wie fragt man die oberen 
Bits ab?
Tut mir leid, wenn die Frage etwas dumm ist, aber ich bin ein blutiger 
Anfänger
Gast #2148780
Lesenswert?

Daniel F. schrieb:
> Ginge das eigentlich auch mit Bascom?
Ja. Definitiv. So etwas ähnliches habe ich damit in meiner Anfangsphase 
auch gemacht. Hier mal was um die grauen Zellen anzuregen:

Initialisierung (Ports definieren, Start ADC, e.t.c)
Beginn Hauptschleife
ADC Auslesen und in Variable übergeben
Alle LEDs ausschalten
Variable auf Wert prüfen und mit if...else...endifs oder select...cases 
die gewünschte LED einschalten.
Ende Hauptschleife
#2148793
Lesenswert?

Daniel F. schrieb:
> Ginge das eigentlich auch mit Bascom?

Ach du Scheiße! Ja geht.

Daniel F. schrieb:
> Was meinst du ADLAR-Bit

ADMUX – ADC Multiplexer Selection Register
Bit 5 – ADLAR: ADC Left Adjust Result

Das Ergebnis der Wandlung ist 10 Bit groß und landet in 2 Registern. Die 
unteren 8 Bits in Register ADCL die beiden oberen in ADCH. Durch Setzen 
des ADLAR-Bits wird das Ergebnis ausgegeben, indem die oberen 8 Bits in 
ADCH, die unteren beiden in ADCL landen.

Wenn man jetzt nur das ADCH verwendet, hat man praktisch einen 
8-Bit-Wandler.
Von dem Ergebnis nimmt man dann für deine Anwendung nur die beiden 
oberen Bits und wertet entsprechend aus.

mfg.
#2148823
Lesenswert?

aber ganz so einfach wie es dargestelt ist es auch nicht
angenommen 8 Bit in 4 Abstufungen wären 0-63 = Stufe 1; 64-128 = Stufe 
2;....

wenn jetzt ein Wert gemessen wird der sich immer um die 63-65 bewegt 
wird immer zw. Stufe 1 und 2 umgeschaltet. Hier muss man also schon 
etwas programmieren damit das nicht passiert, also nur auf Änderungen >5 
reagieren damit man auch sicher sein kann es wurde am Poti gedreht und 
es kein rauschen ist, man mittelt mehrere Werte oder programmiert tote 
Zonen dazwischen.

z.B. 0-60 = Stufe 1; 61-70 keine Änderung des vorherigen Wertes; 70-120 
Stufe 2;.....

einfach ausprobieren, dann kommt man von selber drauf.
Gast #2151210
Lesenswert?

Hallo! Ich habe das ganze mal getestet, funktioniert auch vom Prinzip 
her gut. Ich habe den 10-Bit ADC in 4 Teile geteilt (~256). Aber obwohl 
ich ein lineares Poti benutze, sind von den 270 Grad des Potis etwa 180° 
schon größer als 770, also sind die 1023 nicht regelmässig auf das 
Potentiometer verteilt :( wisst Ihr, wie man das korrigieren kann, dass 
die 270° in gleichmässige, 4 Teile geteilt werden? Gruß,
Daniel Fröder
Gast #2151493
Lesenswert?

Du hattest recht, der Widerstandsverlauf war logarithmisch, jetzt gehts!
Wenn ich nun aber 4 LEDs anschliesse, leuchten manchmal 2 LEDs auf 
einmal. Ich hatte den Verdacht, das das am Rauschen des Potis liegen 
könnte, aber nachdem ich die Zahlenbstände der if-Abfragen um 5 höher 
wie die letzte gemacht habe, war der Effekt immer noch da :S Wisst Ihr 
da eine Lösung?
Gast #2151623
Lesenswert?

>aber nachdem ich die Zahlenbstände der if-Abfragen um 5 höher
>wie die letzte gemacht habe, war der Effekt immer noch da :S

Etwas diffus ausgedrückt... Eine Hysterese sollte diesen Effekt 
wirkungsvoll verhindern. Du musst dazu die Umschaltschwellen für eine 
Änderung des ADC-Wertes in Richtung "runter" etwas niedriger legen (der 
Wert dieser Abweichung ist die Hysterese) als die Umschaltschwellen für 
eine Änderung in Richtung "rauf". Um das per Software zu realisieren 
musst Du bei jedem neu eingelesenen ADC-Wert prüfen, ob er niedriger 
oder höher als sein Vorgänger ist, und dementsprechend die 
Umschaltschwellen setzen. Wenn die Hysterese größer ist als die 
Amplitude der rauschbedingten ADC-Schwankungen tritt der Effekt nicht 
mehr auf. Einen geeigneten Hysteresewert würde ich einfach durch 
Ausprobieren bestimmen.

Programmierbeispiel:

IF (ADCValue>ADCValueOld) THEN
  {
  State = 0
  IF (ADCValue>Threshold1+HYST) THEN State = 1
  IF (ADCValue>Threshold2+HYST) THEN State = 2
  IF (ADCValue>Threshold3+HYST) THEN State = 3
  }
ELSE
  {
  State = 0
  IF (ADCValue>Threshold1-HYST) THEN State = 1
  IF (ADCValue>Threshold2-HYST) THEN State = 2
  IF (ADCValue>Threshold3-HYST) THEN State = 3
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren