Forum: Analoge Elektronik und Schaltungstechnik 50/60 Hz Unterdrückung


von Jelena (Gast)


Lesenswert?

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

von X4U (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Jelena schrieb:

> Meines Erachtens liegt das

meines Erachtens liegt das am wahrscheinlichsten an einem Programmfehler

von Michael K. (Gast)


Lesenswert?

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.

von X4U (Gast)


Lesenswert?

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

von Harald W. (wilhelms)


Lesenswert?

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?

von Jelena (Gast)


Angehängte Dateien:

Lesenswert?

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.

von X4U (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Christian L. (cyan)


Lesenswert?

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?

von X4U (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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

von Jelena (Gast)


Lesenswert?

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.

von VladimirM (Gast)


Lesenswert?

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

von Jelena (Gast)


Lesenswert?

VladimirM schrieb:
> Sie brauchen einen Medianfilter

Ist das nicht die Behandlung der Symptone anstatt die Krankheit selbst 
zu behandeln?

von Michael K. (Gast)


Lesenswert?

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 ?

von VladimirM (Gast)


Lesenswert?

>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 :-)

von W.S. (Gast)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von Lurchi (Gast)


Lesenswert?

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.

von Joe F. (easylife)


Lesenswert?

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
Noch kein Account? Hier anmelden.