hallo, bin ein ziemlicher Neuling in Sachen µC und baue nun als Abschlussprojekt einen Motorradtachometer! Die Umdrehungen des Rades will ich mit Hilfe von einem Hallsensor messen. Mein Problem besteht jetzt darin, dass ich nicht weiß wie ich jetzt die Zeit zwischen zwei Impulsen des Sensors messen kann! Habe mit der SuFu sehr viel gefunden aber keine konkrete Antwort auf meine Frage. gruß max
Mach dich als allererstes mal mit MCUs allgemein vertraut. Dann solltest du wissen, was Interrupts sind. Du solltest dann IOC machen, das ist Interrupt on Change, also ein Interrupt, der bei einem Flankenwechsel an einem IOC-fähigen Pin geschieht. Dann schließt du auf die Zeiten.
ok dann werd ich mich darüber mal schlau machen! ist das ein spezieller port oder nur eine art wie mein interrupt arbeitet? ps. benutze übrigends einen Atmega8L
Du kannst das ganze über Interrupts machen und diese hält ein ATmega8(L) nur an bestimmten Pinnen als Zusatzfunktion bereit (INT0 / INT1). Eine andere Methode wäre die Zähler des ATmega8 zu verwenden. Diese verfügen über einige Steuereingänge, die den Zähler starten, stoppen, zurücksetzen oder eben zählen lassen können. Du kannst so, als einfachste Lösung, einen Zähler nutzen um z.B. alle 2s einen Interrupt zu erzeugen, der dann den Stand des anderen Zähler ausliest und zurücksetzt, der durch den Hallsensor immer um eins weiter gezählt wird. Dann Radumfang, Anzahl Umläufe und die 2s miteinander verrechnen und als Geschwindigkeit auf eine Anzeige bringen. Das erfordert aber, sich etwas genauer mit den Zählern und Interrutps zu beschäftigen, siehe Datenblatt und Wiki. Gruß, Ulrich
Nimm führ den Hall den Eingänge INT0 PD2 und lasse den ext. Interrupt zu. Du solltest auch den Timer 0 laufen lassen. Die Zeit ermittelt Du duch einfache Abfrage des Zählerstandes zwichen den Ext. Interrup's. Das war jetzt nur eine einjfache Umschreibung des Lösungsansatzes.
habe fast das gleiche wie du gehabt, war aper mit einem Pic von Microchip, dei capture compare p(CCP), ich kann dir eine c-Code Muster geben, musst aber wie Kollegen gesagt haben zuerst mit einem kleinen Programm vertraut werden. Probier mal eine leuchtdiode an/auszuschalten, da wirst du vieles lernen.
Prinzip sollte eigentlich immer gleich sein: Interrupts zulassen, Interrupts an externen Peripherien zulassen. Dann Interrupt on change(Wenn Input Pin auf High wechselt)zulassen. Bei MCUs gibt es Pins, die können analog oder digital verwendet werden. Entsprechendes Register auf Digital I/O Stellen. Dann gibt es noch ein Register, welches zwischen I und O unterscheidet. (also ob ein Pin, der zuvor als digital konfiguriert wurde als Eingang oder Ausgang fungieren soll. Bei Atmel heißt das glaube ich was mit DDR was für Data Direction stehen sollte. im main programm kannste nix machen, zb. for(;;) { } oder while(1); den Rest erledigt dir der Interrupt. Starte den timer0 mit einem Interrupt und Stopp ihn bei einem zweiten Interrupt. Der Zählerstand verrät dir die vergangene Zeit(dazu folgede Stichworte: Taktung auf den Timer, Prescaler, ggf Postscaler) Genauigkeit: Wenn du auf Genauigkeit zählst, und es dir reicht in etwas größeren Zeitabständen einen neuen Drehzahlwert zu bekommen, dann solltest du mehrere Zeiten messen, die du dann arithmetisch mittelst, also aufsummieren und durch die Anz. der Messwerte dividieren, sollte klar sein soweit.... Also lies dich in die Grundlagen ein und stell weitere Fragen, wenn was unklar ist. Besten Gruß vom Bodensee
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.