Forum: Mikrocontroller und Digitale Elektronik Anfänger: trotz Mittelwert noch zu viel Schwankung


von Paul (Gast)


Lesenswert?

Hallo Forengemeinde,

ich lese den 10 Bit ADC eines Atega32 aus, an dem ein Feuchtesensor 
hängt. Dazu lese ich den Sensor 255 mal aus und addiere alle Werte und 
dividiere diese dann durch 255. Das klappt soweit ganz gut. Mein Problem 
ist jedoch das der Feuchtesensor recht zappelt und auch mit 255 
Messungen (Atmega läuft mit 8 MHz, Prescaler ist 64 -> macht also immer 
noch 125 kHz Samplingfrequenz) werde ich der Lage nicht Herr.

Ich kenne nur noch die Methode wo man die Zahlen der Größe nach ordnet 
und n größte und n kleinste Zahlen wegwirft um Spitzenwerte bzw. 
sogenannte "Ausreißer" herauszufiltern.

Sicherlich gibt es klevere Methoden, wie man dass machen kann. Oder habt 
Ihr einen Tip wonach ich suchen muss.

Bin für Tips und Hilfe dankbar!

Gruß Paul

von Thomas E. (thomase)


Lesenswert?

Paul schrieb:
> Oder habt Ihr einen Tip wonach ich suchen muss.

Du musst nach dem Fehler suchen.

Und dabei kann dir keiner helfen, da keiner weder dein Programm oder 
deinen Schaltplan noch deinen Schaltungsaufbau kennt.

mfg.

: Bearbeitet durch User
von торфкопф (Gast)


Lesenswert?

Erstens verwende einen exponentiellen Mittelwert, der skaliert besser, 
dh braucht nur eine Speicherstelle, kann aber per einem Wert langsamer 
werden.
Dann .. sampelt er zu schnell. Geh lieber auf eine langsamere Frequenz.
Und allenfalls ist auch noch EMV im Spiel, dh ungenuegende Hardware. 
Zeig doch mal ein Schema und ein Layout.

von MaWin (Gast)


Lesenswert?

Paul schrieb:
> Oder habt Ihr einen Tip wonach ich suchen muss.

Vielleicht stimmt's ja einfach was der ADC liefert.
Vielleicht schwankt deine zu erfassende Spannung ja tatsächlich stark.

Was ist denn deine VRef ? 5V ? Wie ist die Schaltung des Feuchtesensors, 
Spannungsteiler ? Verträgt der Feuchtesensor überhaupt Gleichstrom oder 
will der Wechselstrom ? Wie sind deine Versorgungsspannungen gefiltert 
und was hängt noch so dran und stört ? Schon mal probieert, den ATmega 
während der Umwandlung in SLEEP zu bringen damit er sich selbst nicht 
stört ?

von Anja (Gast)


Lesenswert?

Paul schrieb:
> ich lese den 10 Bit ADC eines Atega32 aus, an dem ein Feuchtesensor
> hängt. Dazu lese ich den Sensor 255 mal aus und addiere alle Werte und
> dividiere diese dann durch 255.

probier es mal mit weniger als 64 Werten.
Welcher Datentyp? Integer? (uint16_t ?)

Gruß Anja

von Falk B. (falk)


Lesenswert?

@ Paul (Gast)

>hängt. Dazu lese ich den Sensor 255 mal aus und addiere alle Werte und
>dividiere diese dann durch 255. Das klappt soweit ganz gut.

Wenn man 256 Werte ufsummiert und durch 256 "teilt", geht es noch 
einfacher, weil /256 gleich einer Rechtschiebung um 8 Bit entspricht.

>ist jedoch das der Feuchtesensor recht zappelt und auch mit 255

WIEVIEL?

>Sicherlich gibt es klevere Methoden, wie man dass machen kann. Oder habt
>Ihr einen Tip wonach ich suchen muss.

Erstmal grundlegend, WARUM deine Messung zappelt.
Fehler im Aufbau?
Wackelkontakt?
Störungen der Stromversorgung?

So eine ADC-Messung wackelt im Normalfall nur wenige LSB (1-3), auch 
ohne Mittelwertbildung.

von Werner (Gast)


Lesenswert?

Paul schrieb:
> Mein Problem ist jedoch das der Feuchtesensor recht zappelt

Dann löte ihn erstmal fest, damit er ruhig ist.

Als nächstes könntest du die Werte als Zeitserie angucken. Aus "recht 
zappelt" anhand dieser Daten eine Zahl zu machen, wäre ein weiterer 
Schritt. Diese Zahl würde ich mit der entsprechenden Angabe im 
Datenblatt des Sensors vergleichen kannst. Vielleicht sind auch 
Störungen im Spiel - who knows.

von Joe F. (easylife)


Lesenswert?

Tiefpass vor dem ADC vergessen?

von Oldie (Gast)


Lesenswert?

1.
Zeig den Schaltungsaufbau, sonst können wir nur raten.

2.
Falls der Aufbau halbwegs OK ist, könnten noch Einstreuungen
von der 50 Hz Netzwechselspannung die Ursache sein.

Gegenmaßnahme:
Samplerate und Anzahl der Messungen so wählen, dass sich der
50 Hz-Fehler herausmittelt.
Beispiel: 20 Messungen im Abstand von 1,00 ms  (1/50 s), oder
          16 Messungen im Abstand von 1,25 ms  (1/50 s), oder
         256 Messungen im Abstand von 0,625 ms (8/50 s), ...

3.
Wenn möglich, einen Ratiometrisch arbeitenden Sensor wählen.

von Stefan F. (Gast)


Lesenswert?

Deine Methode, 256 Werte zu addieren und dann durch 256 zu teilen 
reduziert Rauschen. Aber es hat keinen Einfluss auf Schwankungen des 
tatsächlichen Nutzsignals.

Du kannst Signal stattdessen integrieren, als einen R/C Tiefpass 
nachbilden.

#define FAKTOR 100
int16_t kondensator;
while (1)
{
   int16_t adc=read_adc();
   int16t  diff=adc-kondensator/256;
   kondensator=kondensator+diff*FAKTOR;
}
int16_t ergebnis=kondensator/256;

Damit wir auf Fließkomma-Operationen verzichten können, speichern wir im 
Kondensator das 256-fache vom Messwert (also 8 bit mehr). Die unteren 8 
Bit sind quasi unser Ersatz für Nachkommastellen.

Der FAKTOR muss im Bereich 1-256 liegen. Ein kleiner Wert bewirkt eine 
starke Dämpfung von Schwankungen, ein großer Wert bewirkt eine geringe 
Dämpfung. Beim Maximum 256 finde gar keine Dämpfung mehr statt.

von Stefan F. (Gast)


Lesenswert?

Die letzte Code zeile wird wegen der Endlosschleife nie ausgeführt - war 
mein Denkfehler. Aber ich denke, es ist trotzdem klar, was ich meinte. 
Falls nicht, frag nochmal nach.

von Uwe (Gast)


Lesenswert?

Hi,
Was bedeutet
> das der Feuchtesensor recht zappelt
+/-10 Inc oder eher +/-1 Inc  ...??

Viel Erfolg, Uwwe

von Paul (Gast)


Lesenswert?

Wow, ein Buch voller Antworten :o)

Ich habe mich mal zu "gleitender Durchschnitt" belesen und finde vor 
allem Diskussionen darüber was an den jeweiligen Formeln falsch ist. Das 
hat mich also mehr verwirrt als es mir genutzt hat. Leider bin ich noch 
nicht Fit so etwas selbst zu erstellen und gucke mir aktuell erst mal 
was ab, vollziehe es nach und baue es dann ein. Somit habe ich 
allerdings schon bisschen was verstanden.

Nun zu Euren Fragen:
Beim ADC-Wert schwanken die letzten beiden Stellen.

Das ganze hängt hinter einem "Stange USB ISP" der an dem USB-Port von 
meinem Laptop hangt der wiederum 5,03 V liefert (genauer ist mein 
Multimeter nicht).

Ich habe Tatsache nur das halbe RC-Glied an den ADC gehängt, also nur 
eine 100nF Kerko zwischen die Signalleitung und GND von dem HMZ-333A1 
Feuchtesensor. Den 4k7 Widerstand habe ich anscheinend vergessen. Hab 
gerade noch mal in meiner Bastelkiste gesucht und keinen gefunden - 
jetzt ist mir auch klar warum ich den nicht eingebaut habe, muss ich 
also erst kaufen gehen.

Als VREF nehme ich VDD, also die 5,03 Volt vom USB. Wie glatt diese 
Spannung ist kann ich nicht sagen. Ein Oszi habe ich nicht. Ich bin aber 
gewillt die Schaltung mit einem Festspannungsregler auszustatten und 
dann nochmal zu prüfen wie sehr alles schwankt. An Netzschwankungen habe 
ich noch gar nicht gedacht.

Weiterhin hängen noch 2 Stück DS18S20 1-wire Temperatursensoren (nicht 
parasitär), ein 8MHZ-Quarz inkl. 2x 22p Kondensatoren, ein LCD (1602A) 
und ein Taster an dem Atmega32.
Zwischen Aref und AGnd befindent sich ein 100nF Kerko. Zwischen AVcc und 
Gnd ist ebenfals ein 100n Kerko. AVcc ist über einen 56R Widerstand mit 
Vcc verbunden.

Den Filter würde ich so versuchen:
[c]
#define FAKTOR 100
int16_t kondensator;
for(i=0; i<20; i++) {                    //16 Messungen durchführen
{
   int16_t adc=read_adc();
   int16t  diff=adc-kondensator/20;      // durch Anzahl der Messungen 
teilen
   kondensator=kondensator+diff*FAKTOR;
   _delay_ms(1)
}
int16_t ergebnis=kondensator/20;         // durch Anzahl der Messungen 
teilen
[c]

An der Konstante "FAKTOR" kann ich dann herumschrauben bis ich glücklich 
bin oder keine Lust mehr habe - je nachdem was zuerst eintritt.

von Joe F. (easylife)


Lesenswert?

Paul schrieb:
> Ich habe Tatsache nur das halbe RC-Glied an den ADC gehängt, also nur
> eine 100nF Kerko zwischen die Signalleitung und GND von dem HMZ-333A1
> Feuchtesensor. Den 4k7 Widerstand habe ich anscheinend vergessen. Hab
> gerade noch mal in meiner Bastelkiste gesucht und keinen gefunden -
> jetzt ist mir auch klar warum ich den nicht eingebaut habe, muss ich
> also erst kaufen gehen.

Na, dann nimm doch irgend einen anderen Widerstand im Bereich von 4.7K 
bis 47K. Hauptsache der Tiefpass bewirkt überhaupt etwas, und mehr als 
4.7K ist eh besser.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Paul schrieb:
> HMZ-333A1

Aha, Chinamüll.

Es ist laut Datenblatt nicht klar, ob die Ausgangsspannung des Sensors 
ratiometrisch von der Versorgungsspannung abhängt, oder eine eigene 
Referenz hat.

http://www.ghitron.com/files/HMZ-333A1.pdf

Da dein ratiometrisches Messen so schlechte Resultate liefert, sollte 
man es wohl mal absolut versuchen. Stelle deinen Microcontroller von 5V 
ARef auf die interne 2.5V Referenz um und miss nochmal.

Der einzelne 100nF Kondensator am Ausgang des Sensors ist ok, aber die 
ARef-Spannung des uC muss auch gefiltert sein, üblicherweise mit 
10uH/100nF und 100nF an Ref.

Wenn die Messwerte mit der internen Ref deutlich stabiler sind, stellt 
sich die Frage, wie man von den 3.3V auf die messbaren 2.5V herunter 
kommt. Ein Spannungsteiler, der dem uC weniger als 10k anbietet, 
belastet den Sensor mit 5k Ausgangswiderstand zu stark.

Es wird wohl einen zusätzlichen OpAmp kosten:

         +5V
          |
Sensor --|+\ LM358 oder besser
         |  >--+
      +--|-/   |
      |        |
      +--------+
               |
              10k
               |
               +-- A/D
               |
              25k
               |
              GND

von Paul (Gast)


Lesenswert?

Und genau damit hat sich das Problem gelöst!

Ihr seid echt alles samt Klasse! Danke!

von Joe F. (easylife)


Lesenswert?

Paul schrieb:
> Und genau damit hat sich das Problem gelöst!

Mit was jetzt? Durch Einbau des fehlenden Widerstandes am TP Filter?

: Bearbeitet durch User
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.