Forum: Mikrocontroller und Digitale Elektronik Zeitsteuerung über Analogwert


von Andy P. (wudinudi)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

Ich bin neu in der Mikrokontroller technik und versuche mich momentan 
selbst einzuarbeiten. Hab schon ein bischen rumgebastelt und wollte mir 
eine Ventilsteuerung bauen, die ich über Potentiometer steuere.
Es handelt sich um eine "Befüllungsanlage". Wenn ich einen Knopf drücke 
soll das erste Ventil aufmachen und das alte Wasser aus einer Flasche 
ablassen. Wie lange das Ventil öffen ist soll man vorher über das erste 
Potentiometer einstellen können! Nach der eingestellten Zeit Schließt 
das erste Ventil und das zweite Ventil zum Befüllen der Flasche wird 
geschalten. Auch dieses soll nur begrenzte zeit geöffnet sein, 
einstellbar über ein zweites Poti. Danach schließt es wieder und das 
Programm wartet auf ein neues Schaltsignal.
Ich habe bereits ein Programm entworfen und auch beigefügt, allerdings 
hat es einen fehler und so sehr ich es probiere, schaff ich es nicht.
Im Bereich von 0-etwa 65% des Potis ist das Ventil so schnell, das man 
nicht mal abfallende spannung oder ein leises knacken des Relais beim 
anziehen hört. zwischen 65 und 70% lässt es sich optimal einstellen und 
alles über 70% ist unglaublich langwierig, (wartezeiten von minuten...)

Bitte könnt ihr mir nicht helfen welchen Fehler ich gemacht habe?


Technische Infos:
ich benutze einen ATMEGA 8, die Ventile sind über PB2 und PB3 
angeschlossen, Taster auf PC2 und die Potis auf Analogeingang 0 und 1
Die Spannung der Potis lässt sich ganz normal von 0-5V ändern(linear)
AREF ist über einen 100nF Kondensator zu VCC verbunden.

Lg Andy

von Otto (Gast)


Lesenswert?

Entweder geben Deine Potis keine lineare Spannung aus oder
Du wertest den ADC verkehrt aus.

Poste Programm + Schaltung

Otto

von Frank L. (franklink)


Lesenswert?

Hallo Andy,

Deine Vorgehensweise ist suboptimal.

1. kein Poti ist wirklich liear. Wenn Du einen Poti einsetzen möchtest 
um die Zeit für die Befüllung einstellen zu können, bleibt Dir nicht 
anderes übrig als den Poti auszumessen und Dir eine Stützwerttabelle zu 
erzeugen. Aus der Du die notwendigen Werte nach der AD-Wandlung 
ausliesst bzw. ermittelts.

2. Als Lösung würde ich einen Timerinterrupt für die Zeitmessung 
implementieren der im 100ms Takt ausgelösst wird.

3. In der Main-Schleife werden nur die Zustände die durch den Timer 
erzeugt werden verwaltet und durchlaufen.

D.h. mit Deinem Taster löst Du die Initialisierung der Zustände für 
Ventil1 und Ventil2, die Timerzeiten und die Befüllung aus. Der Timer 
zählt die entsprechenden Variablen je nach Zustand hoch. Die 
Mainschleife prüft die Zustände und reagiert.

Gruß
Frank

von Yaroslav (Gast)


Lesenswert?

AREF muss mit einem kondensator an GND und nicht an VCC verbunden 
werden.

Ich denke, die Potis werden für die Anwendung linear genug sein. Das 
Problem liegt wohl eher im Programm. Poste es, dann kann man dir 
weiterhelfen.

Gruß, Yaro

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Das Problem liegt wohl eher im Programm.
> Poste es, dann kann man dir weiterhelfen.
Das hängt doch an ... :-o
Ein nettes Detail darin:
1
  {;}

Du hast einen 12-Bit-Wandler...
1
    for (AW = ADCW; AW<255; AW++) // Anzahl der Wiederholungen der Schleife
Was passiert hier wenn ADCW >= 256 ist?

EDIT:
das mit den 216.14 ms hat sich erledigt ;-)

von Yaroslav (Gast)


Lesenswert?

Das mit dem Anhang habe ich übersehen (bin nicht so oft in diesem 
Forum).

Soweit ich weis, hat der ATmega8 einen 10bit ADC (keinen 12bit), 
deswegen musst du, wie Lothar Miller richtig andeutete den Wert in der 
for-Schleife auf 1023 setzen, damit es funktioniert.

Gruß, Yaro

von Andy P. (wudinudi)


Lesenswert?

Hallo,

Erstmal dnake an alle für die schnelle Antworten.

@Frank:
Es ist nicht sooo wichtig, das das Potentiometer auf die letzte Stelle 
genau funktioniert, es geht mir hauptsächlich um die Funktion des 
Programms, es darf ruhig um eine Sekunde verzögert wenn wirklich sein 
;-)

> D.h. mit Deinem Taster löst Du die Initialisierung der Zustände für
> Ventil1 und Ventil2, die Timerzeiten und die Befüllung aus. Der Timer
> zählt die entsprechenden Variablen je nach Zustand hoch. Die
> Mainschleife prüft die Zustände und reagiert.

Hm... wie meinst du das, das die mainschleife die Zustände prüft und 
reagiert? Die mainschleife mit der Initialisierung wird doch nicht mehr 
erreicht, da das Programm in der whileschleife verbleibt?


@ Lothar
> EDIT:
> das mit den 216.14 ms hat sich erledigt ;-)

Was hast du damit gemeint?


@ Lothar und Yaroslav
Stimmt!, ich habe nochmal im Datenblatt nachgesehen und es handelt sich 
um einen 10 bit AD Wandler, heißt der Wert muss auf 1023 umgeschrieben 
werden!

Allerdings bin ich mir nicht sicher, ob das den kompleten Fehler behebt, 
da das Poti am Anfang des Drehbereichs das Ventil so extrem schnell 
abfallen lässt.

Danke für eure Mühe und Hschnelle Hilfe!

von Andy P. (wudinudi)


Lesenswert?

Ahhh!

OK ich hab jetzt einfach mal den wer mit 1023 ersetzt und schau einer 
hin schon funktionierts!

Danke Leute, habts mir echt geholfen. Darauf hät ich echt selbst kommen 
müssen -.-

Lg Andy

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>> EDIT:
>> das mit den 216.14 ms hat sich erledigt ;-)
> Was hast du damit gemeint?
Ich hatte da ursprünglich was zum Thema _delay_ms() und der magischen 
Zahl 216.14 ms stehen (du kannst im Forum suchen, wenn dich das Thema 
interessiert). Das hatte aber mit deinem Problem nichts zu tun.

> Danke Leute, habts mir echt geholfen.
De nada  ;-)

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.