Forum: Mikrocontroller und Digitale Elektronik Ports mit ADC ansteuern


von Daniel F. (Gast)


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

von Lehrmann M. (ubimbo)


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!

von Thomas E. (thomase)


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.

von Daniel F. (Gast)


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

von Oliver Heinrichs (Gast)


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

von Oliver H. (Firma: OliverHeinrichs.de) (dobson)


Angehängte Dateien:

Lesenswert?

So könnte dann ein Schaltplan aussehen

von Thomas E. (thomase)


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.

von Thomas (kosmos)


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.

von Thomas E. (thomase)


Lesenswert?

Thomas O. schrieb:
> wenn jetzt ein Wert gemessen wird der sich immer um die 63-65 bewegt

Theoretisch ja. Praktisch ohne Bedeutung.

mfg.

von Daniel F. (Gast)


Lesenswert?

Vielen Dank für Eure Antworten! Ich werde das ganze heute oder morgen 
mal testen ;)

von Daniel (Gast)


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

von Kalletronic (Gast)


Lesenswert?

Hi, das klingt nach einem logarytmischen Poti. Kannst ja mal den 
Widerstand am Schleifer messen und kontrollieren ob sich der linear 
verändert oder nicht

Gruß Kalle

von Daniel (Gast)


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?

von Weingut P. (weinbauer)


Lesenswert?

Mittelwert bilden über x Messungen ... Ringpuffer

oder gleitender Mittelwert

von oldmax (Gast)


Lesenswert?

Hi
Klar wissen wir woran es liegt... wie schon des öferen an Zeile 23
Gruß oldmax

von Daniel (Gast)


Lesenswert?

Wie kann man das in Bascom lösen? Ich stehe da irgendwie grade auf dem 
Schlauch :(

von Vuvuzelatus (Gast)


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
  }

von Thomas (kosmos)


Lesenswert?

die leuchten bestimmt nicht beide gleichzeitig sondern abwechselnd, also 
genau das Problem das ich oben beschrieben habe. Da das Auge aber sehr 
träge ist sieht es so aus als ob beide gleichzeitig leuchten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.