Raspi GPIO im Interruptbetrieb sehr störanfällig

Begonnen von ThomasFh, 01 Oktober 2021, 12:44:41

Vorheriges Thema - Nächstes Thema

ThomasFh

Hallo,

Meine Raspis spielen Interruptmäßig verrückt:


Raspberry Pi Model B, 512MB RAM Rev. 2 (2 Stück getestet)

Ausgangslage:

Raspi erstmal ohne äußere Beschaltung: lediglich ein Öffner-Taster an GPIO2 (Pin 13) und GND
-Pullup 1k Ohm zwischen Pin13 und +3.3V
-Zusätzl. 3k Ohm + 10nF + 50pF  zwischen Pin13 und GND
-Zusätzlich 1mF Elko GND/+3.3V
-Zusätzlich 1mF Elko GND/+5V
-Origianl Raspi 3 Netzteil mit +5.1V (diverse Netzteile probiert)

Wenn der Öffner geöffnet ist, dann ist der Eingang auf High bei 2.2V
  --> alles ab 1.3V ist doch high?


Problem:

Werden in derr Nähe Verbaucher geschaltet (Wallbox etc) geht die GPIO manchmal auf LOW.
D.h., es gibt einen Interrupt trotz niederohmigen Eingangs von 3KOhm und NF sowie HF Kondensator. Von der niederohmigen Eingangsleitung kann der nicht kommen.

Es reicht hier auch schon, wenn ich mit einer Messleitung (ein Ende ist lose) an Masse tippe (NIC oder USB Buchse), um den Interrupt auszulösen!

Die 5.V und die 3.3V an der GPIO habe ich auch schon mit 1mF Elkos gepuffert und diverse Netzteile probiert.

Bin quasi am Ende mit meinem Latein. Falls jemand einen Hardware-Tipp hat, wäre ich dankbar.

Von Interrrupt auf Polling umstellen möchte ich erstmal nicht.


Danke vorab.
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

herrmannj

hänge mich zum mitlesen an: habe einen ähnlichen (gleichen?, für mich unerklärlichen) Effekt (Raspi 3b, GPIO).

Frank_Huber

#2
Ich taste meine GPIO gegen 0V.
Pull up 10K gegen 3v3. (sonst keine Beschaltung)
debounce auf 30ms eingestellt
keine probleme feststellbar.

EDIT:
Die Kabel zu den Tastern (4x2x0.6 I Y ST Y) sind natürlich geschirmt und einseitig geerdet.

Der Idealfall ist es wohl wenn man noch Optokoppler vor die GPIO setzt. da bin ich seit Jahren daran eine Platine zu entwerfen. aber die Zeit... Und da es stabil läuft hab ich da auch keine Druck.

ThomasFh

Hallo Frank, ich taste natürlich auch gegen Masse
Mein debounce ist 100

Interrupt: both

Wie ist der Interrupt bei Dir?
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

Frank_Huber

Das ist meine Standart Definition.

defmod GPIO_IN_16 RPI_GPIO 16
attr GPIO_IN_16 active_low yes
attr GPIO_IN_16 debounce_in_ms 20
attr GPIO_IN_16 direction input
attr GPIO_IN_16 interrupt both

ThomasFh

#5
Hast Du einen Öffner verbaut oder einen normalen Taster? Wegen active_low: yes

meine sieht so aus (ich hatte zuerst mit dem interenen Pullup getestet, der ist noch aktiv)


define TorOeffnerKontakt RPI_GPIO 27
attr TorOeffnerKontakt direction input
attr TorOeffnerKontakt interrupt both
attr TorOeffnerKontakt pud_resistor up
attr TorOeffnerKontakt debounce_in_ms 100
attr TorOeffnerKontakt devStateIcon on:fts_door_right_open@red off:fts_door_right@green
attr TorOeffnerKontakt active_low no
attr TorOeffnerKontakt room GPIO


EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

herrmannj

#6
na, ich befürchte so einfach wird das nicht. Mein Setup wäre 10k pullup extern, kein interner pullup, active low. Der Eingang ist via optocoupler und einem sehr kurzen Kabel (max 10cm) angebunden.

Das Ding lief auf meinem Schreibtisch problemlos Tage-Wochen, dann habe ichs in den Keller getragen und zusätzlich mit der Lüftung verbunden (ebenfalls OC, also galvanisch getrennt) und sobald die Lüftung läuft habe ich da reproduzierbar "Müll" (sehr kurze impulse) an GPIO (IRQ). DER Gpio wiederum hat aber überhaupt nix mit der Lüftung zu tun (ist ein 50Hz Netzfrequenz Sensor).

Ich sehe keine Möglichkeit für Masseschleifen, das Netzteil ist galvanisch getrennt, alle in und out hängen an OC, passiert trotzdem. Ich konnte die Störungen nicht mal auf dem oszio sehen. Das müssen elektrische Einstrahlungen oder sowas sein. Deckt sich auch mit Deiner Erfahrung: Hier Batteriebetriebenes Oszi (kein Netzteil!), ich muss nur mit dem Masse kabel an die Masse vom PI gehen, schon ändert sich das Bild ...

Frank_Huber

Zitat von: herrmannj am 01 Oktober 2021, 14:02:13
na, ich befürchte so einfach wird das nicht. Mein Setup wäre 10k pullup extern, kein interner pullup, active low. Der Eingang ist via optocoupler und einem sehr kurzen Kabel (max 10cm) angebunden.

Das Ding lief auf meinem Schreibtisch problemlos Tage-Wochen, dann habe ichs in den Keller getragen und zusätzlich mit der Lüftung verbunden (ebenfalls OC, also galvanisch getrennt) und sobald die Lüftung läuft habe ich da reproduzierbar "Müll" (sehr kurze impulse) an GPIO (IRQ). DER Gpio wiederum hat aber überhaupt nix mit der Lüftung zu tun (ist ein 50Hz Netzfrequenz Sensor).

Ich sehe keine Möglichkeit für Masseschleifen, das Netzteil ist galvanisch getrennt, alle in und out hängen an OC, passiert trotzdem. Ich konnte die Störungen nicht mal auf dem oszio sehen. Das müssen elektrische Einstrahlungen oder sowas sein. Deckt sich auch mit Deiner Erfahrung: Hier Batteriebetriebenes Oszi (kein Netzteil!), ich muss nur mit dem Masse kabel an die Masse vom PI gehen, schon ändert sich das Bild ...
Hast Du es mal mit einem geerdeten Metallgehäuse für den PI versucht?
klingt als ob dir di Störungen über die Luft in die CPU strahlen.

ThomasFh

#8
ich habe schon die Masse vom Pi an den Schutzleiter gehängt in meiner Not ;-(.
brachte auch nichts.

Das Irre ist ja schon, dass der Interrupt auslöst, wenn ich mit einem losen Messgerätekabel drauf gehe.
Geschirmte Kabel muss ich noch versuchen ..

Auf meinem Rigol Speicheroszi sieht man schon enorm kurze hohe peeks von +2V bis -2V auf dem Interrupteingang trotz meiner Kondensatormimik.

Interessant wäre noch, welche Raspis Ihr einsetzt?
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

herrmannj

#9
Zitat von: Frank_Huber am 01 Oktober 2021, 14:10:20
Hast Du es mal mit einem geerdeten Metallgehäuse für den PI versucht?
klingt als ob dir di Störungen über die Luft in die CPU strahlen.
yepp, sowas in der Art habe ich im Verdacht. Ne, Metallgehäuse und wirklich Masse nochmal alles kontrollieren, evtl dickere Massekabel (wobei, ausreichend dimensioniert sind die..), das alles steht noch aus.

Ich habe das per Software gelöst, alles was unter 5ms ist (erwartet wird 10ms) filtere ich raus, das funktioniert 1a. Nichts desto trotz wollte ich aus Interesse auch nochmal schauen ob ich die Ursache finde...

@Thomas: Raspi 3b

edit
Masse vom Pi an Schutzleiter, da wäre ich vorsichtig. Metallabschirmung geerdet dürfte zielführender sein

edit2:
ZitatAuf meinem Rigol Speicheroszi sieht man schon enorm kurze hohe peeks von +2V bis -2V auf dem Interrupteingang trotz meiner Kondensatormimik.
hmm. -2v auf dem GPIO ist der Lebenserwartung de pi vmtl nicht zuträglich. Muss ich vlielleicht auch hier nochmal genauer messen....

Frank_Huber

wenn es auf den Chip direkt einstrahlt wird vermute ich nur das Metallgehäuse helfen.

Ich habe ein ähnliches Problem mit einem ESP32 / Meanwell Netzteil.
Das Meanwell ballert so stark in die Luft dass der Analog-Eingang flattert.
über den Winter schau ich mir das auch genauer an, wird aber wohl auch eine Abschirmung werden.

ThomasFh

#11
Zitat von: herrmannj am 01 Oktober 2021, 14:59:16

Ich habe das per Software gelöst, alles was unter 5ms ist (erwartet wird 10ms) filtere ich raus, das funktioniert 1a. Nichts desto trotz wollte ich aus Interesse auch nochmal schauen ob ich die Ursache finde...


Hallo Herrmann,

könntest Du Deine Softwarelösung, soweit das mit fhem gemacht wird, hier kurz posten?

Meine Idee wäre die folgende:

Wenn das notify für den Interrupt zuschlägt, ein sleep von einer Sekunde abzuwarten und dann den state des Eingangs nochmal abzufragen.
Allerdings bin ich mir da nicht sicher, ob das überhaupt klappt, wenn der nächste Interrupt innerhalb der sleep Sekunde zuschlägt.
D.h., ich habe zu wenig Ahnung, um abzuschätzen, ob sich da nicht alles verhakelt ..

Danke ..
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

crusader

Zitatna, ich befürchte so einfach wird das nicht. Mein Setup wäre 10k pullup extern, kein interner pullup, active low

Kann ich bestätigen.

Das Problem bei Netzstörungen ist i.A., dass diese über die üblichen Schaltnetzteile auf die DC-Seite gelangen, wo sie zu niederohmig sind, um sie mit Elkos abzufiltern.
Über Pullups geraten sie dann auf hochohmige GPIOs.

Meine Lösung:

Eingangs-Signal (Taster o.ä.) über ein ausreichend dimensioniertes RC-Filter auf den Eingang eines Schmitt-Triggers, der mit 5V versorgt ist.
Ausgang dann niederohmig auf den GPIO.



ThomasFh

@All,

falls jemand eine Idee hat, wie man das softwaremäßig löst bei Interruptsteuerung, einfach hier rein posten.

Bei mir ist es so, dass pro Tag nur ein falscher Impuls kommt. D.h., ich müsste daher nur eine Sekunde nach dem Event prüfen, ob nicht noch ein zweites gleichartiges Event gekommen ist (dann wäre alles OK),
weiß aber nicht, wie ich das abfragen kann.
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

herrmannj

#14
Zitat von: ThomasFh am 01 Oktober 2021, 16:45:56
Hallo Herrmann,

könntest Du Deine Softwarelösung, soweit das mit fhem gemacht wird, hier kurz posten?

Meine Idee wäre die folgende:

Wenn das notify für den Interrupt zuschlägt, ein sleep von einer Sekunde abzuwarten und dann den state des Eingangs nochmal abzufragen.
Allerdings bin ich mir da nicht sicher, ob das überhaupt klappt, wenn der nächste Interrupt innerhalb der sleep Sekunde zuschlägt.
D.h., ich habe zu wenig Ahnung, um abzuschätzen, ob sich da nicht alles verhakelt ..

Danke ..
Gern. Das hilft Dir vmtl nur wenig weil das ausserhalb fhem ist. Es geht um die Messung der Netzfrequenz: https://forum.fhem.de/index.php/topic,121669.0.html
Hier ist die letzte aktualisierung der Software (raspi) dazu (Antwort #265): https://forum.fhem.de/index.php/topic,121669.265.html

Unabhängig von dieser konkreten Lösung (des problems) ist der Zustand ja eigentlich nicht tolerierbar. Gerade wenn Du schreibst dass da +/- 2V auf den GPIO einwirken (bei 3.3V GPIO quasi immens viel). Wir sind ja nicht die ersten die mit GPIO arbeiten, ich glaube hier muss man die Ursache genau verstehen und das an der Wurzel lösen.

Die Erklärung mit den Impulsen die übers Netzteil wandern (fürs Protokoll: ich habe, Stand heute, keine bessere) ist für mich nicht komplett befriedigend. Das würde ja bedeuten das man auf der 5V Rail des Netzteils +/-2V Spikes finden müsste. Hier sind offensichtlich weitere Untersuchungen notwendig

ThomasFh

ja, die Spikes habe ich auch am Raspi Netzteil, wenn ich mit einer Messleitung auf Masse gehe (das andere Ende hängt in der Luft).
Zusätzlich hängen dort noch je 1mF + 47nF Kondensator auf +5V und +3.3V am GPIO Stecker.

Bei 50.0ns  triggert das Rigol und zeigt mir einen sauber liner abwschingenden Sinus mit ca. 2 Perioden (ca.) auf der Betriebsspannung mit +/-2V.  (Empfindlichkeit auf 500mV je +4cm/-4cm scale) Eingang ist auf AC geschaltet.

Ich werde dann den Eingang mit 2 Schottky Dioden absichern, damit der Raspi das überlebt.

Ich kann da aber nicht viel machen, denn final wird der Raspi über einen PoE Splitter mit +5V versorgt.

EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

crusader

Das würde ja bedeuten das man auf der 5V Rail des Netzteils +/-2V Spikes finden müsste.

Öhmm, nein !

Wir sprechen hier im Wesentlichen von Gleichtaktstörungen.
Ob die auf einem Scope (insbesondere einem mit passivem Tastkopf) sichtbar werden, hängt von der Impedanz der Tastkopfspitze und der Tastkopfmasse ab.

In gleicher Weise hängt die Auswirkung auf die Interrupt-Auslösung von der Eingangsimpedanz des GPIO-Pins (relativ zum Substrat) ab. Eine Kompensation des Störsignals durch z.B. einen Masse-Kondensator gelingt da eigentlich nie zufriedenstellend.
Deshalb die Radikal-Lösung über ein Filter und anschliessende Triggerung mit Schalt-Hysterese.

Hat außerdem den Vorteil, dass bei extern angeschlossenen Tastern (o.ä.)  ein ESD- Impuls nicht gleich den Raspi killt.
Bastel-Aufwand ist natürlich grösser.

herrmannj

verstehe- Messen müsste man dann vmtl gegen Erde?

crusader

Wenn Du damit die Schutzerde meinst:

Es ist ein Irrtum, dass diese ein quasi störfreies Potential darstellt. Ganz im Gegenteil: Viele Geräte besitzen Störfilter, die mit der Schutzerde verbunden sind und die Netzstörungen auch dorthin einspeisen.
Deshalb ist es immer eine Sisyphus-Arbeit, EMV-Störungen mit Scopes einzukreisen.

Wenn Du die Störung reproduzierbar machen kannst, hilft da eingentlich nur die Try-and-Error-Methode mit unterschiedlichen Beschaltungen.
Ich konnte auf diese Weise die Störanfälligkeit des Interrupt-Eingangs durch Variation von Pullup-Widerstand und Puffer-Kondensator durchaus reduzieren.
Aber eben (in meinem Fall) nicht auf Null bringen.   

ThomasFh

Zitat von: crusader am 01 Oktober 2021, 17:36:31
Kann ich bestätigen.

Das Problem bei Netzstörungen ist i.A., dass diese über die üblichen Schaltnetzteile auf die DC-Seite gelangen, wo sie zu niederohmig sind, um sie mit Elkos abzufiltern.
Über Pullups geraten sie dann auf hochohmige GPIOs.

Meine Lösung:

Eingangs-Signal (Taster o.ä.) über ein ausreichend dimensioniertes RC-Filter auf den Eingang eines Schmitt-Triggers, der mit 5V versorgt ist.
Ausgang dann niederohmig auf den GPIO.

OK, hat Du hier mal ein Schitt-Trigger IC und einen RC-Filter-Kombi parat? Es liest sich so, als wenn Du das Problem schon mal hardwareseitig angefaßt hast.
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

crusader

Habe einen HEF40106 aus der Grabbelkiste verwendet.
Die gibt es aber immer noch bei Reichelt  und Co.

Die Dimensionierung des RC-Filters hängt von der Nutzsignal-Frequenz ab, denn man möchte ja nicht das Nutzsignal abfiltern.
Bei einem manuellen Tastereingang hat man da großen Spielraum (Habe 22k/10nF verwendet).

Bei Deiner Beschaltung würde ich aber vielleicht erstmal den Pulldown-Widerstand entfernen. Der zieht ja den DC-Pegel auf 2.2V und VOH beim Raspi liegt nur bei 2.0V.
Die Vorstellung, dass viel Kondensator viel hilft, trifft bei Gleichtaktstörungen auch nicht zu. Man möchte ja eigentlich nur den Einfluß von GND und VCC symmetrieren.
Vielleicht hilft ein kleinerer Kondensator da besser oder sogar einer gegen VCC.

ThomasFh

Hallo,

nachdem ich einen Schmitt Trigger mit RC Filter vorgeschaltet habe, traten besagte Fehler immer noch auf.

Die Fehler treten sogar noch auf, wenn man das GPIO Port direkt auf Masse legt, bzw wenn lediglich der interene Pullup Widerstand angeschlossen ist.

Getestet wurde mit einem elektronisch gesteuertem Lötkolben (Lonove) an der selben Steckdose. Das Teil scheint besonders schlecht entstört zu sein.

D.h., keine Chance für mich (mit zuwenig fhem know how) mit Interrupts zu arbeiten.

EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

tux75at

Wenn Netzstörungen die Ursache sind, dann wird vermutlich die beste Lösung sein, die Geräte zu entkoppeln.
Ich vermute, dass aufgrund unterschiedlicher Phasen, das GND Niveau bei diversen Störungen weggezogen wird.

Am Einfachsten ist es, einen Optokoppler (z.B PC817 oder ähnlichen), am besten direkt beim RasPi, bzw. so nahe wie möglich, zu positionieren.
Der interne Pull-up des RasPi wird wohl zu hoch sein (50-65k??). Je nach Optokoppler reicht wahrscheinlich ein Pull-up von ~1k-5k

Ich vermute, dies könnte die Lösung für euer Problem sein.

LG
Tux

ThomasFh

Zitat von: tux75at am 31 Oktober 2021, 09:37:13
Wenn Netzstörungen die Ursache sind, dann wird vermutlich die beste Lösung sein, die Geräte zu entkoppeln.
Ich vermute, dass aufgrund unterschiedlicher Phasen, das GND Niveau bei diversen Störungen weggezogen wird.

Am Einfachsten ist es, einen Optokoppler (z.B PC817 oder ähnlichen), am besten direkt beim RasPi, bzw. so nahe wie möglich, zu positionieren.
Der interne Pull-up des RasPi wird wohl zu hoch sein (50-65k??). Je nach Optokoppler reicht wahrscheinlich ein Pull-up von ~1k-5k

Ich vermute, dies könnte die Lösung für euer Problem sein.

LG
Tux


Die Fehler treten sogar noch auf, wenn man das GPIO Port direkt auf Masse legt.


EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

tux75at

GPIO auf GND aber das andere Gerät noch verbunden?
Für diesen Test würde ich alle anderen Geräte abhängen. Hier dürften keine Interrupts auftreten, wenn doch, dann ist die HW (RasPi) defekt oder in der SW gibt es falsche Einstellungen.
Wenn das andere Gerät noch angehängt ist, kann es durchaus zu Störungen kommen, da es zu Ausgleichsströmen über GND kommen kann.

LG
Tux

ThomasFh

Zitat von: tux75at am 01 November 2021, 18:34:43
GPIO auf GND aber das andere Gerät noch verbunden?
Für diesen Test würde ich alle anderen Geräte abhängen. Hier dürften keine Interrupts auftreten, wenn doch, dann ist die HW (RasPi) defekt oder in der SW gibt es falsche Einstellungen.
Wenn das andere Gerät noch angehängt ist, kann es durchaus zu Störungen kommen, da es zu Ausgleichsströmen über GND kommen kann.
LG
Tux

Nur der Raspi mit GPIO auf GND. Keine weiteren Geräte dabei. Tritt so 1 x alle paar Tage auf.
Habe leider nur 2 Raspi's um dies zu testen. Bei beiden der gleiche Effekt.


EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C