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.
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.