Hallo, für meine Drehbank möchte ich einen digitalen Drehzahlmesser mit Hilfe einer Platine und einem Microcontrollers bauen. Die Drehzahl soll dann auf 4 7-Segment Anzeigen ausgegeben werden. Momentan bin ich in der 13. Klassen eines Technischen Gymnasiums und besitze ein bisschen Erfahrung in Microcontrollerprogrammierung sowohl mit Assembler als auch mit C. Auch in Elektrotechnik besitze ich ein bisschen Erfahrung. Ich habe mir gedacht an die Scheibe, welche die Drehbank zum "Drehen" bringt, bringe ich ein Magnetstück oder ein kleines Plätchen an und setze direkt daneben fest fixiert einen Magnetsensor oder eine Lichtschranke um so eine Umdrehung messen zu können. Im Programm des Microcontrollers möchte ich dann die Zeit für eine Umdrehung messen und dann in U/min umrechnen. Jede vollendete Umdrehung soll einen Interrupt auslösen und in diesem soll dann die Zeitdifferenz zur letzten Umdrehung berechnet werden. Das 1. Problem vor dem ich stehe ist die Wahl des Microcontrollers. Da wir in der Schule mit Atmel arbeiten und diese denke ich auch gut geeignet sind möchte ich auf jeden Fall einen solchen nehmen. Nun gibt es aber so viele verschiedene von jenen und ich weis nicht welchen ich nehmen soll. Er sollte nicht zu viel können, sodass er nicht allzu kompliziert aufgebaut ist, aber folgendes muss er besitzen: * (externe) Interrupts * Timer * mehrere I/O Ports währen von Vorteil Könnt ihr mir bei der Wahl des µControllers helfen, evtl. bei den einzelnen Modellen auch die Vor- und Nachteile nennen. Danke schonmal im Vorraus. MfG Flo
Dafür gibt es zwei Controllerfamilien von Atmel: 8051: z.B. 89S52 AVR: z.B. ATmega 16 Beide lassen sich über die parallele oder serielle Schnittstelle eines Rechners mit wenig Aufwand programmieren.
Hallo Flo, so aus dem Bauch heraus würde ich meinen dass sich da etwas in der Größenordnung eines ATMega8 oder ATMega16 gut eignet. Aber gleich vorweg: Bei jeder Umdrehung einen Interrupt zu schmeissen und anhand des Kehrwertes der verstrichenen Zeit die Drehzahl rauszubekommen ist keine gute Idee, das wird zu ungenau. Besser ist es eine Torzeit, z.B. 1 s oder 100 ms herzunehmen, und in dieser Zeit die Impulse zu zählen. Du kannst die Anzeige, möchtest du darauf noch was erkennen können, sowieso nur endlich oft aktualisieren. Den Zähler bitte nicht direkt per Hardware Pin von Deinem Magnetschalter ansteuern, sondern z.B. mit einem Timer "mustern" (mustern = vermeidung eines sinnlosen Anglizismus ;-)) Stefan
Hallo Florian, ich würde so wie du vorgeschlagen hast die Zeit für eine Umdrehung ausmessen und die Drehzahl daraus berechnen. Eine Torzeit-Messung wie von Stefan vorgeschlagen wird entweder zu ungenau oder die Messzeit muss sehr lang gewählt werden. Die Spindeldrehzahlen bei einer Drehbank liegen gewöhnlich im Bereich zwischen 50 bis 3000 U/min. Das entspricht ca. 1 bis 50 U/s. Bei einer Torzeit von 1 Sekunde erreichst du damit nur eine Auflösung von 60 U/min was bei kleinen Drehzahlen zu ungenau sein dürfte. Dirk
Hallo, Aus erfahrung kann ich sagen, das gerade die AVRs sich nicht zwingend für eine Zeitmessung eignen, da sie nicht Zeitstarr genug arbeiten. Dies ist allerdings abhängig von der Messmethode und der geforderten genauigkeit. Zur Hardwaretechnischen Seite zwecks Signalerzeugung würde ich Dir empfehlen zwei Signalgeber (oder Sensoren) im definierten Abstand zueinander anzuordnen, so kanst du bei jeder Umdrehung die Winkelgeschwindigkeit ermittel. Bei einem Sensor besteht das Problem eben, das er mindestens zweimal ansprechen muss um eine Aussage zu erlaben. Ich denke dass die Drehbank sich auch mal mit wenigen U/min drehen muss z.B. Gewindeschneiden, wo eine 1 Puls Lösung zu ungenau wird. Bei sehr hohen Drehzahlen, kann man dann entweder einen Sensor abschalten, oder nur einen Puls auswerten. Ich würde es sehr wohl über die Pinchange Interrupts realisieren, da man (bei manchen uC's) damit den Timer direkt starten stoppen kann. Aber da gibt es natürlich mehrere Möglichkeiten der Realisierung. T.
Nachtrag: Ich schlage eine Zeitauflösung von 20µs vor. Bei einem 16 Bit-Timer kanst du dann Periodenzeiten bis 1,3 Sekunden messen (entspricht einer Drehzahl von ca. 45 U/min). Bei 3000 U/min --> 50 U/s hast du eine Periodenzeit von 20ms und noch eine Genauigkeit von 1 Promille
die Genauigkeit und Auflösung bei langsamen Drehzahlen kann man auch leicht verbessern indem mehrere Pulse pro Umdrehung erzeugt. Eine einfache Lösung wäre z.b. ein Paperstreifen mit schwarz/weiss Muster auf eine Welle geklebt und dann eine Reflexlichtschranke als Sensor (gibts als Fertigteil bei deinem Namensvetter als Lieferanten :-)) Oder ein Hall-Sensor an einem Zahnrad müsste auch gehen. Ganz bequem sind natürlich fertige Dreh-Encoder. Mit zwei 90° Phasenverschobenen Signalen lässt sich auch die Drehrichtung ermitteln. Als Controller würde ich auch einen Mega8/16/32 vorschlagen, einfache Exp. Boards gibts damit jede Menge, z.B. hier im Shop, Pollin u.v.a.
>Aus erfahrung kann ich sagen, das gerade die AVRs sich nicht zwingend >für eine Zeitmessung eignen, da sie nicht Zeitstarr genug arbeiten. Hä? Das hängt ja wohl von der Programmierung ab und von der Anbindung an die Hardware!
@ Travel Rec.: Nein. Der ATmegaX8 hat einen Jitter auf dem internen Oszillator. Somit bleibt die Zeit, die benötigt wird um in eine ISR zu springen auch bei freigabe des Global Interrupts innerhalb nur eines Cycles nicht konstannt.
Tommy wrote: > Aus erfahrung kann ich sagen, das gerade die AVRs sich nicht zwingend > für eine Zeitmessung eignen, da sie nicht Zeitstarr genug arbeiten. Dies Wenn Dir eine Genauigkeit von 50ns (Input Capture at 20MHz) immer noch nicht ausreicht, hast Du recht. Für alle Arten mechanischer Vorgänge sollten 50ns allerdings über 1000-fach genau genug sein. Peter
Tommy wrote:
> Nein. Der ATmegaX8 hat einen Jitter auf dem internen Oszillator.
Für Drehzahlmessung sollte man schon nen Quarz ranpappen.
Ich hab auch schon für nen 2-stelligen Durchflußmesser den internen RC
des ATtiny26 verwendet, für 2 Digits reicht der aus.
Peter
@ Peda: Vollkommen richtig. Nur wenn du viele Vorgänge hast summiert sich der Fehler, und der uC soll ja auch noch andere Dinge erledigen. Aber wie gesagt: im Spezialfall! Sonst AVR Top!!!
Ich find´s schon lustig, daß wenn´s um hohe Genauigkeit geht, der interne RC zum Vergleich oder besser zum Miesmachen herangezogen wird. Jeder Anfänger, der ein wenig recherchiert hat, wird wissen, daß es zu genauen Messungen oder Datenübertragungen einen Quarz braucht. Dann kann man nicht behaupten, daß der ganze Controller ungenau ist...
Tommy wrote: > @ Peda: > > Vollkommen richtig. Nur wenn du viele Vorgänge hast summiert sich der > Fehler, und der uC soll ja auch noch andere Dinge erledigen. Da summiert sich überhaupt nichts, das Hardware-Capture arbeitet immer auf den Zyklus genau. Nur, wenn Du so schnell drehst, daß Dir ein Capture durch die Lappen geht, hast Du nen Fehler. Angenommen worst case 100 Zyklen bis zur Bearbeitung, mußt Du also schneller drehen als 12 Millionen U/min, das schafft nicht mal ne Concorde. Peter
Genau da ist der Irtumm! Das Capture arbeitet nicht auf den Cyclus genau, sondern auf 2 bis 3.5 cycles (siehe Datenblatt)
Tommy wrote: > Genau da ist der Irtumm! Das Capture arbeitet nicht auf den Cyclus > genau, sondern auf 2 bis 3.5 cycles (siehe Datenblatt) Das ist mir neu. Welches Datenblatt, welche Seite ? Ich wüßte jetzt keinen Grund, warum die Hardware Fehler machen sollte. Allerdings sind 3,5 * 50nS = 175ns für mechanische Messungen auch kein Beinbruch. Die Reaktionszeit eines billigen Optokopplers ist z.B. 100-fach höher. Peter
Versucht mal folgendes: Legt einen Ext. Takt auf den T0clk Pin zählt mit einem Timer die Zeit bis 1000 flanken eingelaufen sind. Bleibt der Zählerstand Konstant?
Tommy wrote: > siehe Interrupt response time Quark ! Die kann sogar bis 100 Zyklen betragen, wenn Du langsamer als 12 Millionen U/min drehst. Das ist doch gerade der Witz an dem HW-Capture, daß die keine Rolle spielt. Wozu hätte Atmel es denn sonst extra einbauen sollen ? > Ein Quarz kost geld! Dann nenne mir bitte irgend einen anderen MC, der mit dem internem RC auf 4 Digits (0,01%) genau ist. Wenn Du 4 Digits brauchst, geht eben kein interner RC, basta ! Peter
Tommy wrote: > Versucht mal folgendes: > > Legt einen Ext. Takt auf den T0clk Pin zählt mit einem Timer die Zeit > bis 1000 flanken eingelaufen sind. Bleibt der Zählerstand Konstant? Davon war doch nirgends nicht die Rede. Leg den Impuls auf ICP und lese das ICR aus, dann hast Du max einen Count (50ns at 20MHz) Fehler. Peter P.S.: Es spricht natürlich überhaupt nichts dagegen, wenn man über mehrere Pulse messen will, deren Anzahl mit T0 zählen zu lassen, also ICP mit an T0.
Hi, Danke für die vielen Antworten. Da der ATmega hier oft genannt wurde, werde ich mir diesen mal genauer anschauen und ihn evtl. verwenden. Nun habe ich aber noch ein paar Fragen zum Messen. Ich denke das einfachste wäre einen Magnetfeldsensor zu nehmen. Aber wie ist das wenn sich nun die scheibe dreht. Fängt der Sensor dann an zu prellen und verfälscht so evtl. die Ergebnisse? Wenn ich so einen Sensor verwende, worauf muss ich besonders achten? Oder gibt es eine noch einfachere Lösung? Danke schonmal im Vorraus
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.