Forum: Mikrocontroller und Digitale Elektronik Arduino Interrupt überempfindlich


von rollmops (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit meinem Arduiono und den Interrupts.

Ich habe ein Signal, das 2,5 Volt hat. In das Signal sind negative Peaks 
auf ca. 0,5 bis 1 V geprägt.
Also so:

-----   ------- 2,5V
     | |
     | |
     |_|     0,5V
_____________0V (Gnd)

Mit dem Arduino möchte ich nun die positiven und negativen Flanken 
detektieren um eine LED ein, bzw. auszuschalten. Außerdem sollen die 
negativen Flanken gezählt werden.

Zum Testen habe ich das Signal mit einem Taster näherungsweise 
dargestellt. Alles hat funktioniert.

Wenn ich aber mein reales Signal, dass ich habe an den Pin anlege 
funktioniert es nicht mehr, da das Signal anscheinend zu stark rauscht. 
Es gibt kleinere Peaks, die ich nicht haben will, die von 2,5V aus ca. 
200mW nach oben und untern reichen. Also insgesamt rauscht das Signal 
ungefähr 400mW breit.
Die LED flackert nur noch uns es werden viel zu viele negative Flanken 
gezählt.

Werden diese Peaks auch schon als Flanken detektiert?
Was kann ich dagegen tun?

von rollmops (Gast)


Lesenswert?

Meine natürlich dass es um 200mV rauscht.

von Horst (Gast)


Lesenswert?

Wo hast Du das Signal angeschlossen? An den Komparator, einen analogen 
Eingang oder einen digitalen?

von Arduinoquäler (Gast)


Lesenswert?

rollmops schrieb:
> ich habe ein Problem mit meinem Arduiono und den Interrupts.

Wenn es ein 5V-Arduino ist dann hast du schon deswegen
Probleme weil dein Signal sich in einem undefinierten
Bereich bewegt.

Um dein Signal sauber zu detektieren brauchst du einen
Komparator dazwischengeschaltet.

von MaWin (Gast)


Lesenswert?

rollmops schrieb:
> Was kann ich dagegen tun?

Eine ordentliche Schaltung aufbauen ?

Ein Eingang ist doch nicht per Definition für jedes noch so krude Signal 
geeignet was du da reinstopfst.

Sondern man muss sich schon an die Datenblattvorschläge was als high und 
was als low erkannt wird halten.

Also brauchst du bei deinem schlechten Signal eine 
Signalpräkonditionierung, die Rauschen entfernt und die Signalpegel auf 
high und low verstärkt.

Vielleicht ein externer Komparator.

Vielleicht ist dein Signal auch ok, und man kann elektronisch entstören, 
so wie man Taster entprellt, weil man weiss, was ein zulässiges Signal 
wäre und was Störungen sein müssen.

Übrigens liefern Taster auch kein saoberes Signal bei dem man Flanken 
zählen kann. Wenn es damals also funktionierte, hast du die Fehlfunktion 
bloss nicht gesehen....

von rollmops (Gast)


Angehängte Dateien:

Lesenswert?

Beim testen hat mein Programm natürlich die Flanken mitgezählt, als der 
Taster geprellt ist. Aber ich wusste ja, dass das passiert und habe es 
toleriert. Ich wollte ja nur sehen on mein Programm so funktioniert.

Ich habe schon eine kleine Schaltung gebaut. Die ist aber noch falsch. 
Ich weiß leider nicht wie ich die Zeitkonstante ausrechne. Ich habe nur 
einen Kondensator mit 1µF, Widerstände habe ich aber alles bis 1 Mega 
Ohm. Würde es mit einem Spannungsteiler machen ( vllt. 1:10).
Kann es sein, dass man bei meiner Schaltung fie Zeitkonstante so 
ausrechnet: ((R1*R2)/(R1+R2))/C = tau ???

Kann mir bitte jemand die richtige Gleichung sagen?

Ein weiteres Problem, das ich habe, ist dass die Peaks beim 
Ausgangssignal (roh) von 0 bis auf -5 Volt fallen. An meinem Arduino 
Anschluss geht das Signal aber nur von 2,5 V los. Liegt aber am 
Spannungsteiler.

Ich bin mir nicht sicher was mit meinem Kondensator nicht stimmt (bzw. 
Schaltung), wenn ich den Aufbau eine Weile laufen lasse, dann 
verschwinden die negativen Peaks auf dem Oszi. Der Kondensator lässt sie 
nicht mehr durch. Wenn ich dann die Masse von meinem Eingangssignal kurz 
von der Masse des Arduinos trenne und dann wieder anschließe, passt 
wieder alles. Aber man kann zuschauen wie in einer bis zwei Minuten die 
Peaks immer näher an 2,5 V rangehen, bis sie im rauschen untergehen.

von Peter D. (peda)


Lesenswert?

Wenn Dein Signal -5V ist, dann nimm eine Z-Diode (5,1V) und nen Pullup 
(10k) zur Pegelverschiebung.

von rollmops (Gast)


Lesenswert?

kannst du mir bitte die schaltung sagen?

von Nuntius (Gast)


Lesenswert?

rollmops schrieb:

> kannst du mir bitte die schaltung sagen?

https://translate.google.de/#de/en/Schaltung

Unten links auf das Lautsprechersymbol klicken.

von Michal P. (michal)


Lesenswert?

Hallo,

schöne Idee um Informationen zwischen verschiedenen Potenzialen zu 
übertragen. Ich habe so etwas schon mal im LTSpice simuliert und hat gut 
funktioniert.

Entferne einfach den unteren 1 MOhm. Die Pulse hinter dem Kondensator 
müssen ja von 5 V nach 0 V gezogen werden, nicht von 2,5 V.

Schöne Grüße

Michal

von Arduinoquäler (Gast)


Lesenswert?

rollmops schrieb:
> Ich habe schon eine kleine Schaltung gebaut.

Du willst es nicht kapieren? Dein 5V Arduino weiss
nicht was er mit einem Pegel von 2.5V anfangen soll.

von rollmops (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Du willst es nicht kapieren? Dein 5V Arduino weiss
> nicht was er mit einem Pegel von 2.5V anfangen soll.

Ich sag doch, dass ich weiß, dass der Spannungsteiler falsch ist. Bei 
1:1 werden die 5V auf 2,5V geteilt.

Ich will aber noch nichts neues bauen, weil ich nicht weiß wie ich die 
Zeitkonstante ausrechne.

von Michal P. (michal)


Lesenswert?

Du brauchst nich viel rechnen. In meinen Simulationen hat es mit breitem 
Spektrum von R und C sehr gut funktioniert, auch runter in nF und kOhm 
Bereich.

Das Konzept ist gut.

Das einzige was wichtig ist, die High Zeiten müssen wesentlich länger 
als die Low Pulse dazwischen sein, damit sich das High Level über den 
oberen pull up Widerstand wieder aufladen kann. Sonst wandert das Low 
Pegel langram hoch.

Gräße

Michal

von m.n. (Gast)


Lesenswert?

rollmops schrieb:
> Ich will aber noch nichts neues bauen,

Dann mache es so:

Michal P. schrieb:
> Entferne einfach den unteren 1 MOhm.

von m.n. (Gast)


Lesenswert?

Michal P. schrieb:
> Das einzige was wichtig ist, die High Zeiten müssen wesentlich länger
> als die Low Pulse dazwischen sein, damit sich das High Level über den
> oberen pull up Widerstand wieder aufladen kann.

Das muß garnicht sein. Die Eingangsdioden beim AVR 'klemmen' das Signal 
auf den richtigen Pegel.

von Michal P. (michal)


Lesenswert?

m.n. schrieb:
> Die Eingangsdioden beim AVR 'klemmen' das Signal
> auf den richtigen Pegel.

??? Nö. Was das Signal am Arduino-Eingang wieder hochzieht ist einzig 
und alleine der pull up Widerstand. Es würde sogar der µC interne 40 
kOhm funktionieren. Sonst ist der Eingang alleine ja hochimpedant 
passiv.

: Bearbeitet durch User
von rollmops (Gast)


Lesenswert?

Habe es jetzt hinbekommen.

Habe einen Optokoppler von meinem Kollegen vorgeschlagen bekommen, damit 
funktioniert es einwandfrei.

Vielen Dank für eure Hilfe!!!

von MaWin (Gast)


Lesenswert?

rollmops schrieb:
> Ich habe schon eine kleine Schaltung gebaut.

Wenn die eingetragenen Signalpegel und Formen richtig sind:

Einfach GND der Quelle mit +5V des uC verbinden.

Wenn das nicht geht: Einfach die unteren 1M entfernen, ich würde auch R 
mit 19k und C mit 100nF dimensionieren, weil sonst die Einschwingzeit, 
also die Zeit zwischen einschalten der Versorgung und Funktion der 
Schaltung zu lange dauert.


Falls deine Quelle niederohmig ist (mehr als 20mA liefern kann): Noch 
zumindest 4k7, besser 10k vor den C in Reihe.

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.