Hallo werte Experten, ich verwende zwar schon eine ganze Weile ATMEL Prozessoren und hab auch schon das ein oder andere in Assembler programmiert, aber jetzt brauch ich mal einen Rat. Ich muss die Drehzahl und Drehwinkel eines Motors anpassen. Dazu ist auf der Welle ein Rad mit einen Zahnkranz befestigt, der quasi 36 Zähne hat. an 2 gegenüberliegenden Stellen fehlt ein Zahn, um jeweils eine Position zu markieren (also zwei mal 18 - 1 Zahn) Jetzt brauch ich aber genau dieses Signal mit nur EINER Lücke (also 36 - 1 Zahn) Die Drehzahl des Motors variiert von ca. 5 bis 150 Umdrehungen pro Sekunde oder eben 180 bis ca. 5400 Impulsen (Lücken mitgezählt). Das Signal des Hall Sensors, der die Zähne zählt, liegt schon als TTL Pegel vor. Frage: wie programmiere ich (in Assembler) am elegantesten die Umsetzung von 2 Lücken Zahnkranz auf 1 Lücken Zahnkranz?? Ich brauch kein fertiges Programm, aber gerne eine Idee, wie ihr das machen würdet. Vielen Dank und viele Grüsse!! Ralf
Ich kenn mich mit Drehzahlregelung von Motoren zwar nicht aus, aber probier's trotzdem mal: Soweit ich das verstanden hab löst du im uC bei jedem ankommenden Impuls ein Ereignis aus, über die Zeit zwischen 2 Ereignissen erkennst du, ob's eine Lücke war oder nicht. Dann könntest du folgendes machen: Das Ausgangssignal lässt du 2 Impulse hinter dem Eingangssignal nachlaufen, also Zeitverzögert. Du musst also für den aktuellen Eingangsimpuls vorhalten, vor wieviel Zeit der vorhergehende, und der davon vorhergehende stattfand (Timerwert oder sowas). Ist der Abstand zwischen letztem und vorletztem Impuls 2mal so groß wie zwischen letztem und aktuellem, so war da eine Lücke, jedes 2. mal musst du da einen zusätzlichen Impuls einfügen. Die Ausgangsimpulse könntest du über einen Timer erzeugen, den du auf einen bestimmten Wert (zB. 255 - Abstand zwischen den Impulsen) setzt und dann überlaufen lässt -> Interrupt -> Impuls ausgeben, nächsten Wert in den Timer laden.
...so in etwa hatte ich auch gedacht. Nur sollte das ganze sychron und nicht nachlaufend funktionieren. Ich werde mal versuchen einen Timer zu programmieren, der adaptiv immer die Zeit zwischen zwei Zähnen misst. Dann kann ja erkannt werden, wann ein Zahn fehlt, und bei Bedarf einer eingefügt werden. Nur der relativ breite Zeitbereich zwischen zwei Impulsen von 5ms bis 185 us wird wahrscheinlich nen 16bit Timer notwendig machen. Wenn's keine elegantere Lösung gibt, werde ich es wohl mal so versuchen. VG Ralf
Du könntest natürlich auch zählen wie viele Impulse seit dem letzten langen Impuls vergangen sind, dann weist du wann der nächste länge kommt, den du auslassen musst. Eine andere Sache ist noch, dass du dann natürlich einen zusätzlichen Impuls drinnen hast, also 33. Noch eine andere Variante, die nicht so eng gekoppelt ist: Du bestimmst einfach die Drehzahl und steuerst damit einen Timer der pro Umdrehung 33 Pulse erzeugt. Dann musst du nur noch immer zB. den 1. Impuls weglassen. Hast aber gleich eine ganze Umdrehung verzögerung.
> > Noch eine andere Variante, die nicht so eng gekoppelt ist: Du bestimmst > einfach die Drehzahl und steuerst damit einen Timer der pro Umdrehung 33 > Pulse erzeugt. Dann musst du nur noch immer zB. den 1. Impuls weglassen. > Hast aber gleich eine ganze Umdrehung verzögerung. Das ist auch interessant! Allerdings brauche ich 35 Impulse und eine Lücke. Die Summe aus Zähnen und Lücken ist immer 36. 10 Grad pro Einteilung. Ich muss da noch mal ne N8 drüber schlafen. Wahrscheinlich werde ich mal beides ausprobieren.
Nachdem ich jetzt noch mal drüber nachgedacht habe, werde ich wohl eine dritte Variante realisieren. Der Hall Sensor IC hat einen Open Collector Ausgang und ich lass einfach das Ausgangssignal zur Auswerteschaltung durchlaufen. Der ATMega zählt einfach parallel die Zähne mit und nach 35 Zähnen fügt er einfach das Signal für einen zusätzlichen Zahn ein, indem er die Leitung kurz auf Masse zieht. Damit das harmoniert, hat er ja etlich Zähne zuvor Zeit sich anzuschauen, wie das Timing zwischen 2 Zähnen ist. Ich denke diese Variante kostet am wenigsten Rechnezeit, oder hab ich was übersehen? VG Ralf
Kannst du evtl. auch 2 Hall Sensoren montieren? Direkt nebeneinander, um den aktuellen und den nächsten Zahn zu detektieren. den 2. Hall etwas vorlaufend, also: Hall1 = high---> Hall2= High = keine Lücke Hall1=high ---> Hall2=low = Lücke Jede 2. Lücke ist eine Umdrehung So bekommst du nicht nur die Position des fehlenden Zahns , sondern auch die drehrichtung falls gewünscht. Tom
Gute Idee, aber leider nicht realisierbar. Am System darf/soll nichts geändert werden. Das Ganze soll eine Plug&Play Lösung sein, die mit den vorhandenen Gegebenheiten auskommt.
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.