mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Signaladapter


Autor: dougie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf Grafe (dougie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf Grafe (dougie)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf Grafe (dougie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf Grafe (dougie)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.