Hallo zusammen, und zwar versuche ich gerade Temperatur mit einem externen ADC und einem Arduino zu messen. Funktioniert bisher auch ganz gut. Mein Problem is nun, dass ich gerne die Abtastrate noch oben schrauben würde. Aber sobald ich über 20 SPS hinausgehe springen die Werte in großen Abständen hin und her, sodass nichts mehr zu erkennen ist. Meines Erachtens liegt das an der 50/60 Hz Unterdrückung, die nur bis zu eben diesen 20 Hz aktiv ist. Wie krieg ich das in den Griff? Hab schon Tiefpassfilter an die Eingänge geschaltet. Hat aber nichts geholfen. Macht ein Gleichrichter Sinn, um so die Frequenzen von vorne herein zu eliminieren? Bin noch sehr unerfahren in dem Bereich und meine Internetrecherchen konnten mir auch noch nicht weiterhelfen. Gruß, Jelena
Jelena schrieb: > Aber sobald ich über 20 SPS hinausgehe springen die Werte in > großen Abständen hin und her, sodass nichts mehr zu erkennen ist. Die Qualität der Antworten ist direkt proportional zur Qualität der Frage ;-). Es fehlen: - Die Anwendung - Der Aufbau - Das Messverfahren PT100/Thermoelment etc. - Ein Schaltplan - Welche Temperaturmessung Abtastraten > 20 Samples/s benötigt
Jelena schrieb: > Meines Erachtens liegt das meines Erachtens liegt das am wahrscheinlichsten an einem Programmfehler
Jelena schrieb: > Meines Erachtens liegt das an der 50/60 Hz Unterdrückung, die nur bis zu > eben diesen 20 Hz aktiv ist. Hört sich erstmal unwahrscheinlich an. Das müßte ein sehr 'besonderer' Aufbau sein das 50Hz so eine dramatische Auswirkung hat. Zeige uns bitte Deinen Schaltplan und Dein Programm wenn Du mehr bekommen möchtest als dumme Antworten und Ratespiele. Wie X4U so richtig bemerkt hat bekommst Du die nützlichen Antworten erst wenn Du genügent Information lieferst das sich die Beschäftigung damit lohnt.
Karl Heinz schrieb: > Jelena schrieb: > >> Meines Erachtens liegt das > > meines Erachtens liegt das am wahrscheinlichsten an einem Programmfehler oder an den Störungen durch whatsApp ;-).
Jelena schrieb: > Mein Problem is nun, dass ich gerne die Abtastrate noch oben schrauben > würde. Aber sobald ich über 20 SPS hinausgehe Bei Temperaturmessungen macht man eher 20 samples pro Stunde oder höchstens 20 samples pro Minute. Gibts einen besonderen Grund, warum Du so schnell abtasten willst?
Okay, ich dachte das Problem beschränkt sich sowieso nur auf die 50/60 Hz Unterdrückung.. Ich verwende den ADS1248: http://www.ti.com/lit/ds/symlink/ads1248.pdf Gemessen werden Temperaturen bis 400 °C mit einem Thermoelement, das eine Antwortzeit von 0,004s (250 Hz) liefert. Demnach nöchte ich gerne mit min. 500 Hz abtasten. Der Schaltplan im Anhang ist mehr ein Schema, das ich mehr oder weniger als Merkzettel verwende. Es fehlen dabei ein Filter am Thermoelement mit 1 kOhm und 100 nF. Und an den Eingängen jeweils ein Kondensator mit 10 uF auf Ground. Mit dem Programm funktioniert soweit alles; bis ich eben mit der Abtastrate über 20 SPS gehe. Auch wenn ich die Filter am Thermoelement oder Eingang weglasse entsteht der selbe Fehler. Es ist alles noch im Versuchsstadium. Ziel ist es eine Platine zu entwickeln, um Rauschen usw. zu optimieren.
Jelena schrieb: > Der Schaltplan im Anhang ist mehr ein Schema, das ich mehr oder weniger > als Merkzettel verwende. Es fehlen dabei ein Filter am Thermoelement mit > 1 kOhm und 100 nF. Und an den Eingängen jeweils ein Kondensator mit 10 > uF auf Ground. Schau dir mal den Schaltplan von diesem EVB an: http://www.maximintegrated.com/en/products/analog/sensors-and-sensor-interface/MAX31855EVKIT.html Das Maxim EVB misst bei mir ohne Störungen, da kann man evtl. etwas von übernehmen. Für denen Chip gibt es auch ein Testboard mit Schaltplan, auch da sind gute Hinweise wie man das aufbaut. Ein Schutzrohr (wenn möglich) als Schirm wirkt auch oft Wunder.
Jelena schrieb: > Meines Erachtens liegt das an der 50/60 Hz Unterdrückung, die nur bis zu > eben diesen 20 Hz aktiv ist. Unterdrücken kann man nur, wenn man über Vielfaches einer vollen Periode integriert. Für 50/60Hz gehen dann eben nur max 10Hz. Für nur 50Hz gingen auch 12,5Hz, 16,7Hz, 25Hz, 50Hz
Was ist mit Abblockkondensatoren? In deinem "Schaltplan" sind sie nicht zu finden. Du könntest auch versuchen mal mit höherer Abtastrate die Schwankung darzustellen. z.B. mit 500SPS. Wie sieht das Layout aus?
X4U schrieb: > Ein Schutzrohr (wenn möglich) als Schirm wirkt auch oft Wunder. Noch vergessen: Die Thermocouple Leitung symmetrisch (twisted pair) zu führen ist auch nicht falsch.
Harald Wilhelms schrieb: > Bei Temperaturmessungen macht man eher 20 samples pro Stunde oder > höchstens 20 samples pro Minute. Gibts einen besonderen Grund, > warum Du so schnell abtasten willst? Damit wirst du nicht immer glücklich, z.B. wenn es um Messungen von Temperaturprofilen mit Freifallsonden geht. http://oceanexplorer.noaa.gov/facts/xbt.html
Danke für die vielen Tips und Anmerkungen. Habe jetz bemerkt dass die Werte zwischen dem normalen Messwert und dem oberen Ende des Messbereichs (2^24) hin- und herspringt. Könnt ihr euch da ein Reim drauf machen? Hier noch paar Antworten auf eure Fragen: Christian L. schrieb: > Was ist mit Abblockkondensatoren? Habe zwischen DVDD und DGND einen 100 nF Kerko. Und zwischen AVDD und AVSS auch einen. Natürlich direkt am IC. Zeigt aber leider keine Wirkung. Sollte ich vor alle Eingänge die mit der Versorgungsspannung beschaltet sind einen Abblockkondensator setzen. z.B. ist Start und Reset auch auf DVCC. X4U schrieb: > Die Thermocouple Leitung symmetrisch (twisted pair) zu > führen ist auch nicht falsch. Hab ich vergessen zu erwähnen. Hab ich getan. Auf beiden Leitungen jeweils ein 1kOhm Widerstand. Dazwischen ein 1uF Elko und jede Leitung mit 100nF auf Masse.
Sie brauchen einen Medianfilter. Beispiel: #define STOPPER 0 /* Smaller than any datum */ #define MEDIAN_FILTER_SIZE (13) uint16_t median_filter(uint16_t datum) { struct pair { struct pair *point; /* Pointers forming list linked in sorted order */ uint16_t value; /* Values to sort */ }; static struct pair buffer[MEDIAN_FILTER_SIZE] = {0}; /* Buffer of nwidth pairs */ static struct pair *datpoint = buffer; /* Pointer into circular buffer of data */ static struct pair small = {NULL, STOPPER}; /* Chain stopper */ static struct pair big = {&small, 0}; /* Pointer to head (largest) of linked list.*/ struct pair *successor; /* Pointer to successor of replaced data item */ struct pair *scan; /* Pointer used to scan down the sorted list */ struct pair *scanold; /* Previous value of scan */ struct pair *median; /* Pointer to median */ uint16_t i; if (datum == STOPPER) { datum = STOPPER + 1; /* No stoppers allowed. */ } if ( (++datpoint - buffer) >= MEDIAN_FILTER_SIZE) { datpoint = buffer; /* Increment and wrap data in pointer.*/ } datpoint->value = datum; /* Copy in new datum */ successor = datpoint->point; /* Save pointer to old value's successor */ median = &big; /* Median initially to first in chain */ scanold = NULL; /* Scanold initially null. */ scan = &big; /* Points to pointer to first (largest) datum in chain */ /* Handle chain-out of first item in chain as special case */ if (scan->point == datpoint) { scan->point = successor; } scanold = scan; /* Save this pointer and */ scan = scan->point ; /* step down chain */ /* Loop through the chain, normal loop exit via break. */ for (i = 0 ; i < MEDIAN_FILTER_SIZE; ++i) { /* Handle odd-numbered item in chain */ if (scan->point == datpoint) { scan->point = successor; /* Chain out the old datum.*/ } if (scan->value < datum) /* If datum is larger than scanned value,*/ { datpoint->point = scanold->point; /* Chain it in here. */ scanold->point = datpoint; /* Mark it chained in. */ datum = STOPPER; }; /* Step median pointer down chain after doing odd-numbered element */ median = median->point; /* Step median pointer. */ if (scan == &small) { break; /* Break at end of chain */ } scanold = scan; /* Save this pointer and */ scan = scan->point; /* step down chain */ /* Handle even-numbered item in chain. */ if (scan->point == datpoint) { scan->point = successor; } if (scan->value < datum) { datpoint->point = scanold->point; scanold->point = datpoint; datum = STOPPER; } if (scan == &small) { break; } scanold = scan; scan = scan->point; } return median->value; }
VladimirM schrieb: > Sie brauchen einen Medianfilter Ist das nicht die Behandlung der Symptone anstatt die Krankheit selbst zu behandeln?
Ich seh in Deinem Code nicht wo Du den SPI Speed setzt.
Aus der Arduino 'doku (hust..)' kann ich nicht erkennen ob nach
>SPI.transfer(0xFF)
gewartet wird bis das fertig ist, oder ob mit max. speed immer neue
Daten geschaufelt werden egal ob fertig oder nicht.
Wo schaust Du eigentlich ob der Wandler neue Daten bereit hat ?
Was empfängst Du wenn es garnichts zu empfangen gibt ?
>Ist das nicht die Behandlung der Symptone anstatt die Krankheit selbst
zu behandeln?
Nein, das ist ein proffi-Lösung für diese Probleme.
Aber immer gibt's diejenige, die mit Lüftmühlen kämpfen wollten :-)
Jelena schrieb: > Habe jetz bemerkt dass die Werte zwischen dem normalen Messwert und dem > oberen Ende des Messbereichs (2^24) hin- und herspringt. Könnt ihr euch > da ein Reim drauf machen? Ja. Du hast wahrscheinlich beim Setup des ADC nen Fehler gemacht. Irgend ein elendes Bit nicht so, daß es zum Rest paßt. Solche irren Sprünge sind kein Rauschen oder Netzbrumm, sondern eine innere Fehlfunktion, z.B. auch ein verkehrter Wert für den PGA. Also guck in deine Setup-Werte, da wirst du am ehesten fündig. Ach ja.. nochwas Bedenke bitte auch, daß so ein ADC eigentlich ein 1 Bit Modulator ist mit nem nachgeschalteten Digitalfilter. Das hat eine einstellbare Bandbreite, die sowohl eben die Bandbreite, als auch die Samplerate am Ausgang bestimmt. Wenn du also nun mehr Samples/sekunde haben willst, dann erhöhst du zwangsweise auch die Bandbreite und das reduziert die nutzbare Anzahl von Ergebnisbits. Beim Messen von Thermospannungen könnte das auch ein Problem bilden. W.S.
Ungeachtet der Messwertinterpretation, die natürlich stimmen muss, kann es durchaus sein, dass Netzbrumm da ein Rolle spielt. Ich habe mal in dem Bereich gearbeitet und bei den industriellen Automatisierungsmessmodulen war es in der Tat so, dass gerade die Messwerte aus den Thermoelementen anfällig waren, wegen der langen Leitungen. Leicht beseitigen kann man das, indem man eine volle Welle mittelt, welche punktsymmetrisch sind zur 50/60 Hz Zeitachse. Z.B. könnte man 4 Werte alle 12,5ms nehmen und addieren. Die 50Hz integrieren sich vollständig weg.
Wie viel Netzbrummen man drauf hat, kann man bei einer schnellen Abtastrate wie 500 SPS direkt sehen. Schwer wird es nur wenn man 40-200 SPS nutzt und damit keine 50 Hz Unterdrückung mehr hat, die 50 Hz und ggf. 100 Hz aber noch nicht richtig darstellen kann. Bei einem Thermoelement lose in Luft kann es über Konvektionsströmung auch schon mal zu tatsächlichen Schwankungen der Temperatur kommen.
In deinem Programm nimmst du beim Auslesen per SPI keine Rücksicht auf die Rate, mit der der Wandler arbeitet Ich nehme an, diese Einstellung der Rate machst du hier:
1 | SPI.transfer(B01110010); // Verstärkung=128 und Abtastrate=20 |
Manche Wandler liefern falsche Werte, wenn man sie während der Wandlung abfragt. Versuche mal in deinem Loop die Zeile
1 | delayMicroseconds(1); |
auf etwas sinnvolles einzustellen. Also bei 20 SPS ein Delay von 50000us, 100 SPS Delay = 10000us (klar, da ist die Zeit, die die SPI Kommunikation braucht noch nicht berücksichtigt, aber zum Testen kann man das mal so machen). Besser wäre natürlich den DRDY (data ready) Pin zu beachten.
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.