Ich habe im Auftrage für jemanden eine Mini-Lüfter-Steuerung mit einem Arduino, einem Nextion-Display, einem selbstgebauten Relais-Shield und einem Münzprüfer gebaut. Die Impulse, die der Münzprüfer an den Arduino (Uno) liefert, werden in einem Pin-Change-Interupt empfangen und ausgewertet. Soweit funktioniert das auf dem Labortisch alles genau so, wie es soll. Leider hatte ich die Intensität der Störimpulse, die durch die von den Reed-Relais (und nachfolgendem Schütz) geschalteten Lasten (je 2x 230V-1kW-Wechselstrom-Motore) selbst durch Netzteil, Störfilter und Abschirmung sämtlicher Kabel hindurch zum Arduino dringen, völlig unterschätzt. Der Interrupt springt (vor Allem beim Abschalten) immer einmal an und täuscht dadurch Münzeinwürfe vor, die es nicht gibt. Nun,manchmal sieht man den Wald vor lauter Bäumen nicht ... bis ich heute (hoffentlich) auf die simpelste aller Ideen kam: Die Störungen entstehen ja immer nur durch die vom Arduino selber ausglösten Schaltvorgänge. Also setze ich inden Ausgaberoutinen für die Relais am Anfag ein Flag "dnd_flag" auf true und am Ende der Routine wieder auf false. Die Interrupt-Routine erhält als erste Zeile: if(dnd_flag){return;} Nun bin ich leider nicht vor Ort, um sofort die Wirksamkeit der Maßnahme zu prüfen, deshalb wollte ich das hier mal zu Diskussion stellen ... vlt. hab ich ja was übersehen? Bitte keinen Flame von wegen Arduino und so, nützt nix, die Hardware ist so wie sie ist. Könnte diese softwaremäßige Entstörung wirksam sein?
:
Bearbeitet durch User
Wenn der entsprechende Pegel lange genug anliegt, würde ich in der isr eine entprellung des Signals vornehmen.
False! schrieb: > Wenn der entsprechende Pegel lange genug anliegt, würde ich in der > isr > eine entprellung des Signals vornehmen. Der Münzprüfer sendet 100ms-Impulse pro 50ct in 100ms Abstand. Dieser ist auch nicht direkt am MC angeschlossen, sondern über ein Reed-Relais, die ISR ist insofern bereits entprellt, dass die Impulse aus dem Münzprüfer ohne Prellung der Relaiskontakte gezählt werden. Wenn man z.B. 2€ einwirft entsprechend 4 solcher Impulse. Die Störimpulse kommen nicht unbedingt über die Leitung vom Münzprüfer, sondern möglicherweise auch über die Betriebsspannung oder als EMP über die Luft. Eine leichte Blech-Abschirmung hat bereits eine gewisse Verbesserung, aber keine endgültige Abhilfe gebracht. D.h. das Hinzuzählen von Impulsen erfogt nun nicht mehr in jedem Falle, kommt aber trotzdem noch vor ...
:
Bearbeitet durch User
Du könntest solche Zustände auch in einem Timer pollen. Dann bestimmst du die Dauer, die der Münzprüfer als Impuls schickt. Gehen wir hier mal von 1 Sekunde aus. Dann bastel dir einen 100ms Timer der den zustand des Eingangs prüft. Wenn du 9 mal hintereinander einen Puls hast, ist dein Signal echt. Das dürfte dann sicher genug sein. Wenn ein Timer-Interupt kein Signal erkennt, setze den Zähler einfach wieder auf null. P.S. ich mag Zeitscheiben, da ist alles so berechenbar.
Wenn die Impulse eh immer 100ms lang sind, dann miss die Zeit oder bau einen Tiefpass direkt vor dem Einganspin
bei 100ms Pulsdauer nimm z.B. einen 10ms Timer. Oder leite dir den Systick-TimerInterrupt ab, falls vorhanden.
Frank E. schrieb: > Der Interrupt springt (vor Allem beim Abschalten) immer > einmal an und täuscht dadurch Münzeinwürfe vor, die es nicht gibt. Hast du bei deinem Aufbau dafür gesorgt, dass es keine Erdschleifen gibt? Da hilft sonst ein Optokoppler. Auch kannst du deinen Eingang niederohmiger machen, damit mehr Energie erforderlich wird, um einen Interrupt auszulösen. Falls die Störungen über deinen Sensorverkabelung rein kommen, könntest du dein Signal auch per LWL übertragen - da könnten dann noch so viele EM-Störungen kommen ... Aber anscheinend ist das Kind schon in den Brunnen gefallen und jetzt muss softwaremäßig nachgebessert werden. Aber warum willst du das in der ISR machen. Üblicherweise würde man wohl eher vor Auslösung des störenden Vorgangs den Interrupt abschalten und z.B. über Timer nach einer gewissen Totzeit (in der der µC dann taub ist) wieder einschalten (ggf. nachdem man im Iinterrup Flag Register aufgeräumt hat).
Wenn du die ursache ganz sicher nicht wegschaffen kannst, dann filtere das Signal:
1 | Reed Kontakt |
2 | ____ 100r 4,7k |
3 | GND |------- ------[===]---+-------[===]----o VCC |
4 | | |
5 | |-----||----------------+---------o µC Eingang |
6 | 100nF |
Die Schaltung wirkt als Tiefpass, welche kurze Störungen und Radiowellen herausfiltert. Sehr einfach, sehr wirkungsvoll. Man kann auch per Software Filtern, aber gerade bei Interrupt-Signalen ist das nicht ganz so einfach. Daher lohnt sich die Überlegung: Kommt es auf jeden Cent an? Oder anders herum gefragt: Möchtest du dich der programmier-technischen Herausforderung stellen?
Stefan U. schrieb: > Man kann auch per Software Filtern, aber gerade bei Interrupt-Signalen > ist das nicht ganz so einfach. Daher lohnt sich die Überlegung: Kommt es > auf jeden Cent an? > > Oder anders herum gefragt: Möchtest du dich der programmier-technischen > Herausforderung stellen? Erstmal danke für die vielen Hinweise. Bei der aktuellen Lösung ist eine Änderung der Hardware kaum mehr möglich, ist bereits recht aufwändig eingebaut - evtl. wenn das Projekt einen Nachfolger hat. Galvanisch ist der Eingang ja bereits durch das Reed-Relais getrennt (als robustere Alternative zum optokoppler). Der Kontakt zieht einen MC-Pin, bei dem der interne Pullup aktiviert ist, nach Masse. Bezüglich der Prell-Charakteristik des Relais ist bereits Alles getan. Ich möchte nochmal auf meinen Gedanken eingangs verweisen: - ich weiss ja, wann die Störungen kommen: Ausschließlich durch meine eigenen Schalthandlungen - wenn ich also in genau diesen Fällen die ISR wirkungslos mache, sollte ja eigentlich das Problem gelöst sein ... oder?
Kein Wunder, dass du dir Störsignale einfängst. Der internet Pull-Up des µC hat etwa 50k Ohm. Das langt nur für Taster direkt daneben auf der selben Platine. Füge mal externe Pull-Up Widerstände mit höchstens 4,7k Ohm hinzu.
Was soll denn der Interrupt bei so einem langsamen Signal? Du wirst doch kaum die Notwendigkeit haben die Münze im Mikrosekundenbereich zu detektieren. Einen normalen Pin z.B. alle 10ms abfragen. Wird dabei dreimal nacheinander der selbe Zustand vorgefunden ist das Signal stabil. Btw: auch Reedrelais prellen
Frank E. schrieb: > Der Münzprüfer sendet 100ms-Impulse pro 50ct in 100ms Abstand. Dann nimm eine Entprellroutine. Es gibt hier eine gute mit 4-fach Abtastung.
Einhart P. schrieb: > Was soll denn der Interrupt bei so einem langsamen Signal? Du > wirst doch > kaum die Notwendigkeit haben die Münze im Mikrosekundenbereich zu > detektieren. > > Einen normalen Pin z.B. alle 10ms abfragen. Wird dabei dreimal > nacheinander der selbe Zustand vorgefunden ist das Signal stabil. > > Btw: auch Reedrelais prellen Einhart P. schrieb: > Was soll denn der Interrupt bei so einem langsamen Signal? Du > wirst doch > kaum die Notwendigkeit haben die Münze im Mikrosekundenbereich zu > detektieren. Das Projekt ist "gewachsen". Am Anfang hat der Arduino auch alle Pixelausgaben für das Display mit gemacht und war knack auf knirsch ausgelastet. Da wollte ich nicht das Risiko eingehen, bei der aufwändigen Pixel-Malerei, die Impulse des Münzprüfers zu verpassen. Erst später bin ich auf das Nextion Display und die serielle Steuerung umgeschwenkt. > Einen normalen Pin z.B. alle 10ms abfragen. Wird dabei dreimal > nacheinander der selbe Zustand vorgefunden ist das Signal stabil. Trotzdem muss das Display gesteuert werden, da will ich keine Eingabe verpassen. > Btw: auch Reedrelais prellen Dass das Reedrelais in der ISR per Software entprellt ist, habe ich bereit smehrfach geschrieben.
> Bei der aktuellen Lösung ist eine > Änderung der Hardware kaum mehr möglich Warum fragst du dann noch? Du hast also bereits beschlossen, das nicht gezeigte Programm zu verbessern. Dann mach mal.
Stefan U. schrieb: > Kein Wunder, dass du dir Störsignale einfängst. > > Der internet Pull-Up des µC hat etwa 50k Ohm. Das langt nur für Taster > direkt daneben auf der selben Platine. Füge mal externe Pull-Up > Widerstände mit höchstens 4,7k Ohm hinzu. Das Reed-Relais sitzt 2cm daneben. Auf der Relais-Platine wäre noch Platz für zus. Pullups nach Vcc.
Es wird zeit, dass du die Pläne der Hardware und die Software zeigst. Und du solltest Dich entscheiden, ob eine Hardware Änderung möglich ist, oder nicht.
Frank E. schrieb: > Am Anfang hat der Arduino auch alle > Pixelausgaben für das Display mit gemacht und war knack auf knirsch > ausgelastet. Das liegt dann aber nicht am Arduino, sondern an Deinem Programm. Frank E. schrieb: > Da wollte ich nicht das Risiko eingehen, bei der > aufwändigen Pixel-Malerei, die Impulse des Münzprüfers zu verpassen. Das ist ja gerade der Witz an Interrupts, man kann nichts verpassen. Selbst wenn die Grafikausgabe schnarchlahm programmiert wurde, kann der Interrupt sämtliche Münzen zählen. 200ms sind für den AVR ne Ewigkeit.
Peter D. schrieb: > Frank E. schrieb: >> Am Anfang hat der Arduino auch alle >> Pixelausgaben für das Display mit gemacht und war knack auf knirsch >> ausgelastet. > > Das liegt dann aber nicht am Arduino, sondern an Deinem Programm. Für die Bildschirmausgaben habe ich die gängigen Libs (z.B. UTFT) verwendet und die Adafruit GFX Lib, man muss das Fahrrad ja nicht jedesmal neu erfinden. Das Bildbeispiel weiter oben has du schon gesehen? Das ist mit dem Uno eine echte Herausforderung. Seit ich die Nextions kenne, aber kein Thema mehr. > Frank E. schrieb: >> Da wollte ich nicht das Risiko eingehen, bei der >> aufwändigen Pixel-Malerei, die Impulse des Münzprüfers zu verpassen. > > Das ist ja gerade der Witz an Interrupts, man kann nichts verpassen. > Selbst wenn die Grafikausgabe schnarchlahm programmiert wurde, kann der > Interrupt sämtliche Münzen zählen. 200ms sind für den AVR ne Ewigkeit. Ja eben, deshalb habe ich ja auch einen Interrupt verwendet und kein Polling, wie von anderen empfohlen. Ich verstehe nicht ganz das Anliegen deines Beitrages.
:
Bearbeitet durch User
Du sollst ja auch die Eingänge in einem Timer-Interrupt pollen.
Frank E. schrieb: > Das Bildbeispiel weiter oben has du schon > gesehen? Das ist mit dem Uno eine echte Herausforderung. Das ist doch nur die Ausgabe einer Bitmap und einer Zeile Text. Die einzige Herausforderung sehe ich darin, die Bitmap zu erstellen und dann im Flash abzulegen. Entweder man benutzt ein Tool, was aus einer Bitmap C-Code erstellt oder legt die Bitmap z.B. in einem SPI-Flash ab. Bei Münzeinwurf müssen ja nur die letzten Zeichen der Textzeile aktualisiert werden, d.h. die Zeit zum Zeichnen des Bildes fällt nicht nochmal an. Frank E. schrieb: > Ja eben, deshalb habe ich ja auch einen Interrupt verwendet und kein > Polling, wie von anderen empfohlen. Nur sollte man dazu aber einen Timerinterrupt nehmen, der dann praktischer Weise das Signal entprellt (entstört).
Frank E. schrieb: > Ja eben, deshalb habe ich ja auch einen Interrupt verwendet und kein > Polling, wie von anderen empfohlen. Du sollst innerhalb des zyklisch auftretenden Timer-Interrupts pollen. So pollst du "garantiert" alle XX ms. So verpasst du auch keine Eingaben und der µC kann sich auch Minuten lang Zeit lassen mit dem Display. Schau dir einfach mal diesen Artikel hier an, der erklärt das genau: Entprellung
:
Bearbeitet durch User
Ich kann ja verstehen, dass die Verwendung eines Interrupt-Eingangs für den Anfang verlockend und wie eine Lösung aussieht. Aber wie du siehst, schafft das neue Probleme. Es ist wirklich am einfachsten, den Eingang zyklisch alle paar ms in einem Timer-Interrupt abzufragen und zugleich zu entprellen. Nur muss man erstmal auf diese Idee kommen. Für mich waren die die umfangreichen Erklärungen zu Peter Dannegers Entprellroutine (https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29) aufschlussreich, wenngleich ich sie noch nie 1:1 übernommen habe. Der Lösungsansatz ist wirklich gut.
Hi, > Also setze ich inden Ausgaberoutinen für die Relais am Anfag ein Flag > "dnd_flag" auf true und am Ende der Routine wieder auf false. mal ne Gegenfrage: Wie lange dauern die Ein/Ausschalltimpulse? Viel Erfolg, Uwe
Frank E. schrieb: > Der Münzprüfer sendet 100ms-Impulse pro 50ct in 100ms Abstand. Dieser > ist auch nicht direkt am MC angeschlossen, sondern über ein Reed-Relais, > die ISR ist insofern bereits entprellt, dass die Impulse aus dem > Münzprüfer ohne Prellung der Relaiskontakte gezählt werden. Wenn Du ganz ohne Programmänderung auskommen möchtest, dann verwende anstatt des Relais einen Optokoppler und am INT-Eingang 100 nF gegen GND bzw. VCC.
> die ISR ist insofern bereits entprellt, dass die Impulse aus dem > Münzprüfer ohne Prellung der Relaiskontakte gezählt werden. Wie ist das zu verstehen? Wer oder was sorgt dafür, dass "ohne Prellung" gezählt wird?
Stefan U. schrieb: > Wenn du die ursache ganz sicher nicht wegschaffen kannst, dann filtere > das Signal: > >
1 | > Reed Kontakt |
2 | > ____ 100r 4,7k |
3 | > GND |------- ------[===]---+-------[===]----o VCC |
4 | > | |
5 | > |-----||----------------+---------o µC Eingang |
6 | > 100nF |
7 | > |
> > Die Schaltung wirkt als Tiefpass, welche kurze Störungen und Radiowellen > herausfiltert. Sehr einfach, sehr wirkungsvoll. Hi Stefan, wofür eigentlich der extra 100R? Vg, Conny
Stefan U. schrieb: >> die ISR ist insofern bereits entprellt, dass die Impulse aus dem >> Münzprüfer ohne Prellung der Relaiskontakte gezählt werden. > > Wie ist das zu verstehen? Wer oder was sorgt dafür, dass "ohne Prellung" > gezählt wird? Die Speicherung von millis() in der ISR, hier ist sie:
1 | void onoff_intr() |
2 | { |
3 | if(dnd_flag){return;} |
4 | if((millis() - onoff_ept) > deb_time) //debounce time |
5 | { |
6 | ... |
7 | } |
8 | onoff_ept=millis(); |
9 | }; |
Frank E. schrieb: > Dass das Reedrelais in der ISR per Software entprellt ist, habe ich > bereit smehrfach geschrieben. Wenn das der Fall wäre, dann würdest Du ja Deine Frage nicht stellen müssen. Es ist also offensichtlich nicht der Fall. Im Web geistert bezüglich Entprellen leider auch viel Unsinn herum. Die Notwendigkeit und das Prinzip der Mehrfachabtastung in definierten Zeitintervallen haben nur sehr wenige verstanden und umgesetzt. Mathematisch gesehen ist das ein Tiefpaß (gleitender Mittelwert) mit nachfolgendem Schmitt-Trigger.
Peter D. schrieb: > Mathematisch gesehen ist das ein Tiefpaß Ja, und zwar ein diskreter TP mit all seinen Vor- und Nachteilen ;)
Peter D. schrieb: > Frank E. schrieb: >> Dass das Reedrelais in der ISR per Software entprellt ist, habe ich >> bereit smehrfach geschrieben. > > Wenn das der Fall wäre, dann würdest Du ja Deine Frage nicht stellen > müssen. > Es ist also offensichtlich nicht der Fall. > Im Web geistert bezüglich Entprellen leider auch viel Unsinn herum. > Die Notwendigkeit und das Prinzip der Mehrfachabtastung in definierten > Zeitintervallen haben nur sehr wenige verstanden und umgesetzt. > Mathematisch gesehen ist das ein Tiefpaß (gleitender Mittelwert) mit > nachfolgendem Schmitt-Trigger. Ich glaube nicht, dass das (Ent-) Prellen in diesem Falle mein Problem ist, sondern eher, dass Störimpulse über die Stromversorgung oder die Luft (Magnetfelder) auf die - zugegeben nicht industieellen Ansprüchen genügende - Arduino-Platine einwirken. Wenn ich den Wert im obigen Beispiel hochsetze, werden die Impulse aus dem Münzprüfer nicht mehr erkannt, die Störungen werden aber trotzdem als solche wahrgenommen. Da ich ja in meinem Falle genau weiss, wann die Störungen kommen, nämlich immer bei selbst ausgelösten Schalthandlungen, hilft es, genau für diesen Moment die ISR auf "Durchzug" zu schalten. Ich konnte es inzwischen testen.
:
Bearbeitet durch User
Conny G. schrieb: > wofür eigentlich der extra 100R? 1. dass der Reedkontakt nicht per Kurzschluss den 100nF Kondensator entlädt. 2. dass der µC-Pin nicht völlig ungeschützt in die freie Welt entlassen wird. Peter D. schrieb: > Die Notwendigkeit und das Prinzip der Mehrfachabtastung in definierten > Zeitintervallen haben nur sehr wenige verstanden Du hast den "2-Bit-Zähler pro Eingang" aber auch gut versteckt... ;-) > das Prinzip der Mehrfachabtastung in definierten Zeitintervallen > haben nur sehr wenige verstanden und umgesetzt. Wer sich z.B. den MAX6816 mal genauer anschaut, der versteht eher, wie eine funktionierende Entprellung aufgebaut ist. Frank E. schrieb: > Dass das Reedrelais in der ISR per Software entprellt ist, habe ich > bereits mehrfach geschrieben. Dann funktioniert diese Entprellung offenbar nicht (gut genug). Frank E. schrieb: > bis ich heute (hoffentlich) auf die simpelste aller Ideen kam: Die > Störungen entstehen ja immer nur durch die vom Arduino selber ausglösten > Schaltvorgänge. Also setze ich inden Ausgaberoutinen für die Relais am > Anfag ein Flag "dnd_flag" auf true und am Ende der Routine wieder auf > false. Das ist nur die extrem lange Schreibweise für "Murks". Denn wenn so eine Störung eben mal nicht in dem von dir erwarteten "Blindbereich" kommt (weil es ja auch andere Störer gibt), dann zählst du trotzdem. Fazit: wenn der Impuls des Münzprüfers 100ms lang dauert, dann würde ich für eine 99,999% sichere Erkennung einen 10ms-Interrupt implementieren und darin bei high einen Zähler hochzählen. Wenn der Zähler 7 erreicht hat, dann ist es ein Signal des Münzprüfers. Bei low am Eingang wird der Zähler auf 0 zurückgesetzt. Und zudem würde ich den Eingang des µC halbwegs niederohmig/niederimpedant beschalten, damit nicht jeder klitzekleine Störimpuls gleich eine Fehlzählung einleitet.
:
Bearbeitet durch Moderator
Frank E. schrieb: > Wenn ich den Wert im obigen > Beispiel hochsetze Welcher Wert in welchem Beispiel denn? Zeig doch mal den relevanten Code oder nimm einfach bewährten Code. Bisher weiß niemand, worüber Du überhaupt sprichst. Gib endlich mal Butter bei die Fische. Frank E. schrieb: > Da ich ja in meinem Falle genau weiss, wann die Störungen kommen, > nämlich immer bei selbst ausgelösten Schalthandlungen, hilft es, genau > für diesen Moment die ISR auf "Durchzug" zu schalten. Störungen können aber auch von außerhalb kommen. Warum einen Würg-Around, wenn es dafür schon funktionierende Lösungen gibt. Viele kennen Dein Problem nicht, weil sie einfach den Timerinterrupt nehmen.
Lothar M. schrieb: > Conny G. schrieb: >> wofür eigentlich der extra 100R? > 1. dass der Reedkontakt nicht per Kurzschluss den 100nF Kondensator > entlädt. > 2. dass der µC-Pin nicht völlig ungeschützt in die freie Welt entlassen > wird. Jaaa, ok. Ich hab nicht genau hingekuckt. Schneller geschrieben als gedacht. Ich habe oben rechts als uC-Pin interpretiert, obwohl es VCC ist.
> Störungen können aber auch von außerhalb kommen.
Zum Beispiel, wenn sich jemand eine Zigarette anzündet. Oder ein Handy
aktiv wird.
> Jaaa, ok. Ich hab nicht genau hingekuckt. Schneller geschrieben > als gedacht. > Ich habe oben rechts als uC-Pin interpretiert, obwohl es VCC ist. Trotzdem war deine Erklärung völlig richtig.
Um den Thread zum Abschluss zu bringen: Meine eingangs beschriebene Idee (während der Schalthandlung ISR deaktivieren) hat in meinem Falle genau den gewünschten Erfolg gebracht. Die anderen Infos und Vorschläge nehme ich zur Kenntnis und werde sie im nächsten Projekt berücksichtigen.
Conny G. schrieb: > wofür eigentlich der extra 100R? damit der Taster nicht den Ganzen Strompuls in voller Härte aus dem Kondensator abkriegt und sich irgendwann selbst verschweisst ...
@soundso (Gast) >> wofür eigentlich der extra 100R? >damit der Taster nicht den Ganzen Strompuls in voller Härte aus dem >Kondensator abkriegt und sich irgendwann selbst verschweisst ... Stimmt, aber wenn man es GLEICH richtig macht, braucht man den auch nicht. Denn nach dem Taster + Pull-Up gehört ein RC-Tiefpass, nicht nur ein C. Denn wenn die Quelle niederohmig ist, wird die Filterwirkung deutlich geschwächt, außerdem wird sie dann stark kapazitiv belastet, was in einigen Fällen auch unerwünscht ist. So nicht! Beitrag "Re: Arduino - Interrupt-Entstörung ganz simpel?" Eher so. https://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster
Frank E. schrieb: > Meine eingangs beschriebene Idee (während der Schalthandlung ISR > deaktivieren) hat in meinem Falle genau den gewünschten Erfolg gebracht. Lass den ISR doch erst wieder auf die Welt los, wenn das Ereignis von einer kleinen, Timer gesteuerten Funktion, per Polling überprüfen/entstören wurde. (nicht vergessen vor der ISR freigabe, das Flag zu löschen)
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.