Guten Abend,
ich bräuchte einen guten Tipp bei emeiner Fehlersuche, da mich mein UNO
ans Ende meines Lateins gebracht hat und ich auch im Netz keine Lösung
gefunden habe.
Ich habe mir in ein bestehendes Teile-Fördergerät mit 24VDC Motor
(welcher über eine PWM + Sanftanlauf-Platine geregelt werden kann) einen
UNO, eine IR-Reflexlichtschranke und eine Step-Down Platine (24VDC-7VDC)
zur Versorgung der zusätzlich verbauten Messtechnik eingebaut.
Der UNO soll mir die Teile, die das Grundgerät ausspuckt über den Sensor
zählen - was auch perfekt funktioniert.
Um etwaig flatterig vorbeifallende Teile nicht mehrfach zu zählen und
den Code prioritätsbezogen auszulegen, habe ich das 5V-Digitalsignal vom
Sensor über eine Schmitt-Schaltung mit RC-Glied gelegt und das
ergebende, saubere Rechteckrignal dem UNO auf PIN3 entsprechend mit
Interrupt 1 aufgelegt.
Wie gesagt, zählt mein Aufbau perfekt und für sich alleine sehr robust.
Wenn ich nun allerdings den Kippschalter zur PWM Schaltung für den 24V
Motor einschalte, zählt der UNO zufallsbedingt 1-5 Impulse/Stück hoch.
Selbiges passiert, wenn der Motor betriebsbedingt belastet wird (die PWM
Schaltung belastet wird).
Auch kann der Motor für sich ausgeschlossen werden, da auch die PWM
Platine für sich ohne angeschlossenen Motor am Ausgang das Phänomen
verursacht.
Codebedingt KANN das Hochzählen nur innerhalb der ISR passieren, d.h.
der Arduino triggert offenbar den Interrupt.
Nun habe ich bereits mit einem Oszi das Triggersignal (vom Schmitt
perfekt aufbereitet), auch die Massepegel zueinander und die Versorgung
des UNO kontrolliert. Leider keine Auffälligkeiten - Alles so sauber,
wie man es sich nur wünschen kann. (Massen der 7V Schiene vom Ardu-24VDC
Geräteversorgung zueinander perfekt, auch das aufbereitete Sensorsignal
ist erwartungsgemäß ein perfektes Rechtecksignal ohne Störungen,
Verschleifungen oder Fehlersignale).
Wenn ich entweder den Eingangspin abziehe oder den Eingang entsprechend
umlege, ist der Effekt weg. -> es muss also vom Signal verursacht sein,
obwohl ich dort wie gesagt zum Zeitpunkt der Fehltriggerungen eine
Nulllinie am Oszi sehe.
Auch die Pegel vom fertig aufbereiteten Triggersignal passen zur
Ardu-Versorgung (0V und gute 5V).
Ich frage daher das geballte Wissen hier im Forum, ob es irgend eine
Möglichkeit gibt, wie mein Interrupt auslösen kann, ohne dass sich am
Zuleitungspin signaltechnisch etwas regt.
DANKE.
Hallo,
auch wenn du das vielleicht nicht messen kannst, tippe auf Störungen der
Spannungsversorgung die irgendwie einstreuen. Kannst du testweise alles
ohne den StepDown DC-DC Wandler versorgen? Mit zwei "Labor" DC
Netzteilen?
Wolfgang schrieb:> zählt der UNO zufallsbedingt 1-5 Impulse/Stück hoch.
Da gibt es viele Möglichkeiten. Du kannst solche Effekte durch robustes
Software Design minimieren. Z.B. ist es evtl. sinnvoll, in der ISR noch
einmal zu prüfen, ob der Pin den Pegel hat, den er nach auslösen der ISR
haben soll.
Dann kann man einen Pin auch per Timer Polling abfragen, so ähnlich wie
eine prellende Taste. Und schliesslich kann man auch auch mal diese 'PWM
Platine' fotografieren und hier posten, damit wir mal was vom Aufbau
sehen.
Wenn da dicke Elkos drauf sind, kann der Ladestrom schon einiges stören.
Wolfgang schrieb:> Wenn ich entweder den Eingangspin abziehe oder den Eingang entsprechend> umlege, ist der Effekt weg. -> es muss also vom Signal verursacht sein,
Da wäre ich mir nicht so sicher. Es könnte auch eine Kombination von
Störung im Signal und in der Versorgungsspannung sein.
Einige Ideen, um den Fehler einzukreisen:
- Den Arduino UNO an Batterie betreiben, um Störungen durch die
Versorgung auszuschließen.
- wie viele Teile kommen pro Sekunde maximal vorbei - in anderen Worten:
Was ist die maximale Interrupt-Frequenz? Entsprechend dieser Frequenz
einen R-C Tiefpass vor den Interrupt schalten. Runde Kanten des Impulses
sind erstmal egal - der Schwellwert ist entscheidend.
- Werden die Störungen in deine Arduino-Platine oder die
Sensorik-Platine eingestreut? Mal beide Platinen mittels
Verlängerungskabel von der PWM-Steuerung und dem Motor entfernen
- Motor mit Kondensatoren entstören.
Wolfgang schrieb:> Codebedingt KANN das Hochzählen nur innerhalb der ISR passieren, d.h.> der Arduino triggert offenbar den Interrupt.
Dann guck doch mal mit einem Oszi nach, wie das Signal aussieht, das am
Interrupteingang ankommt. Und wie lange dauert deine ISR?
Matthias S. schrieb:> Da gibt es viele Möglichkeiten. Du kannst solche Effekte durch robustes> Software Design minimieren. Z.B. ist es evtl. sinnvoll, in der ISR noch> einmal zu prüfen, ob der Pin den Pegel hat, den er nach auslösen der ISR> haben soll.> Und schliesslich kann man auch auch mal diese 'PWM> Platine' fotografieren und hier posten, damit wir mal was vom Aufbau> sehen.> Wenn da dicke Elkos drauf sind, kann der Ladestrom schon einiges stören.
Der erste Tipp mit dem Workaround über einen zusätzlichen digitalRead
klingt gut, das werd ich bei nächster Gelegenheit gleich testen.
Wenn Ladeströme von ElKos auf der originalen PWM Schaltung Schuld sein
könnten - wäre es dann überhaupt plausibel, da ja wie erwähnt auch
falsch getriggert wird, wenn der Motor bereits läuft und dieser nur
zusätzlich belastet wird? (kenne mich da in der Materie leider zu wenig
aus)
Thomas S. schrieb:> - Den Arduino UNO an Batterie betreiben, um Störungen durch die> Versorgung auszuschließen.
An einem Labornetzgerät hatte ich meinen Aufbau bereits getestet. Das
hat die Fehltrigger nur weniger werden lassen, aber sie traten dennoch
weiterhin auf.
> - wie viele Teile kommen pro Sekunde maximal vorbei - in anderen Worten:> Was ist die maximale Interrupt-Frequenz? Entsprechend dieser Frequenz> einen R-C Tiefpass vor den Interrupt schalten. Runde Kanten des Impulses> sind erstmal egal - der Schwellwert ist entscheidend.
Die Stückzahl ist für den UNO unwichtig, da ich das Triggersignal vom
Sensor kommend bereits mit einem RC Glied, einem Schmitt-Trigger und
einem Pull-Down Widerstand sauber aufbereitet habe und dies mit dem Oszi
auch kontrolliert wurde. (sauberes Rechteck pro Impuls, keine
Verschleifungen, keine Einstreuungen)
> - Werden die Störungen in deine Arduino-Platine oder die> Sensorik-Platine eingestreut? Mal beide Platinen mittels> Verlängerungskabel von der PWM-Steuerung und dem Motor entfernen>> - Motor mit Kondensatoren entstören.
Laut Messungen habe ich am Ardu weder in der Versorgung noch am
Interrupt-Pin unerklärliche Signale. Das ist ja gerade das unerklärliche
an meiner Situation. Die ISR wird aufgerufen, ohne dass ich erkennen
könnte wieso.
Da also weder das Signal noch der Bezug seitens der Versorgung auffällig
sind und bei der Fehlersuche auch der Motor vom PWM Platinen-Ausgang
abgeklemmt wurde, muss rein von der Logik die Platine Richtung UNO
streuen oder den Pegel bis über den Step-Down rüber beeinflussen (was
ich ja leider trotz Oszi nicht nachweisen kann).
WENN es Einstreuungen über den Luftweg sind, kann ich dem Problem nur
mit einem Workaround beikommen (siehe ganz oben in diesem Text z.B.), da
sowohl die PWM- und auch die Ardu Platine im originalen Gehäuse
untergebracht werden sollen und dort ohnehin schon maximal
auseinandergerückt angebracht sind.
Wolfgang schrieb:> habe ich das 5V-Digitalsignal vom> Sensor über eine Schmitt-Schaltung mit RC-Glied gelegt und das> ergebende, saubere Rechteckrignal dem UNO auf PIN3 entsprechend mit> Interrupt 1 aufgelegt.
Die Frage ist, wie weit ist diese Schaltung vom MC entfernt und wie ist
deren GND angebunden? Die Leitung zum MC kann bequem als Antenne wirken
und die Interrupt-HW latcht extrem schnell (<50ns).
Ein Bild des Aufbaus wäre extrem hilfreich.
Ich vermute mal, die Teile werden nicht wahnsinnig schnell bewegt. Da
bietet sich statt der Schaltung eine Entprellung mit 4-fach Abtastung im
Timerinterrupt (z.B. 10ms) an. D.h. nur bei 4-mal unterbrochen wird ein
Teil gezählt und 4-mal Licht wird als Lücke erkannt.
Interrupteingänge nimmt man nur für wirklich eilige Sachen oder zum
Aufwachen.
Wolfgang schrieb:> Codebedingt KANN das Hochzählen nur innerhalb der ISR passieren, d.h.> der Arduino triggert offenbar den Interrupt.
Das ist eine Annahme, Behauptung, These, oder was auch immer.
Da ich das nicht überprüfen darf/kann, halte ich diese und alle darauf
aufsetzenden Annahmen für potentiell falsch.
Dieses bestätigt mich in der "falsch" Annahme:
Wolfgang schrieb:> Laut Messungen habe ich am Ardu weder in der Versorgung noch am> Interrupt-Pin unerklärliche Signale.
Also nein, ich weiß nicht, welche Magie da bei dir dort aktiv ist, aber
auslösende Hardware Interrupts, ohne Signal auf den Leitungen, sind mir
noch nicht unter gekommen.
Tipp:
Etwas weniger Prosa, und mehr Fakten.
z.B.:
Code, Schaltplan, Foto vom Aufbau ...
Wolfgang schrieb:> Die Stückzahl ist für den UNO unwichtig, da ich das Triggersignal vom> Sensor kommend bereits mit einem RC Glied, einem Schmitt-Trigger und> einem Pull-Down Widerstand sauber aufbereitet habe und dies mit dem Oszi> auch kontrolliert wurde. (sauberes Rechteck pro Impuls, keine> Verschleifungen, keine Einstreuungen)
Die Masse vom Oszi kann das Ergebnis verfälschen. Da die AVRs schon
Schmitttrigger an ihren Eingängen haben, würde ein RC-Glied (10k, 10nF
als Hausnummer) direkt davor mit hoher Sicherheit alle hochfrequenten
Störungen ausschließen.
Mangels Schaltung/Programm kann man allerdings nicht sehen, was sonst
noch so abgeht. Ich denke, Du willst uns "schützen" ;-)
m.n. schrieb:> Mangels Schaltung/Programm kann man allerdings nicht sehen, was sonst> noch so abgeht. Ich denke, Du willst uns "schützen" ;-)
Das auch :)
Hauptsächlich aber, weil ich nur am Wochenende bei der Schaltung bin.
Ich habe euch aber über Umwege Bilder besorgt und aus dem Kopf einen
Schaltplan gezeichnet (ihr wolltet es ja so ;D).
Werte, an die ich mich nicht erinnern konnte, habe ich extra nicht
geraten und auch nicht beschriftet.
Übersichtsbild (nicht allzu viel zu erkennen):
https://abload.de/img/uebersicht4sjky.png
Die originale PWM Platine, die wohl der Übeltäter ist (Motor
abgeklemmt):
https://abload.de/img/pwm_platine5jky4.png
stümperhafter Schaltplan:
https://abload.de/img/schaltplan4yjal.png
Sorry für den Schaltplan - die PWM Platine wird natürlich über den
Kippschalter auf dem Übersichtsbild eingeschaltet und hat einen
integrierten Sanftanlauf.
Wie gesagt, tritt mein Phänomen jeweils beim Einschalten der PWM Platine
(auch ohne Motor) als auch bei jeglichem mechanischen Bremsen des
angeschlossenen und laufenden Motors auf.
Wolfgang schrieb:> Sorry für den Schaltplan
Schmitttrigger IC: Pin12-Pin13 sind verbunden. Der Rest hängt in der
Luft? Lasss das Teil einfach einmal weg und verbinde Pin12 mit Pin13.
Den 6k8 muß man ganz weglassen.
Tiefpass: wie groß ist die Zeitkonstante? Ich sehe 1 µF oder 10 µF, was
sehr groß ist.
my2ct schrieb:> Gibt es einen besonderen Grund, die Bilder nicht hier im Thread zu> zeigen und so kryptisch zu benennen?
Weil ich die Upload-Funktion nicht beachtet habe und das so von anderen
Foren gewohnt bin. Die Dateibenennung erfolgt durch den Hoster.
Ist doch kein Beinbruch, oder? :)
Nick M. schrieb:> Dann erzähl mal was von deinem Netzteil und der Motorleistung.
Laut Aufdruck liefert es 24V/1A, den Motor habe ich bei unüblicher
mechanischer Belastung mit knapp 300mA gemessen. Die Spannung ist dabei
stabil geblieben.
m.n. schrieb:> Schmitttrigger IC: Pin12-Pin13 sind verbunden. Der Rest hängt in der> Luft? Lasss das Teil einfach einmal weg und verbinde Pin12 mit Pin13.> Den 6k8 muß man ganz weglassen.> Tiefpass: wie groß ist die Zeitkonstante? Ich sehe 1 µF oder 10 µF, was> sehr groß ist.
der Schmitt ist (nicht eingezeichnet) ebenfalls von den 7V versorgt.
Die Zeitkonstante habe ich mit ~0.2s angenommen, da ich mit einem max.
Durchsatz von 4 Stück/Sekunde rechne und Toleranz lassen wollte.
Grundsätzlich geht es mir bei der Schmitt-Entprellschaltung um die
Vermeidung von Doppelsignalen, wenn ein Teil nicht im Surrzflug an den
Fotodioden vorbeifällt, sondern alle Nase lang mal Eines dabei ist, das
im Fall eher "vorbeiklappert". Ohne Entprellung hatte ich so öfters
Doppelzählungen dabei.
Wolfgang schrieb:> der Schmitt ist (nicht eingezeichnet) ebenfalls von den 7V versorgt.
Ganz schlechte Idee, die IOs des MCs dürfen nur max VCC (5V oder 3,3V)
sehen. Die VCC wird so auf 6,3V durch die interne Schutzdiode angehoben.
Auch müssen alle unbenutzten Eingänge des Schmitt-Triggers beschaltet
werden.
Hau das ganze Glump raus und machs in SW mit einem Timerinterrupt.
Achte darauf, daß am IO-Pin max VCC anliegt. Der Arduino hat bestimmt
einen VCC-Anschluß rausgeführt.
Was für Werte haben denn die Rs im Filter? Wie sieht denn das Signal
vorm Schmitt-Trigger aus? Was ist das für ein Schmitt-Trigger der mit 7
V läuft? Gibt es einen Kondensator nach dem DC-DC-Wandler?
Wolfgang schrieb:> der Schmitt ist (nicht eingezeichnet) ebenfalls von den 7V versorgt.> Die Zeitkonstante habe ich mit ~0.2s angenommen, da ich mit einem max.> Durchsatz von 4 Stück/Sekunde rechne und Toleranz lassen wollte.
Bei so langsamen Änderungen wäre ein Tiefpass mit 100k und 100nF doch
als Schutz vor Überspannung und Störung ausreichend. Da kann man doch
garnichts falsch machen.
Was aus Schaltplan und Fotos nicht ersichtlich ist, ob sich nicht zu
lange Leitungen von GND die Störungen einfangen.
Peter D. schrieb:> Hau das ganze Glump raus und machs in SW mit einem Timerinterrupt.
Wenn man das Pogramm hätte, könnte man die Änderung gleich dazutippen
;-)
Peter D. schrieb:> Ganz schlechte Idee, die IOs des MCs dürfen nur max VCC (5V oder 3,3V)> sehen. Die VCC wird so auf 6,3V durch die interne Schutzdiode angehoben.> Auch müssen alle unbenutzten Eingänge des Schmitt-Triggers beschaltet> werden.
Der Eingangspin bekommt eh nur 0/5V, die der Sensor vom Arduino kommend
durchschaltet.
Die nachgefragte Versordung vom Schmitt (TI CD40106B) liegt an 7V, was
laut angehängtem Datenblatt perfekt passen sollte.
Wolfgang schrieb:> Die nachgefragte Versordung vom Schmitt (TI CD40106B) liegt an 7V, was> laut angehängtem Datenblatt perfekt passen sollte.
CMOS-Schmitttrigger sind allseits bekannt und dieser ist zwar
überflüssig, wird aber eher nicht das Problem sein. Ich denke, mit
Deinen selektiven Antworten kommen wir nicht weiter.
Wolfgang schrieb:> Die nachgefragte Versordung vom Schmitt (TI CD40106B) liegt an 7V, was> laut angehängtem Datenblatt perfekt passen sollte.
Und die zu hohe Spannung am Ausgang, die direkt auf den Arduino-Eingang
geht, ignorierst du einfach?
Siehe hier:
Peter D. schrieb:> Ganz schlechte Idee, die IOs des MCs dürfen nur max VCC (5V oder 3,3V)> sehen.
Dietrich L. schrieb:> Und die zu hohe Spannung am Ausgang, die direkt auf den Arduino-Eingang> geht, ignorierst du einfach?
Wieso ignorieren? Ich habe doch oben geschrieben, dass ich mit dem Oszi
auch dieses Signal bereits kontrolliert habe und neben der perfekten
Rechteckcharakteristik ohne Störungen auch die Pegel für den MC passen
(5.2V gegen MC GND bei HIGH Signal).
m.n. schrieb:> Ich denke, mit> Deinen selektiven Antworten kommen wir nicht weiter.
Worauf soll ich denn antworten, wenn nicht auf eure Detailfragen?
Was kann ich noch beitragen? Ich bin offen für sachdienliche Hinweise.
:)
> die Pegel für den MC passen (5.2V gegen MC GND bei HIGH Signal).
Wohl, weil die Schutzdioden am MC-Eingang den Schmitttrigger-Ausgang in
die Knie zwingen ...
Wolfgang schrieb:> die Pegel für den MC passen (5.2V gegen MC GND bei HIGH Signal).foobar schrieb:> Wohl, weil die Schutzdioden am MC-Eingang den Schmitttrigger-Ausgang in> die Knie zwingen ...
Richtig.
Und wie groß der Strom durch die Dioden dann ist und was er eventuell
böses anrichtet kann man nur spekulieren. Das kann durchaus eine Ursache
für unkontrolliertes Verhalten sein.
Wolfgang schrieb:> Die nachgefragte Versordung vom Schmitt (TI CD40106B) liegt an 7V, was> laut angehängtem Datenblatt perfekt passen sollte.
Was du da zeigst ist "Absolute Maximum Ratings", das hat absolut nichts
mit regulären Betrieb zu tun.