Forum: Mikrocontroller und Digitale Elektronik Signaladapter


von dougie (Gast)


Lesenswert?

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

von I_ H. (i_h)


Lesenswert?

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.

von Ralf G. (dougie)


Lesenswert?

...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

von I_ H. (i_h)


Lesenswert?

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.

von Ralf G. (dougie)


Lesenswert?

>
> 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.

von Ralf G. (dougie)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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

von Ralf G. (dougie)


Lesenswert?

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
Noch kein Account? Hier anmelden.