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 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;
}
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.