Hallo liebe Mikrocontrollergemeinde, ich möchte anfangen eure wunderschöne Welt der Mikrocontroller zu beschreiten und frage mich nach dem lesen des tutorials, was sollte ich mir für ein startboard kaufen, wo ich drauf üben kann. Die Wahl fällt mir dabei sehr schwer. Ziel soll es sein, irgendwann einmal eine Maschinenpneumatik steuern zu können (z.B. um Müll zu pressen, wenn er durch eine Lichtschranke fällt) Das bringt mich auch direkt auf meine erste Frage. Ich habe hier einen Durchflussmesser liegen, einen VISIO 2000, dieser gibt ein NPN open collector Signal aus. Wie kann ich es mit meinem ATMEGA32U4 Chip auf einem Teensy2.0 Board so realisieren, dass die auf dem Board befindliche LED im Bereich PORTD pro HIGH signal des Drehzahlmessers blinkt. Ich würde mich freuen, wenn mir jemand bei meinen Entscheidungen und bei meinen kleinen Anfängen helfen könnte.
Du kannst den Open-Collector-Ausgang direkt an einen Pin des ATMega hängen. Diesen Pin musst du dann als Eingangspin (DDR-Register) definieren und auf "1" (high) setzen (PORT-Register) damit der interne Pull-Up-Widerstand aktiviert ist. Wenn jetzt der NPN schaltet, wird der Pin auf "0" gezogen, ansonsten ist er "1". Die LED blinken lassen bei "0" ist ja relativ klar: Schleife, Sensor-Pin-Abfrage, LED-Pin setzen...
Sebastian Ziegenbein schrieb: > ich möchte anfangen eure wunderschöne Welt der Mikrocontroller zu > beschreiten... Schön. Ich würd sagen du liest dich hier im Tutorial mal ein, da wird eine sehr effektive Möglichkeit des Einstiegs aufegzeigt. Allgemein: http://www.mikrocontroller.net/articles/AVR-Tutorial Für C-Liebhaber: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial > Das bringt mich auch direkt auf meine erste Frage. > > Ich habe hier einen Durchflussmesser liegen, einen VISIO 2000, dieser > gibt ein NPN open collector Signal aus. Also die Funktionsweise ist klar? Wenn der Sensor ein Signal ausgibt, zieht er die Signalleitung auf Masse. Das lässt sich an einem uC sehr einfach detektieren, Signalleitung über Widerstand auf Versorgungsspannung de uCs legen, sobald Signal da ist, ist die Leitung auf 0Volt. :-)
Für deine Anwendung würde ich ein LOGO!, easy von Moeller oder eine richtige SPS vorschlagen. Dein Sensor wird sehr wahrscheinlich für 24V DC ausgelegt sein. Da MC mit Spannungen von 3,3...5V arbeiten, geht da nix.
Der VISIO 2000 kann mit 5-24 Volt betrieben werden. Die Anleitung des ersten Posters werde ich nachher mal ausprobieren. Eine Sache wäre jedoch. Der MC wird via USB gespeist (Strom). Kann ich den VISIO 2000 einfach mit einem 12V netzteil betreiben ohne meinen ATMEGA zu toasten ? Laut Anleitung des VISIO 2000 ist optional ein Kondensator ein zu setzen zwischen SIGNAL und VDC. Ist das notwendig bei meiner Schaltung ? Siehe: http://www.produktinfo.conrad.com/datenblaetter/150000-174999/150218-da-01-de-VISION_2000_DURCHFLUSSMESSTURBINE.pdf
Sebastian Ziegenbein schrieb: > Laut Anleitung des VISIO 2000 ist optional ein Kondensator ein zu setzen > zwischen SIGNAL und VDC. Ist das notwendig bei meiner Schaltung ? Das ist kein Kondensator, sondern ein Widerstand. Und seine Aufgabe ist es eben dem Open COllector Ausgang auch dann einen definierten Pegel zu geben, wenn der interne Transistor nicht durchgeschaltet hat. Ob der im Mega eingebaute zuschaltbare Pullup Widerstand ausreicht, müsste man ausprobieren. > Eine Sache wäre jedoch. Der MC wird via USB gespeist (Strom). > Kann ich den VISIO 2000 einfach mit einem 12V netzteil betreiben > ohne meinen ATMEGA zu toasten ? Wenn du mit dem internen Pullup Widerstand auskommst, besteht keine Gefahr. Wenn nicht, dann solltest du diesen Wiederstand nicht nach +12V legen, sondern nach +5V. Abgesehen davon kannst du damit deinen Mega nicht toasten. Einfach die Massen miteinander verbinden sowie die Signalleitungen und dann sollte das schon gehen. Allerdings: Mach erst ein paar Vorübungen und Vorversuche. Arbeite das Tutorial durch. Dein Sensor ist im Prinzip nichts anderes als ein Taster, der an einem Eingangspin hängt. Genauso wie das Board. Wenn du Schwierigkeiten hast, dich für ein Board zu entscheiden, dann nimm zunächst das, an welches du am besten rankommst. Es ist sinnlos, in deinem jetzigen Zustand nach einem Board zu suchen, dass 'das kann' was du brauchst. Denn im Prinzip können das so gut wie alle. Und wenn nicht: Die Megas kosten ein paar Euro und es ist keine Hexerei sich ein für die Aufgabenstellung massgeschneidertes Board zu bauen. Das einzige worauf du wirklich achten solltest: Kauf dir einen vernünftigen Programmer. Mach um alle Startboards, die über RS232 oder die parallele Schnittstelle eines PC programmiert werden einen großen Bogen. Es wird mitlerweile immer schwieriger diese Programmer mit modernen PC zur Zusammenarbeit zu bewegen. Mit einem Programmer, den du am USB Port anstecken kannst, ist es hingegen kein Problem. Und nein: RS232 über USB (mit einem USB/RS232 Wandler) funktioniert nicht zuverlässig. Das heißt: Du stellst dein großes Ziel jetzt erst mal zurück, lernst zu programmieren, baust eventuell auch dein erstes Board selber auf. Und erst dann gehst du wieder zurück zu deinem langfristigem Ziel. Und du wirst sehen: All die kleinen Problemchen und Unklarheiten, die dich jetzt noch quälen lösen sich selbst in Wohlgefallen auf, weil du dann schon mit einem gewissen Grundwissen an dein Problem rangehst.
Vielen Dank, für deine große Hilfe, ich werde mir das zu gemüte führen. Ich habe den großen Vorteil bereits .net programmiert zu haben, auch C ist mir nicht fremd, genau so wie PHP z.B. also dürfte das Programmieren so keine große HÜrde darstellen. Ich schau mir das heute nachmittag mal an und spiele ein wenig rum. Hat jemand zufällig eine ANleitung, wie man die Ohm Zahl ließt auf einem Widerstand ?
Du suchst vermutlich das hier: http://de.wikipedia.org/wiki/Widerstand_(Bauelement)#Farbkodierung_auf_Widerst.C3.A4nden Gruß Frank
Sebastian Ziegenbein schrieb: > Hat jemand zufällig eine ANleitung, wie man die Ohm Zahl ließt auf einem > Widerstand ? Google. Farbcode Widerstand. In a Nutshell: Der goldene oder silberne Ring kommt nach rechts (der ist meistens auch etwas abgesetzt) Dann bei links beginnend die ersten 3 Ringe lesen. Jede Farbe steht für eine Zahl. Der 4te Ring steh für die Zehnerpotenz. Die Farbcodes sind leicht zu merken: Da ist zunächst der Regenbogen rot orange gelb grün blau violett dann bleiben noch die 'unbunten' Farben (fast: braun ist keine unbunte Farbe). Die dunklen kommen nach vorne, die hellen nach hinten schwarz braun rot orange gelb grün blau violett grau weiß jetzt noch durchnummerieren 0 schwarz 1 braun 2 rot 3 orange 4 gelb 5 grün 6 blau 7 violett 8 grau 9 weiß und du hast die Zahlenwerte jeder Ringfarbe. Hat dein Widerstand also die Ringe rot rot schwarz rot dann ist das 2 2 0 2 der 4.te ring ist die Zehnerpotenz. Daher 2 2 0 mal 10 hoch 2 10 hoch 2 ist hundert 220 * 100 oder 22000, oder 22kOhm (oder einfacher: der 4.te Ring sagt dir wieviele 0-en noch angehängt werden müssen 220 und dann noch 2 Nullen hinten drann) Hat dein Widerstand nur 3 Farbringe, dann funktioniert es genau gleich: Der letzte Ring gibt immer an wieviele 0-en noch angehängt werden müssen. Mit nur 3 Ringen, wäre ein 22k Widerstand rot rot orange
Hi nochmal :). So, habe das jetzt mal so programmiert:
1 | #include <avr/io.h> |
2 | #define F_CPU 8000000U
|
3 | #include <util/delay.h> |
4 | |
5 | int main (void){ |
6 | |
7 | DDRD=0xFF; |
8 | DDRC=0x00; |
9 | |
10 | PORTC=0x00; |
11 | PORTC |= (1<<PC7); |
12 | while(1){ |
13 | |
14 | if(PINC & (1<<7)){ |
15 | PORTD=0x00; |
16 | }else{ |
17 | PORTD=0xFF; |
18 | }
|
19 | |
20 | }
|
21 | return 0; |
22 | }
|
Wenn ich durch den durchflussmesser puste flackert die LED ganz leicht :). Der Durchflussmesser ist an PIN C7 dran. Vielleicht könnt ihr ja ein paar Tipps geben, wie ich das jetzt vielleicht verbessern kann in meinem code, was ich vielleicht falsch gemacht habe, oder was unnötig ist. Danke :).
Sebastian Ziegenbein schrieb: > Wenn ich durch den durchflussmesser puste flackert die LED ganz leicht > :). Passt doch. Dein Durchflussmesser gibt dir ja nicht nur an, dass etwas durchfliesst, sondern auch wieviel. Nach jeweils einer bestimmten Menge gibt es einen Puls. Siehe Datenblatt > Meßprinzip Turbine > Abtastsystem Halleffekt, berührungslos > Ausgangssignal NPN open collector sinking Rechtecksignal > Impulse / Liter 1000 Imp./ Liter Aha. Wenn du also die Impulse zählst, und du 1000 Pulse abzählst, dann ist 1 Liter durchgeflossen.
Danke, ich hatte damals schon in einem anderen Projekt mir für 100 € ein blödes Zählwerk kaufen müssen, damit ich die Umdrehungen counten konnte. Hätte ich das gewusst, dass es auch mit einem so günstigen Gerät geht :). Jetzt wäre natürlich noch was ganz anderes cool zu wissen, wie übertrage ich z.B. die Impulse als Zähle über USB auf den PC ? :).
Sebastian Ziegenbein schrieb: > Jetzt wäre natürlich noch was ganz anderes cool zu wissen, wie übertrage > ich z.B. die Impulse als Zähle über USB auf den PC ? :). USB schminkst du dir am besten gleich wieder für den Anfang ab. USB ist kompliziert. Viel einfacher ist eine Übertragung per serieller Schnittstelle. Dazu findest du im Tutorial ein ganzes Kapitel. (Es sagt allerdings auch niemand dass man nicht einen fertigen USB/RS232 Wandler zwischen µC und PC schalten kann. Der erledigt dann den USB Teil)
Ja, USB habe ich schon gelesen ist freaky :). Aber was mich an meiner while 1 stört ist. Die läuft ja viel schneller als 1000 Impulse z.B. nun hat die if abfrage wohl mehrfach den Wert 1 bevor das rad ein zweites mal wirklich den impuls gib. Was wäre, wenn ich einen counter bauen will, der genau zählt, wie oft es zu diesem HIGH auf PIN7 gekommen ist ?
Sebastian Ziegenbein schrieb: > Ja, USB habe ich schon gelesen ist freaky :). > > Aber was mich an meiner while 1 stört ist. Die läuft ja viel schneller > als 1000 Impulse Macht ja nichts. Wie würdest du (als Person) das machen wenn du (angenommen) so schnell sehen könntest. Da ist eine Lampe, die brennt nicht Du siehst hin, sie brennt du siehst nochmal hin, sie brennt beim nächsten Blick, sie brennt nicht noch ein Blick, sie brennt nicht wieder ein Blick, sie brennt nicht noch ein Blick, sie brennt wieder ein Blick, sie brennt nicht wieder ein Blick, sie brennt nicht noch ein Blick, sie brennt noch ein Blick, sie brennt wieder ein Blick, sie brennt nicht Wie machst du das, das du zählst wie oft die Lampe eingeschaltet wurde? Du wirst dich nicht daran orientieren ob sie brennt oder nicht. Sondern du ornetierst dich daran, ob sich ihr Zustand /verändert/ hat, seit du das letzte mal hingesehen hast.
1 | Da ist eine Lampe, die brennt nicht ------+ |
2 | Du siehst hin, sie brennt ------+ Veränderung: Eins |
3 | du siehst nochmal hin, sie brennt keine Veränderung: Egal |
4 | beim nächsten Blick, sie brennt nicht Veränderung: aber in die falsche Richtung, uninteressant |
5 | noch ein Blick, sie brennt nicht nichts verändert |
6 | wieder ein Blick, sie brennt nicht immer noch nicht --+ |
7 | noch ein Blick, sie brennt ----+ Ah Veränderung: zwei |
8 | wieder ein Blick, sie brennt nicht zar eine Veränderung, aber uninteressant |
9 | wieder ein Blick, sie brennt nicht nix |
10 | noch ein Blick, sie brennt und wieder eine Veränderung: drei |
11 | noch ein Blick, sie brennt egal |
12 | wieder ein Blick, sie brennt nicht Veränderung, aber uninteressant |
Die Lampe wurde 3 mal eingeschaltet. Du wirst also im Programm eine Variable brauchen, in der du den letzten Zustand vermerkst. Und nur dann wenn sich der verändert (in deinem Fall zb von 1 auf 0) dann hast du einen vollständigen Puls
1 | #include <avr/io.h> |
2 | #define F_CPU 8000000U
|
3 | #include <util/delay.h> |
4 | |
5 | int main (void) |
6 | {
|
7 | unsigned int count = 0; |
8 | unsigned char vorher, jetzt; |
9 | |
10 | DDRD=0xFF; |
11 | DDRC=0x00; |
12 | |
13 | PORTC=0x00; |
14 | PORTC |= (1<<PC7); |
15 | |
16 | vorher = ( PINC & (1<<7) ); |
17 | |
18 | while(1){ |
19 | |
20 | jetzt = ( PINC & (1<<7) ); |
21 | |
22 | if( vorher != jetzt ) { // eine Änderung! |
23 | |
24 | if( jetzt == 0 ) // fallende Flanke vom Puls |
25 | count++; |
26 | vorher = jetzt; |
27 | }
|
28 | }
|
29 | |
30 | return 0; |
31 | }
|
nur was für eine abweichung hat man dann bei den 1000 pulsen pro liter ?
Du solltest einen Timer benutzen, um die Abfrage zu machen. Der Controller braucht ja auch noch Zeit für die Übertragung. Ich weiß jetzt nicht wie schnell dein Gerät die 1000 Pulse pro Liter machen wird, aber wenn du eine Mindestwartezeit von einigen ms hast, ist es vielleicht zu langsam. Der ATMEGA32 hat unter anderem auch einen 16-Bit-Timer mit Input Capture. An diesen Pin hängst du deinen Sensor. Dann benutzt du deine Hauptschleife, um das TCCR1 abzufragen, und zu gucken ob es 1000 ist. Du sparst dir den ganzen Teil mit der Flankenerkennung. Wie das geht steht im Datenblatt, im Grunde genommen ist es aber Modus auswählen (Da hilft die Tabelle) und in der Hauptschleife den Timer abfragen. Sebastian Ziegenbein schrieb: > .net programmiert Damit habe ich auch angefangen und bin hier gelandet ;-) Mit freundlichen Grüßen, Valentin Buck
Sebastian Ziegenbein schrieb: > nur was für eine abweichung hat man dann bei den 1000 pulsen pro liter ? Wieviel ist denn der 1000ste Teil eines Liters?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.