mehrfaches Interrupt bei IR-Modul (LM393)

OP #7529806
Lesenswert?

Hallo Internet, ich verwende das LM 393 basierte IR-Modul zur Drehzahlmessung (max <100Umin). Den Ausgang des Moduls überwache ich mit dem externen Interrupt INT0 des Atmega328. Ich habe das Problem, dass bei einem Interrupt der Interrupt mehrfach ausgelöst wird. Daraufhin habe ich den Pin mit einem externen PullUP versehen. Das hilft nicht. Ich habe dann den Pin gegen GND mit einem 100nF verbunden. Das hilft aber auch nicht. Hat jemand einen Tipp für mich. Vielen Dank im Voraus. WT

#7529811
Lesenswert?

Werner T. schrieb:

ich verwende das LM 393 basierte IR-Modul

WELCHES ¡¡

Die Welt besteht nicht nur ais deinem Bastelzimmer allein.

Es gibt üblen Schrott, wie das oben gezeigte ohne Hysterese aber mit Bremskondensator über dem Phototransistor.

Das ist so Scheisse, das sollte man eigentlich zurückschicken. Der Umbau auf eine Hysterese ist möglich aber sieht dann aus wie Pfusch

Angehängte Dateien:
#7529829
Lesenswert?

Werner T. schrieb:

ich verwende das LM 393 basierte IR-Modul ... Daraufhin habe ich den Pin mit einem externen PullUP versehen.

Der LM393 besitzt einen Open Kollektor Ausgang. Ohne PullUp KANN der nicht funktionieren.

Ohne die Schaltung von deinem Modul zu kennen, ist schwierig zu sagen, wie die Schaltung von deinem Modul aussieht und ob zusätzlich noch ein PullUp erforderlich ist.

OP #7530146
Lesenswert?

Guten Tag,

Zunächst einmal vielen Dank für die zahlreichen Rückmeldungen von gestern Abend.

Das verwendete Modul ist ein China-Modul von ebay (s. Bild) basierend auf den LM393_NXN9G4. Der Hinweis mit dem Oszilloskop hat enthüllt, dass das Modul bei fallenden und steigenden Flanken sehr viele Prellungen aufweist (s. Bild). Allerdings verstehe ich nicht, warum weder der PullUP noch der 100nF etwas daran ändern.

In meinem Code habe ich die Interrupts (INT0 & INT1) auf fallende Flanke konfiguriert. Bei einem Interrupt möchte ich exakt einmal inkrementieren und den Wert später in main nutzen (s. Code). Allerdings beobachte ich mit dem Atmel-ICE Debugger, dass die Variable bei einem von mir verursachten Interrupt mehrmals inkrementiert wird (in der Ordnung +-70 Mal).

Das Modul ist also für mein Vorhaben als Interruptquelle nicht geeignet. Dennoch wage ich zu fragen, ob es eine Hardware- oder Software-Lösung gibt, um die Stabilität des Moduls zu verbessern.

Vielen Dank und viele Grüße. WT

Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #7530156
Lesenswert?

Werner T. schrieb:

dass das Modul bei fallenden und steigenden Flanken sehr viele Prellungen aufweist (s. Bild). Allerdings verstehe ich nicht, warum weder der PullUP noch der 100nF etwas daran ändern.

Es ist eben trotz dieser Bauteile ein Mistdesign, das wohl ein unbegabter Praktikant in der Chinabastelbude gemacht und das alle anderen Chinesen ohne einen Funken Mitdenken nachgebaut haben.

Das Modul ist also für mein Vorhaben als Interruptquelle nicht geeignet. Dennoch wage ich zu fragen, ob es eine Hardware- oder Software-Lösung gibt, um die Stabilität des Moduls zu verbessern.

Wie schon gesagt: bau eine Hysterese ein.

  1. tausche die Pins 2 + 3 (Pin anheben und 2x Fädeldraht zum Kreuzen)
  2. baue einen Hysteresewiderstand zwischen Pin 1 + 3 ein
Angehängte Dateien:
#7530157
Lesenswert?

Werner T. schrieb:

Das Modul ist also für mein Vorhaben als Interruptquelle nicht geeignet.

Grob hin geschaut sieht das nach ungefähr 200µs instabilem Zustand aus. Eine (sehr) schmutzige Lösung wäre, in der ISR einfach 250µs Zeit zu vergeuden und anschließend - vor dem Verlassen - eventuelle Flags zu bereinigen. Da du ja eh nur 100Hz messen möchtest, sollte das passen.

#7530177
Lesenswert?

Nein, das Modul funktioniert bei mir ausgezeichnet. Es ist nur etwas frickelig, das Poti richtig einzustellen. Deswegen habe ich mir ein 10Gang-Teil eingebaut. Damit kann man den Schaltpunkt wunderbar einstellen. Und hier ein Auszug meines Programms, das die Umdrehungen meines Gaszählers zählt.

1
void sensor_setup() {
2

3
  attachInterrupt(digitalPinToInterrupt(countPin),countIrq,FALLING);
4
  count=0;
5
  count_flag=0;
6
  measure_starttime=millis();
7
}
8

9
// this are irq handler for interrupts, have to return void and take no arguments
10
void ICACHE_RAM_ATTR countIrq() {
11

12
  count_flag=1;
13
}

Und im Loop wird das count_flag ausgewertet und evtl. rückgesetzt.

#7530187
Lesenswert?

Werner T. schrieb:

Allerdings verstehe ich nicht, warum weder der PullUP noch der 100nF etwas daran ändern.

Hmm, dann solltest du was zum Thema Hysterese bei Komparatoren lesen.

https://www.analog.com/en/analog-dialogue/articles/curing-comparator-instability-with-hysteresis.html

Helmut -. schrieb:

Nein, das Modul funktioniert bei mir ausgezeichnet.

Du bist unser Held aus dem Märchen.

#7530195
Lesenswert?

Für solche Anwendungszwecke sind externe Interrupts eigentlich nicht vorgesehen. Die benutzt man, wenn der Prozessor aus dem Schlafzustand geweckt werden soll, oder bei sehr kurzen und flüchtigen Impulsen ... also wenn du zum Beispiel die Prellflanken zählen wolltest :)

Für deinen Zweck (100 Umdrehungen pro Sekunde? Oder pro Minute?) ist ein regelmäßiger Timerinterrupt, z.B. jede Millisekunde, völlig ausreichend, der dann der Hauptschleife eine Zustandsänderung erst nach mehreren gleichen Pinzuständen übermittelt, und/oder eine Totzeit implementiert.

Siehe auch die Artikel und Forenbeiträge zum Thema "entprellen".

LG, Sebastian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren