kommt ganz darauf an wie schnell sich der inkrementalgeber maximal drehen soll. unter der rubrik ac characteristics müsstest du diese daten dann nachlesen. also wie schnell sich die signale ändern dürfen damit der c167 diese auch mitbekommt...
Hallo an alle,
kann mir jemand helfen. Ich habe einen magnetischen Inkrementalgeber der mir Rechtecksignale A /A B /B ausgibt. Kann ich diese mit meinem c167 mikrocontroller auslesen?
Danke
kommt ganz darauf an wie schnell sich der inkrementalgeber maximal drehen soll. unter der rubrik ac characteristics müsstest du diese daten dann nachlesen. also wie schnell sich die signale ändern dürfen damit der c167 diese auch mitbekommt...
Aber kann er grundsätzlich das. Und wo könnte ich nachlesen wie solche C-Programme ausschauen?
ich kann dir keine allgemeine antwort auf die frage geben, es ist auch davon anhängig um welche spannungspegel es sich bei dem inkrementalgeber handelt... und dann müsste ich noch die datenblätter vom inkrmentalgeber und vom C167 lesen und dann müsste ich mir noch gedanken darüber machen wo der inkrementalgeber eingesetzt werden soll. also wie schnell er sich drehen kann/darf. der inkrementalgeber hat selbst eine maximale grenze.
Hallo Naeel
zunächst musst du die Pegel klären. Dann hat ein uC keine Schnittstelle für diese Art Sensor. Aber das ist kein Problem. Du brauchst grundsätzlich ein A- und ein B-Signal. (Wenn du nur die Drehzahl willst, also kein Richtungssignal reicht dir sogar das A oder das B-Signal.) Du schliesst eines der Signale an einen digitalen Port des C167, der Interrupt-fähig ist. In der ISR frägst du den jeweils anderen Pegel ab, Das sagt dir die Drehrichtung. Der Rest, also was du überhaupt brauchst, wie Drehgeschwindigkeit oder Position ist alles dein Problem, das musst du entsprechend programmieren.
Gerhard
Vielen Dank Jaipur und Gerhard
Also ich brauche schon eine Richtungsrekennung. Aber wieso hat man eigentlich A und dann noch /A invertiert und bei B genauso. Und welche Vorteile/Nachteile bringt mir ein sin/cos Encoder?Die Pegel sind Standard TTL 5V.
Vielen Dank nochmal
Softwaremässig könnte es so ähnlich aussehen:
Das ist so simpel, daß ich mit den Kommentar spareCode:#define DREH_INVALID -128 char drehgeber_step (unsigned char a0, unsigned char a1) { static const char drehgeber_trainsitions[] = { 0, 1, -1, DREH_INVALID, -1, 0, DREH_INVALID, 1, 1, DREH_INVALID, 0, -1, DREH_INVALID, -1, 1, 0 }; static unsigned char a_alt; unsigned char a = a_alt; if (a0) a |= (1 << 2); if (a1) a |= (1 << 3); a_alt = a >> 2; return drehgeber_trainsitions[a]; }
In die Funktion kommt man rein mit den beiden Werten für A (zB a0) und B (zB a1). Wenn du A und B andersrum zuordnest, bekommst du die Drehrichtung genau andersrum.
Zu Anfang des Programms musst du die Routine einmal mit den Portwerten aufrufen, um a_alt richtig zu initialisieren (den return-Wert wirfst du weg).
Entweder du machst das in einer ISR oder per Poll.
Die Code ist Standard-C und nicht speziell für C16x.
Der C16x hat doch nen Quadratur-Decoder...oder war das TriCore?
Disclaimer: none. Sue me.
Lesezeichen