PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pull-up, Pull-down, meinm Grauen



Cysign
26.11.2013, 14:43
Hallo beisammen.
Nachdem sich endlich am Holzprototypen meiner CNC-Maschine was getan hat, würde ich nun gerne die Endschalter funktioneirend anstöpseln.
Das Problem:
GRBL verlangt an den einzelnen Limit-Schaltern (die haben intern nen Pull-up) bei Betätigung der Schalter Masse (also Schließer als Endschalter). Verbaut sind aber schon seit lange bevor wir beschlossen hatten, GRBL als Steuerung zu nutzen, Öffner.

Der Plan ist nun, die Öffner mit 5V (die haben wir eh von der Logik der Treiberkarten) zu versehen und diese als Pull-up an die Pins anzulegen, welche jedoch auch mit der Masse verbunden sind, sodass bei geschlossenen Schaltern 5V anliegen, sobald diese 5V jedoch nicht mehr anliegen, das Signal durch die Masseverbindung heruntergezogen wird (was ja wegen der internen Pull-ips hochgezogen ist).
Allerdings will mir nicht ganz in den Sinn, wie ich nun alles verschalten muss und welche Widerstandswerte in Frage kommen.

Unser bisheriger Versuch:
Ground - 1K (oder 0,5k oder 0,3k) Widerstand - Pin - Öffner- 5v

Jedoch führte keiner der Widerstände zu einem Ergebnis, wie wir es gerne hätten :D (bei 0,3K lag noch ein Pegel von 0,11V an, nen kleinerer Widerstand bereitet mir irgendwie gefühlsmäßig Kopfzerbrechen).

Mein neuer Plan ist:
Ground - ganz kleiner Widerstand - PIN - großer Widerstand - Öffner- 5V

Aber so ganz logisch erscheint mir das nun auch wieder nicht.
Bevor ich jetzt das Netzteil zu arg belaste, hätte ich gerne Input von euch Profis ;)

BMS
26.11.2013, 15:07
Hallo,
die Variante mit den 0,3kOhm funktioniert schon. 0,11V gilt definitiv als Low-Pegel. Ein sauberer High-Pegel ist mit den Pullups bereits garantiert.
Ein Nachteil ist allerdings die höhere Stromaufnahme wenn der Kontakt geschlossen ist. Dann fließen 5V/300Ohm=16,7mA. Bei mehreren Endschaltern summiert sich das ...

Du könntest kannst das Signal auch erst mit einem Transistor oder Logikgatter (mit open Collector Ausgang) invertieren. Der Schalter braucht dann aber einen eigenen Pullup-Widerstand (der aber hochohmiger sein darf, 10k aufwärts).
Übrigens kann es auch hilfreich sein, die Taster zu entprellen, z.B. mit einem zusätzlichen Kondensator/ RC-Glied.
Grüße, Bernhard

Klebwax
26.11.2013, 15:53
Tu den anderen, die hier lesen, und vor allem dir selbst einen Gefallen: zeichne das, was du machst oder machen willst als Schaltplan auf. Dein Problem ist sicher einfach zu lösen, deine Prosa werde ich aber nicht nachvollziehen.

MfG Klebwax

Cysign
26.11.2013, 16:05
Das mit den 0,11V dachte ich auch. Jedoch scheint hier der interne Pullup des Arduinos zu greifen. Mit 0,11V bekomm ich die Endschalter nicht ausgelöst :(

Cysign
26.11.2013, 20:21
Okay, wir haben das hier:







Arduijno-Pin mit internem PullUp
o
|
|
|
|
|
|
5V T |
--- | GND
-----------o o-------------o---------------------
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)



Der Pin vom Arduino muss auf Masse gezogen werden, wenn die Leitung keine 5V anliegen hat.

BMS
26.11.2013, 20:43
Da hast du wohl den Widerstand vergessen, im Moment ist der Arduino-Pin direkt mit GND verbunden. Taster T würde dann auch einen saftigen Kurzschluss zwischen 5V und GND machen :p

hbquax
26.11.2013, 20:45
In der Skizze fehlen die Widerstände...
Prinzipiell ist das Problem, um den Pin sicher auf GND zu ziehen, muss da ein recht kleiner Widerstand (idealersweise gar keiner...) nach GND verbaut werden. Dann brauchst du aber einen noch kleineren Widerstand auf der anderen Seite, um den Pin wieder auf 5V zu ziehen. Und dann fließt permanent einiger Strom. Das ganze ist ein Spannungsteiler.

Cysign
26.11.2013, 20:54
Nicht vergessen, weggelassen, weil ich nicht weiß, was ich jetzt noch versuchen soll. Wie gesagt haben ich vorhin 1k, 0,5k und 0,3k zwischen Pin und Ground ausprobiert, jedoch lieferte keiner das nötige Ergebnis.

hbquax
26.11.2013, 21:16
Besorg dir ein paar kleine Relais zum invertieren oder andere Schalter. Oder änder die Software.

Thomas E.
26.11.2013, 22:25
Wenn ein Pegel von 0,11V nicht als sauberes 0 erkannt wird, dann ist dieses ominöse "GBRL" Mist.

Cysign
27.11.2013, 00:22
'ominös' ist es wohl eher nicht. Und ja, ich muss zugeben, dass ich die Logik hinter der Schließer-only-Idee nicht gut finde, zumal Öffner an der Stelle mehr Sinn machen.
Aber egal, das Problem hab ich jetzt nunmal und ich möchte es lösen.

Dass der Pegel von 0,11V nicht als Ground erkannt wird, wird - wie bereits erwähnt - wohl am internen Pull-Up liegen. Aber wie das genau verschaltet ist, weiß ich um ehrlich zu sein nicht.

Die Software zu ändern bedeutet vermutlich enorm viel Aufwand...da ich mich in den Quellcode einlesen, ihn verstehen, verändern und neu kompilieren müsste.
Meine Idee wäre, die 5V durch einen geeigneten Widerstand so weit herabzusetzen, dass man problemlos zwischen Pin und Ground einen sehr geringen Widerstand einsetzen kann, welcher den Pegel, trotz internem Pullup-Widerstand des Arduinos, runter zieht.
Macht das Sinn? Und welche Werte sollte ich in Erwähgung ziehen?

PICture
27.11.2013, 00:32
Hallo!

Ich würde dir empfehlen mehr messen und weniger spekulieren. Beispielweise, wenn du den Pin mit GND per Strommessgerät verbindest, kannst du bei bekannter Spannung 5 V den "pull-up" ziemlich genau ermitteln.

Ich denke, das dein kompliziertes o.g. Plan sinnlos ist. ;)

hbquax
27.11.2013, 08:45
Hast du denn allereinfachsten Test schon gemacht, den PIN direkt mit GND zu verbinden? Löst er dann korrekt aus? Haben der Arduino und die Schalter definitiv gemeinsame Masse? Wenn beides ja, dann wie oben geschrieben, den Strom messen, der über GND fließt, und hier posten.

Was würden denn neue Schalter kosten? Und was kostet es, wenn die Endabschlatung nicht zuverlässig ist und die Maschine durchdreht?

Cysign
27.11.2013, 18:29
Wenn ich den einen der drei Pins (X-, Y-, Z-Achse) direkt mit Gnd verbinde, funktioniert alles, wie es soll.
Die Masse des Leistungsnetzteils, des Logiknetzteils und des Arduinos (der via USB mit Strom versorgt wird), ist zusammengeführt.

@Picture: Danke für den Vorschlag. Ich werde nacher mal messen, wie viel Strom fließt. Und wie wäre die weitere Vorgehensweise?

BMS
27.11.2013, 22:43
Die Größe des internen Pullups lässt sich mit den bisherigen Angaben bereits ermitteln.
Bei einer Last von 0,3kOhm hast du eine Spannung von 0,11V gemessen. Es fließen also 0,11V/300Ohm=0,000367A
Am Pullup-Widerstand fallen 5V-0,11V=4,89V ab. Da durch ihn derselbe Strom fließt, ergibt sich ein Widerstandswert von 4,89V/0,000367A=13,3kOhm.
Auf dem kleinen Arduino ist ein ATmega328 verbaut, laut Datenblatt haben die integrierten Pullup-Widerstände zwischen 20 und 50kOhm.
Grüße, Bernhard

Cysign
25.12.2013, 13:56
So, heute hab ich endlich mal wieder Zeit um mich weiter darum zu kümmern.
Ich habe gestern kurzerhand nen Git-Account gemacht und in der GRBL-Community nachgefragt: https://github.com/grbl/grbl/issues/307
Die Programmierer haben diesen Fall schon vorgesehen - allerdings muss ich mir GRBL gleich dann selbst neu kompilieren, nachdem ich die Codezeile



// #define LIMIT_SWITCHES_ACTIVE_HIGH auskommentiert habe.
Ich denke, das sollte die einfachste Lösung sein ;)

Dennoch Danke für all euere Ratschläge!

Cysign
26.12.2013, 21:27
So, also den ursprünglichen Arduino haben wir auf den Endschalterpins scheinbar gegrillt. Die 3 Pins sind bei dem tot.
Nachdem ich dann eben was länger mit dem Oszilloskop und nem neuen Arduino rumgespielt hatte, hab ichs dann geschafft, die Endschalter mit nem neu kompilierten GRBL so hin zu bekommen, dass es funktioniert - aufm Breadboard.
Auch kann ich den Arduino problemlos an die CNC-Maschine anschließen und alles mit Universal-GCode-Sernder steuern und die Auslösung der Endschalter problemlos testen - solange ich die L298er nicht mit Strom versorge, also solange nur die Logik- nicht aber die Leistungsspannung anliegt.
Sobald ich das 40V-Netzteil einschalte, meint der Arduino, dass die Endschalter aktiviert wurden.
Woran könnte das liegen?

Der Aufbau ist nun:

Arduino - Schalter - Ground

An Ground sind Arduino (der über USB mit Strom versorgt wird), das Logiknetzteil (ein kleines 4,75V Netzteil der Größenordnung Handyladegerät) und das Meanwell 40V/3A-Netzteil zusammengeführt.
Sollte ich mal versuchen, nen Widerstandand zwischen Schalter und Masse zu klemmen? Oder nen Kondensator um eventuelle Schwingungen auszugleichen?

- - - Aktualisiert - - -

So, mein erster Versuch war nun ein Elko zwischen 5V und Ground - nahe an den Endschalterpins. Ergebnis: Es dauerte ne Weile (vermutlich bis der Elko sich geladen hatte), bis die Endschalter nun wieder automatisch (ohne Kontakt) ausgeführt wurden.

- - - Aktualisiert - - -

L297-Seite : Arduino-Seite
Step : Pin2/3/4 (x/y/z)
Direction : Pin 5/6/7 (x/y/z)
Reset : liegt fest an 5V des Arduino
Enable : Pin 8

Das sind die Steuer-Pins des Arduinos zu den Schrittmotorkarten. Alle Treiberkarten teilen sich den Enable-Pin und die 5V-Spannung für den Reset-Eingang.
Alles weitere siehe Bild:

http://cysign.net/pics/fraese/cnc.jpg

Das Problem ist, dass die Endschalter bei meiner Version Öffner sind, jedoch GRBL gerne Schließer hätte.
Im Quellcode des GRBL kann man in der config.h die Zeile

// #define LIMIT_SWITCHES_ACTIVE_HIGH (Zeile 178 unter https://github.com/grbl/grbl/blob/master/config.h) auskommentieren, um statt Schließer Öffner zu verwenden.

Der Code und das Kompilieren des Codes zu einer flashbaren Hex-Datei funktioniert soweit auch.
Auch ein Test des Arduinos auf meinem Breadboard funktioniert fehlerfrei.
Wenn der Arduino nun vollkommen an der CNC-Maschine angeschlossen ist, funktioniert alles wie gewünscht, solange lediglich USB und die Logikversorgung angeschlossen sind.
Schalte ich nun das Leistungsnetzteil (im Bild rot) ein, geht der Arduino von einem ausgelösten Endschalter aus und die Achsen stoppen, Universal-GCode-Sender, den ich zum Steuern des Arduinos nutze, gibt dann aus:

ALARM: Hard limit. MPo
http://cysign.net/pics/fraese/limits.jpg

Ich habe testweise einen 220µF-Kondensator zwischen Gnd und 5V geklemmt, augenscheinlich scheint sich die Zeit, bis sich der Limit-Schalter automatisch aktiviert, zu verlängern.

Bis auf die fehlausgelösten Endschalter funktioniert alles wie es soll. In der kurzen Zeit, in der der Arduino verfährt, konnte ich auch durch manuelles Auslösen der Endschalter verifizieren, dass diese auch richtig auslösen. Nur machen sie das eben auch ungewollt und ohne Einfluß.

Cysign
26.12.2013, 23:15
Puh, also ich hab jetzt ne Lösung und ne Theorie.
Die Kabel der Taster liegen unisoliert parallel zu den Stromleitungen der Motoren oder zu der Stromleitung des Netzteils.
Auf der X- und Z-Achse konnte ich das Problem lösen, wenn ich etwa 18K-Ohm parallel zum Taster anbringe (Breadboard mit zwei 10k-Potis in Reihe drauf gekommen).
An den Tastern der Y-Achse arbeite ich grade noch.
Aber mich verwundert das Verhalten dennoch.

//Edit: Bei der Y-Achse funktionert es ohne Trickserei. Also brauch ich 2x 18kOhm für die Schalter der X- und der Z-Achse.

//Edit2: War ja klar, nachdem ich mir alles schön mit Widerständen zurecht gemacht hatte, hat irgendwas rumgezickt und es funktioniert wieder nicht.
Also hab ich mein Widerstandkonstrukt entsorgt und nun Trimmpotis eingesetzt. Ich werd morgen mal schauen, ob ich es damit endlich gelöst bekomme...

Cysign
03.01.2014, 22:57
Hmmm...so ganz funktionierts leider immer noch nicht.
Ich hab ein paar alte USB-Kabel geopfert, um die Kabel zu den Schaltern nun mit geschirmten Kabeln auszustatten.
Komischerweise funktioniert das bei 3 von 6 Schaltern. Bei der Z-Achse funktionieren beide Schalter, auf der X-Achse keiner und auf der Y-Achse einer.

Das komische ist nur, dass an jeder Achse beide Schalter in Reihe sind: Arduino-Schalter1-Schalter2-Masse
Mit dem Multimeter komme ich auf einen Widerstand von 0,9-1,2Ohm pro Tasterweg.
Auch wenn ich das Multimeter auf Durchgangsprüfung stelle, hört es auf zu piepen, sobald ich einen der beiden jeweils in Reihe geschalteten Taster drücke.
Der Punkt ist aber: Auf der Y-Achse funktioniert lediglich der Schalter, welcher näher am Arduino liegt. Der weiter entferntere Schalter löst den Pin am Arduino nicht aus.
Könnte das etwas mit der nicht vorhandenen Entprellung der Taster zu tun haben? Dass die im Arduino irgendwie ein Fehlverhalten auslösen?
So langsam weiß ich nicht, was ich noch anstellen könnte...
Oder sollte ich einfach die Abschirmung der Kabel von der Masse trennen?

- - - Aktualisiert - - -

Okay, das Austauschen der Kabel war nötig. Das Verbinden der Abschirmung mit Masse hingegen unnötig - ohne Masse an der Schirmung funktionierts endlich! Ich freu mich grade wie ein Keks - denn beim Testen der Taster hat UniversalGCode-Sender rumgezickt und die funktionierenden Taster haben mich grade vor ner Stunde Endschalterwiederdranbasteln gerettet :)