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
Entweder geben Deine Potis keine lineare Spannung aus oder Du wertest den ADC verkehrt aus. Poste Programm + Schaltung Otto
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
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
> 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 ;-)
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
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!
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
>> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.