Forum: Mikrocontroller und Digitale Elektronik Bodenfeuchtesensoren - ADC Problem - Atmega 1284P


von Andreas D. (galdo)


Lesenswert?

Hallo zusammen,

ich verfolge aktuell das Thema analoge Bodenfeuchte Sensoren vom Typ 
"Watermark 6440" an meinem AVR Net-IO in Betrieb zu nehmen. Ich setze 
eine modifizierte Software von Urlich Radig ein (ETH_M32_EX) und 
verwende einen 1284P uC.

Die Sensoren habe ich über einen Spannungsteiler zwischen 0 und 5V 
mittels eines 20kOhm Widerstandes an den ADC4 und ADC5 angeschlossen. 
Zunächst habe ich gedacht, dass das ganze funktioniert, allerdings habe 
ich jetzt festgestellt, dass - wenn überhaupt - nach Umrechnung eine 
Spannungsdifferenz zwischen nass und normal trocken von 0.2V herrscht.

Im "Leerlauf" habe ich eine Spannung von etwa 0,45V, in einem nassen Bad 
etwa 0,63V. Teilweise sehe ich aber sogar gar keine Änderung, was mich 
sehr stutzig stimmt.

Die Konfiguration des Ports sieht so aus:
1
ADMUX = (1<<REFS0) + ADC_START;
2
3
//Free Running Mode, Division Factor 128, Interrupt on
4
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE);

Die Spannung berechne ich wie folgt:
1
humSensor0.adc = (1024 - var_array[WATERMARK_SENS0]);
2
humSensor1.adc = (1024 - var_array[WATERMARK_SENS1]);
3
        
4
//get voltage from sensors (multiply with 100 to get float values .00)
5
humSensor0.voltage = (humSensor0.adc * 100 * 5 / 1024);
6
humSensor1.voltage = (humSensor1.adc * 100 * 5 / 1024);

Sehr ihr ggf. eine Fehler (HW oder SW) und habt eine Idee, wo ich 
angeeckt sein könnte?

Vielen Dank euch.
Wobei 5V meine Referenzspannung des Controllers ist.

von L. P. (lpg)


Lesenswert?

Andreas DG schrieb:
> Im "Leerlauf" habe ich eine Spannung von etwa 0,45V, in einem nassen Bad
> etwa 0,63V. Teilweise sehe ich aber sogar gar keine Änderung, was mich
> sehr stutzig stimmt.

Per Multimeter oder ADC?

Wie schnell ist der uc unterwegs?

Warum lässt du den ADC im freeRunning Mode laufen? Wäre 
singleConversation nicht besser? Achtung auf den Vorteiler, der ADC im 
AVR sollte nicht zu langsam laufen.--> Datenblatt.

Andreas DG schrieb:
> //get voltage from sensors (multiply with 100 to get float values .00)
> humSensor0.voltage = (humSensor0.adc  100  5 / 1024);
> humSensor1.voltage = (humSensor1.adc  100  5 / 1024);

Wie kommst du auf ADCwert *500/1024? Hast du 500mV Vref?

Andreas DG schrieb:
> Wobei 5V meine Referenzspannung des Controllers ist.

Also:ADCwert *5000/1024

Bitte Cast nicht vergessen.

Lg

von Andreas D. (galdo)


Lesenswert?

L. P. schrieb:
> Andreas DG schrieb:
>> Im "Leerlauf" habe ich eine Spannung von etwa 0,45V, in einem nassen Bad
>> etwa 0,63V. Teilweise sehe ich aber sogar gar keine Änderung, was mich
>> sehr stutzig stimmt.
>
> Per Multimeter oder ADC?

Per ADC

> Wie schnell ist der uc unterwegs?
>
> Warum lässt du den ADC im freeRunning Mode laufen? Wäre
> singleConversation nicht besser? Achtung auf den Vorteiler, der ADC im
> AVR sollte nicht zu langsam laufen.--> Datenblatt.

Danke für den Tipp - derzeit läuft er mit 16Mhz.

> Andreas DG schrieb:
>> //get voltage from sensors (multiply with 100 to get float values .00)
>> humSensor0.voltage = (humSensor0.adc  100  5 / 1024);
>> humSensor1.voltage = (humSensor1.adc  100  5 / 1024);
>
> Wie kommst du auf ADCwert *500/1024? Hast du 500mV Vref?

Meine Idee war eigentlich, wenn ich das ganze mit 100 multipliziere, 
kann ich zwei Nachkommestellen mit in den int übernehmen. Generell 
sollte die Formel doch lauten:
ADC-Wert * Schrittbreite = Spannung
so dass - wenn ich mit 100 multipliziere, ich eine Einheit von [0,01V] 
bekommen sollte.
Schrittbreite berechne ich aus 5V/1024

> Andreas DG schrieb:
>> Wobei 5V meine Referenzspannung des Controllers ist.
>
> Also:ADCwert *5000/1024
Wie berechnest du die Spannung?

> Bitte Cast nicht vergessen.
Gut - das ist klar. Da steht im aktuellen Code schon drin. Danke für den 
Hinweis dennoch.


Viele Grüße und vielen Dank

von Alex (Gast)


Lesenswert?

Musst nicht, um eine elektrochemische Spannung zu vermeiden, eine 
Wechselspannung am Sensor anliegen?
Ich würde schätzen, dass ein größeres und vor allem stabileres Signal 
mit einer Rechteckspannung und einem Serienkondensator entsteht.

von wieOskar (Gast)


Lesenswert?

Andreas DG schrieb:
> Sehr ihr ggf. eine Fehler (HW oder SW) und habt eine Idee, wo ich
> angeeckt sein könnte?

Dein Problem beginnt bei der Hardware und zeiht sich bis in die 
Software.

Du solltest dich Fragen welchen Strom du am ADC Eingang benötigst damit 
der was vernünftiges messen kann. Außerdem ist die Frage in welchem 
Wertebereich liegt die Änderung deines Sensors. Vermutlich verändert 
sich der Widerstand? Von X - Y Ohm, kilo Ohm, Mega Ohm? Spannunsteiler 
oder Brückenschaltung? Singel ended oder differential messen?

Wozu willst du die Spannung am ADC Eingang ausrechnen? Sind deine ADC 
Einstellungen Sinnvoll im Bezug auf deinen Hardware 
aufbau(Referenzspannung, Auflösung)? Willst du wirklich float Werte 
Rechnen?

Hast du ein Datenblatt zu dem Sensor? Gibt es einen Schaltungsvorschlag 
zur Auswertung?

Andreas DG schrieb:
> Im "Leerlauf" habe ich eine Spannung von etwa 0,45V, in einem nassen Bad
> etwa 0,63V. Teilweise sehe ich aber sogar gar keine Änderung, was mich
> sehr stutzig stimmt.

Was für Spannungen erwartest du den? Hast du dir das mal ausgerechnet?

von L. P. (lpg)


Lesenswert?

Andreas DG schrieb:
> Meine Idee war eigentlich, wenn ich das ganze mit 100 multipliziere,
> kann ich zwei Nachkommestellen mit in den int übernehmen. Generell
> sollte die Formel doch lauten:
> ADC-Wert * Schrittbreite = Spannung
> so dass - wenn ich mit 100 multipliziere, ich eine Einheit von [0,01V]
> bekommen sollte.
> Schrittbreite berechne ich aus 5V/1024
>
>> Andreas DG schrieb:
>>> Wobei 5V meine Referenzspannung des Controllers ist.
>>
>> Also:ADCwert *5000/1024
> Wie berechnest du die Spannung?

--> http://www.mikrocontroller.net/articles/Festkommaarithmetik

lg

von Martin (Gast)


Lesenswert?

Der "Watermark 6440" ist mit ca. 50 Euro nicht ganz billig. Wo kann man 
ihn preiswerter bekommen?

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.