Forum: Mikrocontroller und Digitale Elektronik mehrfaches Interrupt bei IR-Modul (LM393)


von Werner T. (wetawi)


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

von Axel S. (a-za-z0-9)


Lesenswert?

Du hast im Datenblatt gelesen, daß der Level-Interrupt auslöst, so lange 
der entsprechende Level anliegt? Ansonsten laß uns hier nicht lange 
herumrätseln, was du machst und zeig dein Programm!

von Michael B. (laberkopp)


Angehängte Dateien:

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Werner T. schrieb:
> Hat jemand einen Tipp für mich.
Miss mit einem Oszi, was am uC-Pin ankommt und poste einrn Screenshot 
davon. Dann wird das nicht so eine tragische Ratestunde.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Ein LM393 ist ein Komparator. Vielleicht solltest du dir erst mal klar 
machen wie dein IR-Modul wirklich aufgebaut ist. Und vielleicht mal den 
Ausgang des Moduls mit einem Oszilloskop beobachten.

von Rainer W. (rawi)


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.

von Werner T. (wetawi)


Angehängte Dateien:

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

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

: Bearbeitet durch Moderator
von Norbert (der_norbert)


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.

von Mark S. (voltwide)


Lesenswert?

Werner T. schrieb:
> Der Hinweis mit dem Oszilloskop hat enthüllt, dass das Modul bei
> fallenden und steigenden Flanken sehr viele Prellungen aufweist (s.
> Bild). Allerdings verstehe i

Ja, für diese Art Unstabilität ist der LM393 bekannt. Hysteresis 
einbauen ist Pflicht!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Werner T. schrieb:
> ein China-Modul von ebay (s. Bild)
Ein Link wäre auch nicht schlecht. Evtl. ist da ein Schaltplan dabei...

Mark S. schrieb:
> Ja, für diese Art Unstabilität ist der LM393 bekannt.
Mir scheint auch der Blockkondensator für den Chip arg ungünstig 
platziert. Das macht die Sache nicht besser.

von Helmut -. (dc3yc)


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.

von Michael B. (laberkopp)


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.

: Bearbeitet durch User
von Sebastian W. (wangnick)


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

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Sebastian W. schrieb:
> Für solche Anwendungszwecke sind externe Interrupts eigentlich nicht
> vorgesehen

Na ja.

Für prellende Signale taugen sie nicht.

Zur Drehzahlerfassung hingegen taugen sie sehr wohl.

von Helmut -. (dc3yc)


Lesenswert?

Michael B. schrieb:
> Du bist unser Held aus dem Märchen.

Soll ich dir ein Video drehen, wie das Ding zählt? Der eine kanns halt, 
der andere eben nicht! Du gehörst möglicherweise zu den anderen.

von Michael B. (laberkopp)


Lesenswert?

Helmut -. schrieb:
> Soll ich dir ein Video drehen, wie das Ding zählt?

Nee, du könntest ein Video darüber drehen, dass du nicht verstanden 
hast, was eine Hysterese bringt.

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.