PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ad-Wandler eines ATmega 8



Mercator
25.03.2005, 19:27
Hallo!
Ich möchte den Wasserstand eines Brunnens mit LED's anzeigen lassen.
Den Sensor habe ich mir so vorgestellt (Bild im Attachment):
In den Brunnen führen 2 Leitungen. Auf dem Weg in die Tiefe befinden sich in bestimmten abständen Elektroden (Alufolie oder so). An ihnen befinden sich unterschiedliche Widerstände (R5 ist der größte und R1 der kleinste). Wenn der Wasserstand steigt und die erste Elektrode berührt, dann kann man einen Widerstand etwas kleiner als unendlich messen. Steigt der Wasserstand weiter und erreicht die nächste Elektrode, dann nimmt der Widerstand nochmals ab. Das geht dann so weiter bis zur letzten Elektrode. Soweit die Theorie. Kann das gehen?

Den Widerstand möchte ich von einem ATmega8, den ich mit C programmiere, messen lassen (nach R=U/I), der dann den Wasserstand mit Hilfe von LED's anzeigt.
Mein wesentliches Problem ist aber, wie ich Spannungen und Ströme mit dem ATmgea8 messen kann.

Ich hab schon etwas gegoolged und fast etwas gefunden:
Auf http://www.mikrocontroller.net/tutorial/equipment.htm heißt es:
"Der Port C (PC0-PC5) spielt beim AT90S4433/Atmega8 eine Sonderrolle: mit diesem Port können Analog-Spannungen gemessen werden. Aber dazu später mehr!"

Es gibt aber später nicht mehr dazu. Auf anderen Seiten wird immer wieder gesagt, dass ich PORTA verwenden soll. Ich habe aber keinen Port A!
Was muss ich machen, um Spannungen an diesen Ports messen zu können????

teslanikola
25.03.2005, 19:55
Hallo Mercator ,
es geht doch einfacher:

Die 2 Drähte sind aus widerstandsdraht, je höher das Wasser umso kleiner der Wid.,je tiefer das Wasser umso größer der Wid.

RCO
25.03.2005, 20:02
Also ich finde diese Messung schwierig, weil Salzgehalt etc. den Wert des Wasserwiderstands verändern. Ich würde es einfach so machen, dass ich einen Transistor hinter einen Kontakt hänge, und den Transistor dann an den Mega8. Es wird also Digital gemessen. Jeder Kontakt ist dann unabhängig vom anderen. Dann ist es fast Egal wie hoch der Wasserwiederstand ist.

MFG Moritz

uwegw
25.03.2005, 20:15
Auf anderen Seiten wird immer wieder gesagt, dass ich PORTA verwenden soll. Ich habe aber keinen Port A!

bei einem mega8 liegt der ad-wandler, wie deine erste quelle richtig angibt, auf port C, und es gibt (aufgrund pinmangel) keinen port A.
bei den größerern avrs (m16, m32) ist jedoch der Port A vorhanden und beinhaltete den ad-wandler....


ansosnten würd ich auch raten die signale digtial auszuwerten und an jede elektrode nen kleinen transsitor zu hängen... ist zuverlässiger und auch einfacher zu programmieren...

BlueNature
25.03.2005, 20:59
Ich würde deinen Ansatz mit der Wasserleitfähigkeit nochmals überdenken. Es gibt eine wesentlich bessere Methode um einen Wasserstand zu ermitteln. Im Prinzip baut man sich einen langen rohrförmigen und nach außen isoierten Messfühler auf. Deiser hat innen eine Elektrode und außen das Rohr als zweite Elektrode. Die beiden Fühler die koaxial innenander sind haben eine Isolierschicht und es kann der Wasserstand ermittelt werden. Diei Isolierschicht verhindert eine leitfähige Verbindung über das Wasser. Somit ist die Wassersäule im Rohr das Dielektrikum das diesen im Prinzip gesehenen Kondensator in seiner kapazitiven Eigenschaft verändert. Wenn man nun diesen Kondensator an einem Schwingkreis betreibt stellt sich eine Frequenz ein die je nach Wasserstand anders sein wird weil sich der C-Anteil verändert. Durch Frequenz oder Periodendauermessung kann man nun den Füllstand genau messen.

Grüße Wolfgang

Mercator
25.03.2005, 22:35
Ich würde es einfach so machen, dass ich einen Transistor hinter einen Kontakt hänge, und den Transistor dann an den Mega8.
Das Problem dabei ist, dass das Kabel, das in den Brunnen führt leider nur 2 Adern hat. Wäre es anders, dann wäre deine Idee natürlich die bessere Lösung.


Somit ist die Wassersäule im Rohr das Dielektrikum das diesen im Prinzip gesehenen Kondensator in seiner kapazitiven Eigenschaft verändert. Wenn man nun diesen Kondensator an einem Schwingkreis betreibt stellt sich eine Frequenz ein die je nach Wasserstand anders sein wird weil sich der C-Anteil verändert. Durch Frequenz oder Periodendauermessung kann man nun den Füllstand genau messen.

Klingt toll, ist mir aber zu kompliziert.


Mein eigentliches Problem ist aber noch, wie ich das analoge Signal am Port C mit C (also Port C mit der Sprache C) abrufen kann. Vielleicht kennt ihr ein paar gute Quellen dafür.

BlueNature
25.03.2005, 22:52
Wenn es dir zu komplex ist, warum machst du es dann nicht mit einen mehrgang-Poti an das du eine Schnurrolle schraubst udn eine Schnur die an einen Schwimmer im Brunnen geht. Dann kannst es mit einem Spannungsteiler Schalten udn bekommst meinetwegen eine analoge Spannung von 0-5V udn fertig

Grüße Wolfgang

Mercator
26.03.2005, 00:42
Jaja. Kann man alles machen, doch es geht mir hier weniger um den Sensor, sondern eher darum, wie man Spannungen mit C vom Port C ausliest.

BlueNature
26.03.2005, 01:07
Jaja. Kann man alles machen, doch es geht mir hier weniger um den Sensor, sondern eher darum, wie man Spannungen mit C vom Port C ausliest.

Mit C kann ich dir momentan auch nicht sonderlich weiterhelfen da ich nur Assembler und BASCOM benutze. Ich kann dir nur die prinzipielle Nutzung eines AD-Converters im ATMEGA sagen. Zum einen muß AREF beispilesweise auf +5V liegen genauso wie auch die AVCC auf +5V liegen muß. Wenn das passt kann der 10-Bit ADC schonmal 0-5V messen. Da es natürlich nur einen ADC gibt der gemultiplext ist mit einer Art Wahlschalter auf acht Messeingänge muß zuerst der Port an dem gemessen werden soll definiert sein im Register. Genauso muß zuerst die Referenzspannungsquelle definiert werden. Also im Normalfall AREF. Dazu mußt du im Register ADMUX &B00xxxxxx schreiben. Um z.B. Den ADC1 an PortC zu lesen eben noch die Adresse (binär) im Register ADMUX setzen. Wenn Kanal 1 gemessen werden soll ist das eben &Bxxxx0001.
Da der ADC normal defaultmäßig erst mal abgeschaltet ist muß man den natürlich einschalten. Das geschieht über Register ADCSRA und den Wert &B1xxxxxxx. Jetzt ist der ADC mal soweit vorbereitet und du kannst im selben Register mit &Bx1xxxxxx die AD-Wandlung anstoßen. die braucht dann eben je nach Bitbreite der AD-Wandlung (8- oder 10-Bit) verschieden lang. 10-Bit braucht eben 4 mal länger wie 8-Bit udn normal bei 4-Bit eben so 60µs. Das Bit bleibt nun auf 1 bis er fertig ist. Wenn dann eben das Bit auf 0 ist kann man die Werte vom ADC abholen. Der ADC hat ein 16-Bit Register, also mußt du zweimal 8-Bit abholen. Wenn du das nicht machst startet der ADC nicht mehr. Das High-Register ist das Register ADCH und entsprechend das Low-Register (das bei 8-Bit benötigt wird) ADCL. Diese beiden Register müssen dann nacheinander eben zuerst ADCL und dann ADCH gelesen werden. Erst wenn ADCH gelesen wurde geht der AD-Wandler wieder in Bereitschaft für eine neue Messung. Mehr Infos findest du aber im Datenblatt des ATMEGA mit allen Registerfunktionen.

Grüße Wolfgang

Andree-HB
26.03.2005, 09:26
In meinem Wohnmobil ist es im Frischwassertank so gelöst, indem in einem Rohr mehrerere ReedKontakte mit Widerständen geschaltet sind, die durch einen äusseren Magnetschwimmerring je nach Wasserstand geschaltet und ausgewertet werden. Diese Lösung lässt zwar nur eine stufige Anzeige zu, ist aber völlig ausreichend und vor Allem absolut alterungsbeständig.

Mercator
26.03.2005, 11:09
@BlueNature:
Vielen Dank. Ich glaub den Rest (daraus ein C Programm machen) schaffe ich selbst. DANKE.

BlueNature
26.03.2005, 11:59
@BlueNature:
Vielen Dank. Ich glaub den Rest (daraus ein C Programm machen) schaffe ich selbst. DANKE.

Servud Mercator!

Habe im Forum mal bisschen gestöbert wegen C-Programmierung und ADC. Der folgende Link kann dir vieleicht einiges leichter machen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=7163

Grüße Wolfgang