PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Winkelsensor, Poti oder Lichtschranke?



BlooD
15.08.2005, 12:49
Hi.
Ich hab hier einen Verteiler, der verschiedene Getränke mischen soll.
Ich habe aber Probleme mit der Positionsermittlung.

Zuerst aber mal ein Bild (Draufsicht):
http://www.derbuss.de/files/mischer01.jpg
Ein Grundkörper, in diesem ist eine Kreistasche herausgerfräst, in der eine Scheibe läuft. Die Scheibe ist mit einer Taktscheibe verbunden, in die Bohrungen mit einer Teilung von 15° gebohrt wurden.

Von vorne:
http://www.derbuss.de/files/mischer02.jpg
Unten im Grundkörper sieht man hier ebenfalls die Bohrungen; gleiche Teilung wie in der Taktscheibe (15°).

Der Sensor (Isometrisch von unten):
http://www.derbuss.de/files/mischer03.jpg
Die eine zusätzliche Bohrung ist zur Bestimmung des Referenzpunktes. In die Bohrungen der Abfrageeinheit kommt jeweils eine IR-Lichtschranke.


Nun zum Problem:
Der Verteiler, soll die verschiedenen Positionen anfahren können, dabei wird einfach der Referenzpunkt angefahren und ab diesem gezählt.
Manchmal funktioniert das und manchmal nicht und das Ding verzählt sich.
Ich glaube es liegt an dem zu langsamen Abfragen, allerdings benutze ich einen Java-Mikrocontroller, der das leider nicht schneller kann.

Was kann ich verbessern?
Meine Vorschläge:
- einen Winkelsensor, bzw. ein Poti (das aber keinen Endanschlag haben sollte), so hätte ich immer einen absoluten Wert, aber ist das genau genug?
- den Durchmesser der Taktscheibe vergrößern (ich kann sie ja fast bis auf das doppelte vergrößern, allerdings will ichs nicht machen, wenn es nachher doch nichts bringt - wieder die Frage ob es genau genug ist.)
- die Scheibe langsamer drehen lassen, nur wie? (Wird angetrieben mit einem VW-Scheibenwischermotor auf der langsamen Stufe)

Eigentlich kann ich mir nicht vorstellen, das der Mikrocontroller nicht mitkommt mit dem zählen, denn soo schnell ist das ja auch wieder nicht. vielleicht liegt es auch an der Programmierung.

Hier ein Code-Schnipsel zum aufwärtsbewegen, auch wenn hier wahrscheinlich keiner einen Mikrocontroller mit java programmiert...



static private void moveUp(int x) {
while (GLOBAL.MIX_POS < x) { //solange aktuelle Position kleiner als neue
powerUp(true); //Motor-Linkslauf einschalten
while (isPos()) {} //warten bis auf Position
while (!isPos()) {} //warten bis nichtmehr auf Position
powerUp(false); //Motor-Linkslauf ausschalten
GLOBAL.MIX_POS++; //aktuelle Position um eins erhöhen
TOOLS.pause(MOTOR_PAUSE_MOVE); //kurze Pause, sonst klappts gar nicht mit dem zählen (10ms)
}
}



Wie würdet ihr das lösen?
Bin natürlich auch für jede andere Idee dankbar!

PicNick
15.08.2005, 13:37
Ich hatte mal das Vergnügen, bei einem DVD-Wechsler mit einer ähnlichen Problemstellung die Software zu schreiben.
http://195.128.164.40/rt_music/electronic/dvd/dvd.htm
Dabei hat sich gezeigt, daß das zuverlässige Finden eine NULL-Position garnicht so trivial ist, wie man meinen möchte, auch ohne, daß irgendwas zu langsam wäre. Es war einfach das Gefummel mit Drehrichtung/Flanke/Geschwindigkeit, daß man schon Nachdenken mußte.
Bißchen erschwerend war, daß die Bewegung des Carousel (aus Gewichtsgründen) mit einer Beschleunigung- und Bremsphase ausgeführt werden mußte, d.h. zur Position mußte es sich ggf. einpendeln und konnte nicht einfach stoppen.
Ich will damit sagen, daß es solche eleganten Statements wie "isposi()" in sich haben. Schau dir diese Funktionen genau an.

Klaus_0168
15.08.2005, 14:43
Hi BlooD,

die Idee mit dem Poti finde ich gar nicht so übel. Den Poti kannst Du ja zur groben Positionsbetimmung verwenden und die Lichtschranke zur Feineinstellung.

Ich hatte mal ein ähnliches Problem mit einer Siphonschälzentrifuge. Die Position vom Schälrohr wird mit 4 Punktmessungen ermittelt. Leider hat die Hydraulik die Positionen öfters überrannt. Ich hatte keine Möglichkeit eine kontinuierliche Messung (Äquivalent zum Poti) zu installieren.

Als Lösung habe ich beim Verlassen der Punktmessungen die Laufrichtung in die Positionsmeldung eingerechnet.

Die Punktmessungen sind den Positionen 1 (innen) bis 4 (außen) zugeordnet. Wenn das Schälrohr nach aussen fährt und eine bekannte Position verlässt addiere ich zur alten bekannten Position 0.5 hinzu. Wenn das Schälrohr nach innen fährt und eine bekannte Position verlässt ziehe ich von der alten Position 0.5 ab.

Beispiel :

Position 3 ist aktuell
es wird nach innen gefahren
wenn Position 3 verlassen wird ist die Position => 3 - 0.5 = 2.5
sobald Position 2 erreicht wird ist Position 2 die Aktuelle.

Wird Position 2 in gleicher Richtung überfahren, dann
Ist die aktuelle Richtung -> nach innen
und von der letzten gemessenen Position wird wieder 0.5 subtrahiert.
Position => 2 - 0.5 = 1.5 -> die aktuelle Position ist 1.5

Bei mir hat es funktioniert und die Positionsregelung konnte problemlos gefahren werden, da immer bekannt ist, in welcher Zwischenstellung sich das Schälrohr befindet. Wenn eine Sollstellung überfahren wird ist die Korrektur sofort möglich.

Wenn Du das Poti zur groben Positionsbestimmung verwendest kannst Du Dir die Rechnerei auch sparen. Mit dem Poti kannst Du die Fahrrichtung bestimmen und solange in Position fahren bis die Lichtschranke die korrekte Stellung meldet. Wenn die Sollstellung überfahren wird, einfach einen Schubs zurück fahren. Im Anfahrmoment sind die Motoren sowiso etwas langsamer.

Gedankenblitz :
Wenn Du PWM zur Verfügung hast kannst Du damit die Leistung und damit die Geschwindigkeit vor dem Erreichen der Sollposition reduzieren.

Grüße Klaus

BlooD
15.08.2005, 14:52
So genau wie bei deinem DVD-Wechler muss es gar nicht sein, wenn die Drehscheibe ganz außen mit der Position auf 1mm genau stimmt, sollte das schon gehen, aber das muss halt zuverlässig sein.
Ich kann bei dem Motor nicht einfach so eine Flanke machen, weil ich den einfach nur per Umpolrelais ein/ausschalte.
Die 10ms Pause nach einem Schritt ist dafür, das der nicht zu schnell wird, und nach jeder Position ganz kurz wartet.

Ich frage mit istPos() nur ab, ob die Lichtschranke schaltet oder nicht. Das ist sicher nicht optimal, aber wie soll ichs sonst machen?

PicNick
15.08.2005, 14:53
@Klaus: Bitte, bitte, sag einem armen Ösi, was eine "Siphonschälzentrifuge ist"

Klaus_0168
15.08.2005, 15:02
@PicNick : Es geht nicht um die spezielle Zentrifugenart, sondern um die punktgenaue Positionierung mit Lichtschranken.
Ich versuche mal ein Schema zu finden und stelle das Bild online - mit Worten geht das nicht so einfach.

und ... wozu gibt es eigentlich Google und Co ??

Meinst Du mit Ösi einen Österreicher ?
Als Deutscher habe ich gelernt, daß auch Österreicher etwas wissen können. Hab' nichts gesagt, jedoch sehr laut :-#

Grüße Klaus

PicNick
15.08.2005, 15:15
Du hast schon recht, wer den Schaden hat, spottet jeder Beschreibung.

.. wozu gibt es eigentlich Google und Co ??
Auch da hast du recht, das sollt' man jedem sagen, der grad ein Forum einrichtet.
:mrgreen:

BlooD
15.08.2005, 15:40
Ich hab zwar zwei PWM-Kanäle, jedoch sind diese schon fest als Clock und CW/CCW der L297/L298 Steuerung für einen anderen Motor belegt :(
Ich wüsste jetzt auch gar nicht, wie ich mit dem PWM und dem Relais den Motor langsamer laufen lassen kann.

Ich könnte höchstens den Motor immer wieder ein und ausschalten, hört sich bestimmt bescheuert an, mit dem Relais... welches wohl auch irgendwann früh sterben würde - oder nicht?

Klaus_0168
16.08.2005, 10:51
Hi BlooD,

um Gottes Willen, kein PWM mit Relais. Da kannst Du zusehen, wie Dir die Kontakte weggebrutzelt werden.

Das nächste was mir noch einfällt währe irgend etwas mit dem I2C-Bus. Mit diesem Bus können mehrere Slaves angesprochen werden, an denen eine Motoransteuerung hängen könnte.
Da hab' ich allerdings selbst noch keine Erfahrungen. Keine Ahnung wie man so etwas zu realisieren ist. Das geht jetzt in die Richtung meiner Signatur.

Grüße Klaus

BlooD
16.08.2005, 13:43
Ich hab mir das mit dem PWM nochmals überlegt. Problem ist halt, das ich eine komplette Platine schon hab und die wegwerfen müsste, wenn ich jetzt das Relais durch eine PWM-Schaltung ersetzte...
Deshalb wäre es mir Recht, wenn ich die vorhandene Platine verwenden könnte.

Ich werd mich mal schlau machen wegen PWM, hab davon noch keine Ahnung, im prinzip wird da der Motor immer ein und ausgeschaltet, oder?
Da der Motor aber ordentlich Ampere saugt wird das auch nicht einfach.

PicNick
16.08.2005, 16:56
Jetzt laß mal die Kirche im Dorf und versuch, den Fehler einzukreisen.
So schnell kann sich doch das Werkel garnicht drehen ?
Wenn du ein terminal drauf hast, schreib doch den Zähler immer raus
Reicht vielleicht, wenn du die Löcher etwas breiter machst, wenn's eh nicht so furchtbar genau sein mußt.
Es dreht sich vielleicht nur um ein Frauenhaar.

Psiyou
16.08.2005, 17:39
Jetzt hab ich so spontan aber doch noch mal ne Frage...
Was bitte ist den nun Siphonschälzentrifuge ??
Hab mal bei Wikipedia gesucht, nix gefunden, und bei googel gabs nur einen Treffer mit Produckbeschreibung (Druckerei oder so was...)
Oder war das nur so ne Verarschung und ich habs nicht geschnallt ?? :-k

Klaus_0168
18.08.2005, 08:28
Hi Psiyou,

Die Zentrifugenart ist keine Verarsche - ich werde eine Grafik erstellen.

Klaus

michaelb
18.08.2005, 09:37
Hallo,
ich hab ne Frage an Blood: Welches CAD Programm benutzt du?
Gruß Michi

BlooD
18.08.2005, 10:00
@michaelb:
das ist mit Inventor von Autodesk gezeichnet.

@PicNick:
ich hab grad mal gestoppt, das Ding dreht sich in ca. 1,5 Sekunden einmal - das entspricht einer Drehzahl von 40/min. Das ist ja nicht wirklich schnell.
Wenn ich da an eine alte Computernaus denke, bei denen werden ja viel mehr Positionen gezählt...
Mit einer abweichung von maximal 1 Grad könnte ich vermutlich leben, das sollte doch zu machen sein, wenn ich jedoch die Löcher wieder etwas vergrößere, dann wirds auch wieder schlechter, oder?

@all:
Wenn ich das nicht in den Griff bekomme, hab ich mir auch schon überlegt, einen Spannungsteiler zu machen, verteilt auch die 19 Positionen, dann hätte ich immer die absolute Position.
Würde dann nochmals in 15°-Schritten löcher bohren und irgendwie mit Schleifkontakten arbeiten, die müssen allerdings rostfrei sein und natürlich störsicher. Viel Arbeit :-(
Somit würde ich mich von der Lichtschranke halt trennen, könnte aber evtl. meine Platine beibehalten, wenn ich den Spannungsteiler irgendwie extern mache.

Klaus_0168
18.08.2005, 11:03
Hi all,

@Blood : Ich habe mal eine Frage
Werden die Impulse für die Positionserkennung überhaupt vom uC richtig erkannt ??

@all :
Um diesen Tread nicht weiter zu verschmutzen habe ich für die Erklärung der Siphonschälzentrifuge einen eigenen Tread angelegt. Sorry Blood, ich weis das ist ziemlich ausgeufert.
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11835&highlight=

Grüße Klaus

BlooD
18.08.2005, 11:16
Impulserkennung:
Wie soll ich das am besten nachprüfen?
Ich erhalte je einen Analogwert zwischen 0 und 255 (einmal für die Positionsbohrungen und einmal für die Referenzbohrung), je nachdem wie die Lichtschranke steht.
Damit frage ich einfach ab, ob der Wert über z.B. 150 liegt, dann wird gezählt.

Nicht so schlimm das das hier ausgeartet ist, interressiert mich ja selber was das ist :)

Klaus_0168
18.08.2005, 12:13
Hi BlooD,

wenn ich mir nicht sicher bin, ob ein Impuls ankommt schreibe ich mir eine Zusatzroutine, die mir die Impulse entweder in der Zeit verlängert oder die Anzahl der Impulse zählt.
Da in Deinem Fall die Impulse alle 79ms kommen empfiehlt es sich die positiven (oder auch negativen) Flanken der Impulse zu zählen. Wenn die gezählten Impulse nicht der Lochanzahl entsprechen hast Du ein großes Problem. Wenn die Löcher/Positionen nicht richtig erkannt werden, hast Du keine Change die Positionen anfahren zu können.

Analogeingänge sind im Allgemeinen langsamer als Binäreingänge. Wenn ein Interrupt - Eingang frei ist, würde ich sogar den nehmen.

Bevor die Fragen kommen sage ich gleich, das ich selbst noch keine Interrupts programmiert habe. Interrupts sind jedoch um einiges schneller, weil die Auslösung der Interrupts von der Hardware gesteuert werden. Abgesehen davon brauchst Du keine zyklischen Abfragen zu programmieren, die nur Resourcen beanspruchen und extrem Zeitkritisch sind.

Grüße Klaus

BlooD
18.08.2005, 14:31
Soo, ich hab nun mal was neues geschrieben,
einfach Motor an, zählen und immer bei dem Referenzpunkt wird der Zähler auf 0 gesetzt und verglichen ob es genau 24 sind.
Hab das jetzt mal ein paar minuten laufen lassen und ich hatte KEINEN *freu* fehler drin.
Somit kann ich doch jetzt davon ausgehen, das die Impulse gescheit ankommen?
Allerdings taste ich es nun ganz anders ab. Indem ich den vorherigen Analogwert mit dem nachfolgenden vergleiche, da hab ich immer eine absteigende und eine Aufsteigende Kurve, bei der am Wendepunkt der Zähler erhöht wird.

Nun hab ich noch das Problem, das beim ausschalten des Motors die Scheibe ein wenig nachläuft, und schon nichtmehr auf der genauen Position steht, wodurch sich wieder Fehler ergeben würden. Durch das verwendete Relais wird der Motor kurzgeschlossen, wenn keine Spannung ansteht, das bringt schon was, aber reicht eben nicht ganz.
Wäre also geschickt, wenn ich die geschwindigkeit zusätzlich drosseln könnte.
Oder den Motor eine Position davor stoppe und durch kleine Impulse mich bis zur endgültigen position vortaste.

Aber das macht man normal nicht mit einem Relais, oder? So kleine Impulse meine ich...

BlooD
18.08.2005, 15:20
Ach, 79ms stimmt glaub net, sind ja 1,5/24 = 63ms.
Ich benutze nur 270°, deshalb die 19 Positionen.

Klaus_0168
19.08.2005, 10:56
Hi BlooD,

wer lesen kann ist klar im Vorteil. ](*,)
Die 15° - Teilung der Aufgabenbeschreibung habe ich einfach mal so ignoriert (überlesen).

Ich sehe zwei Lösungsmöglichkeiten für Dein Problem.

a) Schau Dir doch noch mal mein Posting vom 15.08. um 15:43h an. Dort habe ich eine Prozedur beschrieben, die ich selbst mit Erfolg in einer echten Anlage implementiert habe (der Siphongschälzentrifuge). Dieser Algorithmus beinhaltet auch die Erkennung von Zwischenpositionen. Wenn die Zwischenpositionen bekannt sind kann die Steuerung besser auf die Situation reagieren.

b) Versuch den Motor doch einfach mal eine Position vor dem Ziel auszuschalten. Ich halte diese Version allerdings für ziemlich primitiv, da es keine aktive Positionskorrektur gibt.
Für Deine weiteren Überlegungen gebe ich Dir zu bedenken, das ein Motor nur mit Verzögerung anläuft und abbremst. Dies kann man auch ausnutzen. Wenn Du den Motor vor Erreichen der Position ausschaltest und auf der Zielposition einen kurzen Impuls in die Gegenrichtung gibst, besteht die Möglichkeit das Ziel besser zu treffen.

Aber Vorsicht !!! - Das Umschalten in die Gegenrichtung darf nicht zu schnell erfolgen, da der Motor sonst beschädigt werden könnte.

Da fällt mir noch ein :
Wieviel wird die Position verfehlt. Ist es nur eine weitere Rasterposition, nur ein paar Winkelgrade oder mehrere Positionen ??

Grüße Klaus

BlooD
19.08.2005, 14:22
Danke nochmals für deine Antwort, ich hab mir das auch schon überlegt, mit dem zählen der Zwischenpositionen, jedoch bin ich immer noch der Meinung, das mein Mikrocontroller manchmal nicht mitkommt:

Wenn ich den Motor anschalte, beim Referenzpunkt 0 setze und immer bis 24 Zählen lasse funktioniert das - wie ich oben schon gesagt hab. Da habe ich auch zwei Zähler laufen lassen, einmal die Positionen und einmal die nicht-Positionen.
Will ich aber zwischen den Positionen anhalten oder umdrehen scheint dieser Vorgang so viel zeit zu brauchen, das manchmal eine Position übersehen wird.

Zu b)
Der Motor läuft nicht immer genau gleich schwer; deshalb wäre es wieder sehr schwer zu sagen, wieweit er denn jetzt gefahren ist...

Zu deiner Frage: manchmal wird eine position übersehen (mehr eigentlich nicht), aber kleine Winkelabweichungen habe ich immer.

Je mehr ich drüber nachdenke, bin ich immer mehr davon überzeugt, diese Zähl- und Positionieraufgabe für den Motor einem ATMega8 o.ä. zu geben, der kommt wenigstens sicher mit und der bisherige Mikrocontroller könnte die anderen Aufgaben erledigen, z.B. das Benutzermenü und die, die nicht zeitkritisch sind. Da könnte ich mich dann von dem Relais verabschieden und den Motor mit PWM ansteuern?!
Dann könnte ich wenigstens auch langsamer anfahren und abbremsen, was sicherlich auch Motorschonender ist.
Wäre das nicht sinnvoll?

Jetzt kanns sein, das ich vom eigentlichen Thema abschweife:
Ich hab noch keine Ahnung von AVR's oder PIC's, es gibt sicherlich viele Forenthemen darüber, aber falls mir einer ne kurze Antwort geben könnte, wäre das super.
Wie lange braucht ein normalsterblicher, bis er sowas Programmiert hat? In Assembler wäre wohl am besten? (Und davon hab ich auch noch keine Ahnung)

Klaus_0168
21.08.2005, 22:52
Hi BlooD,

Welchen uC und welchen Compiler verwendest Du ?
Kannst Du mal das Listing posten ? Wenn es zu lang ist, schicke es mir einfach per Mail.

Hast Du die Möglichkeit Interrupteingänge zu verwenden ?
Wenn die Positionsbestimmung mit einem Interrupt berechnet wird, könnte dies die Belastung des uC verringern.

Wie kommst Du darauf, das der uC Impulse verschluckt ? Hast Du dafür Beweise oder ist es nur ein Gefühl ?

Die Aufgaben auf verschiedene uC zu verteilen ist eine Möglichkeit. Es kommt halt nur das Problem hinzu, das die Prozessoren mit einander kommunizieren müssen. Dies könnte man mit RS232, RS485, I2C o.ä. realisieren.

Für die AVR's gibt es mehrere Compiler für Basic (Bascom-AVR), Pascal (Embeddet Pascal), C (Win-AVR), Assembler usw. Der Basic - Compiler Bascom-AVR ist sehr einfach in der Bedienung und hat einen Simulator. In Deinen Beiträgen habe ich gesehen, daß Du Dir noch genügend Fantasie und Spieltrieb bewahrt hast (ist sehr wichtig !!!) um die Programmierung ohne Probleme erlernen zu können.
Wenn Du keine Vorkenntnisse zum Thema Programmieren hast, würde ich von Assembler abraten. Assembler ist zwar sehr schnell, geht jedoch sehr tief in die Hardware hinein.

Basic kann als typische Anfängersprache jeder lernen. Selbst einem Normalsterblichen ist es vergönnt sich so weit herunterzudenken =P~ . C hat meiner Meinung nach zu bescheidene Zeichenketten-Routinen. Pascal habe ich bisher nur mit Delphi benutzt.

Grüße Klaus

BlooD
21.08.2005, 23:36
Hi Klaus.

Ich verwende jControl. Infos dazu unter http://www.jcontrol.org

Der Controller wird mit Java programmiert (Compiler in der IDE enthalten) und da dieser noch nebenher sachen machen muss, danke ich einfach das dieser Impulse verschluckt.
Bisher war das nur ein Gefühl, aber ich habe vorhin gelesen, das der A/D-Wandler nur alle 16ms abgefragt wird, das kann natürlich auch negativ dazu beitragen, deshalb will ich aus dem analogen wert jetzt auch ein digitales machen (wie du auch schon gesagt hast).

Da ich mich eben wie schon gesagt vom Relais verabschieden will werd ich die nächste Woche probieren mich in ATMEL's einzuarbeiten und damit auch mittels PWM und über MOSFETs den Motor steuern.

Kommunikation soll über I2C laufen, da ich die RS232 schon anders Verwende. Der ATMega8 dann als Slave.

Wegen dem Quelltext:
Ich hab die Tage so viel dran geändert, ich weiß schon gar nicht mehr, wie es denn am besten funktioniert hat. Wenn ich jetzt nen Code posten würde, wär das wahrscheinlich nicht hilfreich...

Klaus_0168
22.08.2005, 10:16
Hi BlooD,

der jControl sieht richtig interessant aus. Was mich besonders angesprochen hat ist der niedrige Preis für einen kompletten Controller incl. Grafikdisplay und allen Schnittstellen die man so braucht. Dies sind gute Vorraussetzungen für einen Masterprozessor.

Zurück zum Impulsproblem :
16ms kann schon ziemlich knapp werden. Die Positionserkennung funktioniert nämlich nur dann, wenn die Positonsbohrung mindestens 32ms unter der Lichtschranke bleibt (doppelte Wandlerzeit). Und das werden dann ziemlich lange Löcher.
-> QED : Mit dem ADW kann es nicht korrekt funktionieren. Schade.

Selbst mit einem Atmel wirst Du auf digitale Signale umsteigen (hast Du ja schon angesprochen) und mit Sicherheit einen Interrupteingang verwenden müssen. Alles andere wird zu langsam sein.

JControl als Master und einen Atmel als Slave solten Dein Problem lösen können.

Für den Bascom-AVR-Compiler gibt es eine Demoversion, die vom Netz heruntergeladen werden kann. Mit der Demoversion kann leider nur maximal 2kB Programmcode erzeugt werden. ( http://www.mcselec.com/download_avr.htm ) Eine Vollverson kostet 80 - 100€.

Grüße Klaus

BlooD
22.08.2005, 13:07
Hi Klaus,

stimmt, das sind ja 32ms, dann ists ja noch schlimmer :-/

Nun, ich fand das jControl eben auch günstig, und praktisch, da ich eh Java lernen muss.

Wenn du das günstig nennst, dann schau mal bei ELV:

Controller 79,95: http://www.elv.de/shopping/ArtikelDetail.asp?SessionId=00189716890498272120&Stufe=2&Referenz=578%2D21&Gruppe=ME%2DPC&Menue=Ja

Evaluation-Board 13,95:
http://www.elv.de/shopping/ArtikelDetail.asp?SessionId=00189716890498272120&Stufe=2&Referenz=578%2D21&Gruppe=ME%2DPC&Menue=Ja

vor allem das Evaluation-Board ist für den Preis unschlagbar - und es scheint baugleich zu sein.

Ich hab heute morgen die Eingänge digital abgefragt, nochmal mit dem JControl. Allerdings nur über einen einfachen Spannungsteiler, ein bisschen scheint es besser zu sein, aber es reicht noch nicht.
Reicht das so als digitale Lösung, oder sollte man mit sowas nochmal über einen extra Transistor oder so gehen?

Ich hab nun auch mal Sachen für den ATMega8 bestellt :)
2kb Programmcode sollten doch für dieses Problem reichen?!?
Wahrscheinlich werd ichs zuerst mal in Basic probieren, das hab ich schonmal beim C-Control I gemacht, auch wenns anders ist, immer noch besser als gleich Assembler.

Klaus_0168
22.08.2005, 20:57
Hi BlooD,

Ob nur ein Spannungsteiler oder eine Transistorschaltung verwendet wird hat keinen nennenswerten Einfluss auf die Signallaufzeit. Die Durchlaufzeiten dürften kaum messbar sein. Ein Spannungsteiler verringert die Ausgangsspannung. Mit einer Transistorschaltung kann die Ausgangsspannung vergrößert werden.

TTL - Signale sind in den Spannungen definiert.
Spannungen kleiner 0.8 V gelten als Low; Spannungen > 2.0 Volt als High. ( http://de.wikipedia.org/wiki/Transistor-Transistor-Logik ) Kann es sein, daß Du in den undefinierten Bereich (0.8 bis 2.0V) geraten bist ??

Die Boards werde ich mal im Auge behalten. Bin im Moment etwas knapp, jedoch immer auf der Suche nach vernünftigen Lösungen.

2kB sind ein Haufen Holz. Damit kann man schon etwas anfangen. Mein erster Computer war ein Sinclair SX mit 1kB RAM. Die Gigabytes von heute sind nur ein Effekt der Multimediafähigkeit moderner PC's. In einem meiner Betriebe läuft eine sicherheitsgerichtete Steuerung von HIMA mit ca. 30 EA's und einem Programmcode der nur 23kB groß ist.
Die SPS von Erdmann ( http://www.edmund-erdmann.com/v2/de/index.php ) läuft mit einem Z80-Prozessor (8Bit Datenbus, 16Bit Adressbus -> 64kB Ram pro Datenbank) und wird noch heute eingesetzt.

Grüße Klaus

BlooD
23.08.2005, 07:28
Hi Klaus,

dann werde ich Spannungsteiler nehmen, das dachte ich mir so:
ein 1k-Widerstand und ein Poti mit 10k in Reihe als Pulldown verwenden, dann kann ich das später immer noch einstellen.

Scheint so, als würde der JControl sich nicht ganz an TTL halten?!
Ich hab in meinem Versuch gestern die Eingänge digital und analog abgefragt, da schaltete der Eingang bei ca. 140 (~2,7V) Digital auf HIGH und bei ca. 103 (~2,0V) wieder auf LOW.

Zusätzlich schreibt einer der Entwickler im jControl-Forum noch:

VIL (Input low level voltage) = max. 0.3xVcc = 1.5V
VIH (Input high level voltage) = min. 0.7xVcc = 3.5V
Vhys (Schmitt trigger voltage hysteresis) = 400mV

Ich bekomme für "da-ist-kein-Loch" den Wert 3, für "Da-ist-ein-Loch" bis zu 242, das sollte doch eigentlich gut machbar sein.

Klaus_0168
24.08.2005, 22:01
Hi BlooD,

kein Loch = 3; Loch = 242 ?
Das klingt mir doch wieder nach einem Analogeingang. Hab' gerade in der Doku gelesen, das der jControl nur Analog-, PWM- oder Busleitungen hat. Das bestärkt meine Befürchtung, das der Contoller bei Deiner Aufgabenstellung nur als Komunikationsprozessor verwendet werden kann.

Die Zuordnungen der Spannungen zum ADW-Wert ergibt eine Quantisierung von ca. 19.3 mV/Digit. Demnach entspricht der Wert 3 ca. 58mV und die 242 ca. 4.7V. Bei dem Versuch war der Poti auf 100% (=10k) eingestellt, korrekt ??

Die Grafikroutinen sind ziemlich rechenaufwendig. Hast Du mal versucht, auf optische Routinen soweit wie möglich zu verzichten ? Das wird allerdings keinen Einfluss auf die AD-Wandlerzeit von 16ms haben.

Wenn dies alles nicht hilft, bleibt Dir nur noch der Weg über einen Co-Prozessor wie Du es schon vorher angesprochen hast.

Grüße Klaus

BlooD
24.08.2005, 22:26
Hi Klaus,
ich sagte ja, ich hab es gleichzeitig digital und analog abgefragt.
Die Analogwerte habe ich nur zusätzlich nochmal kontrolliert, hab mich vielleicht flasch ausgedrückt.
Kein Loch=3 (Digital auf LOW (false) schaltete er bei kleiner 109)
Loch = 242 (Digital auf HIGH (true) schaltet er bei größer 140)

ja der Poti war auf 10k eingestellt.

Ich habs auch schon ohne Grafikroutinen probiert und ohne serielle Schnittstelle usw. brachte alles nix, ist einfach zu ungenau und zu unsicher.
Ich machs jetzt definitiv über einen Co-Prozessor, vorallem weil ich ein schönes grafisches Menü möchte.

Klaus_0168
24.08.2005, 22:53
Hi BlooD,

wir haben vom gleichen gesprochen ohne das ich es richtig ausdrücken konnte - sorry.

Wg. Grafikroutinen und Schnittstellen - der ADW braucht halt seine 16ms. Das ist der Faktor, der die zeitkritische Messung zum kippen bringt. Ich bin mal gespannt, wie es mit der Co-Prozessorversion weiter geht.

Grüße Klaus

BlooD
31.08.2005, 18:49
So,
ich hab nun mal soweit alles zusammen und mein erstes Bascom-Programm steht auch schon.
Ich habs mit Interrupts probiert, aber ich glaube die Signale sind zu unsauber.
Nun, hab ne neue Taktscheibe gebastelt, größer als die alte und nicht mit Löchern, sondern mit Schlitzen, das scheint genauer zu sein, nachdem was man so liest.

Da ich immernoch nicht ganz klar komme mit dem Entprellen etc. dachte ich mir ich probier mal diese Oszilloskope für die Soundkarte aus. Unten seht ihr das Ergebnis. Ich hab leider keine Ahnung, ob das korrekt eingestellt war, aber das sieht doch gut aus, oder nicht?

Wenn man den Timer0 als zähler nutzt, kann man dann auch mal vorwärts
und mal rückwärts zählen oder geht der nur in eine Richtung?


Hab noch was vergessen:
Die untere Grenze ist 265mV, die obere 3,2V - am besten sollte man das doch auf 5V aufpeppeln, oder? Schmitt-Trigger?
Was ich auch noch sagen wollte, mit einem 100nF Kerko zum Entprellen wirds eher schlimmer statt besser. Was könnte man sonst noch machen?

Klaus_0168
01.09.2005, 07:16
Hi BlooD,

die Binäreingänge des uC haben schon einen Schmitt-Trigger. Das sollte kein Problem sein. Das Signal sieht schon richtig gut aus. Leider ist in der Grafik nicht die Teilung Zeitachse beschriftet.
Kannst Du den Interrupt so einstellen, das er bei positiver und negativer Flanke kommt ? Dann muss es eigentlich funktionieren.

Gruß Klaus

BlooD
01.09.2005, 08:34
Ich glaub das geht nicht, ich kann den Interrupt nur

LOW ACTIVE (Also kontinuierlich wenn LOW ist)
FALLING (fallende Flanke)
RISING (steigende Flanke)

einstellen.

Ich hab mit einem nachgeschalteten BC547 jetzt 0V / 5V. Ein Bisschen besser ist das Zählen jetzt geworden, ich hoffe so sollte es gehen. Nochmal richtige Versuche werde ich heute Mittag oder Abend machen.

Hab nochmal nen Bild gemacht, diesmal nen Screenshot. Die Zeitachse lässt sich nicht einblenden, deshalb hab ich es mal bemaßt.
Mein Multimeter sagt auch 14,6...15,0Hz (68,02ms...66,66ms) - Was sich ja duch das Oszi bestätigt.

https://www.roboternetz.de/phpBB2/files/ports2.png

Hab da noch ne Frage zu a und b:
Ich nehme an...
a) ist der Übergang von Hell/Dunkel
b) ist der Übergang von Dunkel/Hell

kommt das von der Lichtschranke oder vom Transistor oder von was?

Klaus_0168
01.09.2005, 10:34
Hi BlooD,

ich vermute beides. Die flache Steigung ist möglicher Weise die seitlich einschwenkende Abdeckung der Lichtschranke und die steile Flanke könnten Laufzeiten vom IR-Empfänger und/oder dem Transistor sein.

Grüße Klaus

PicNick
01.09.2005, 11:05
Sag mal einem Unwissenden: Das ob. Oszillogramm ist doch vom PC, der dazu die Soundblaster als AD-Wandler nimmt ? Oder ist da spezielle Hardware ?
Wie gesagt, wenn Soundblaster, dann ist da sicher eine AC-Kopplung, die Frequenzen von ~15 Hz sehr stark differenzieren wird. Genausoi schaut das Oszillogramm auch aus.
Am Wechsel 0-5 / 5-0 hast du steile Anstiege, die dann langsam abfallen.

BlooD
01.09.2005, 14:39
Nein keine spezielle Hardware - das ist ne Software für die Soundkarte, da hast du schon recht. Ich habs einfach mal angehangen und hatte nach probieren dieses signal - ist auch das erste mal, das ich sowas gemacht hab.

Hab von Oszis eigentlich keine Ahnung, wollte mir mal so ne Hardware zulegen, aber weiß nicht, ob ich das wirklich brauch bzw. obs was taugt.

01.09.2005, 14:43
Na dann tät ich sagen, die hell/dunkel Übergänge sind dort, wo's senkrecht rauf/runter geht. Und für die Verhältnisse sind das im Ursprung blitzsaubere Rechtecke. Sprich: Wenn Problem, dann hinten nach

BlooD
10.09.2005, 16:12
So nochmal als "Abschluss".
Ich hab jetzt sicherheitshalber nochmal einen extra Schmitt-Trigger aufgebaut, für beide Lichtschranken, den ich zusätzlich mit Potis einstellen kann --> jetzt funktioniert das Einwandfrei.
Ich habs nun auch nicht über Interrupts gemacht mit dem Zählen, da der ATmega8 sonst eh nix zu tun hat, aber das klappt ganz gut.

Danke an alle die mir geholfen haben :-)