Die angehängte "QCNT_6LED.A90" wertet mit einem ATmega48/88 Signale von Inkrementalgebern per Interrupt aus. In der vorliegenden Version werden Signale eines Längenmeßstabes mit 40µm Teilung erwartet. Diese werden auf 'mm' skaliert auf einer 6-stell. 7-Segmentanzeige angezeigt. Der angezeigte Wert wird zusätzlich per UART ausgegeben. Die Grundschaltungen sind hier dargestellt: Beitrag "7-Segm.-LED-Anzeige, 6-stellig, statische Ansteuerung mit (74HC)4094" Die um 90° phasenverschobenen Eingangssignale werden an INT0 (PD2) und INT1 (PD3)angelegt. Jede Flankenänderung wird mit einer schnellen Interruptroutine erfaßt. Bei 20MHz CPU-Takt werden Flankenänderungen bis 2µs Abstand erfaßt, was einer Signalfrequenz von 125kHz entspricht: siehe Datei "qcnt_6sub.s" Für die Assemblerroutinen sind einige Register des ATmega reserviert, um schnellste Interruptverarbeitung zu erreichen. Dies muß allerdings vom C-Compiler unterstüzt werden, wie es die Kickstart Version eines IAR-EW für AVR bietet. Achtung: Es müssen die Register R6 - R15 reserviert werden. CSTACK sollte >= 0x30 sein! Das Hauptprogramm ist in C geschrieben: "qcnt_6led.c" In der Regel werden Rechtecksignale von magnetischen oder optischen Gebern angelegt, die nicht prellen. Falls dies nicht garantiert werden kann, können die Eingangssignale per externen 2 x D-FF synchronisiert werden. An PD6 wird hierzu ein 500kHz Signal ausgegeben. Ferner kann die Signalerfassung auch intern synchronisiert werden (Timer0), wodurch jedoch die max. Eingangsänderungen auf >=2,5µs reduziert werden. Damit lassen sich auch mechanische Impulsgeber sauber erfassen. Ein '0'-Signal an PD5 beim Einschalten stellt diesen Modus ein, der den µC jedoch permanent zu 30% -> 50% auslastet. Weiterhin können auch Sinus-Signale erfaßt werden, sofern ihre Amplituden >2Vss sind und der 0-Punkt der Signale bei Vcc/2 liegt. Hier haben die Eingangsschmitttrigger der ATmega48/88 ihre Schaltschwellen (siehe Datenblatt: Pin Threshold and Hysteresis).
Mit den oben gemachten Angaben zur Funktion und zur Leistungsfähigkeit, wollte ich die notwendigen Informationen für die Anwender liefern, die sich mit der Materie auskennen und Aufwand und Nutzen abschätzen können. Durch Diskussionen an anderen Stellen angeregt, möchte ich noch ein paar weitere Punkte ergänzen. Die Eingangsfrequenz kann per Interruptauswertung 125kHz pro Kanal betragen, was bei einem Weggeber mit 10µm Auflösung einen Verfahrweg von 5m/s bedeutet. Ordentliche Weggeber liefern saubere Signale, die keiner besonderen Aufbereitung bedürfen. Sofern die anliegenden Signale (rechteck- bzw. sinusförmig) Störimpulse (spikes) enthalten könnten, kann man diese durch einfache RC-Filterung von den Schmitttrigger-Eingängen eines ATmega fernhalten. Dadurch wird der µC nach wie vor nur dann belastet, wenn erkannte Änderungen an den Eingängen erfolgen. Siehe Bild: QCNT_Eingang Die Option, pro Kanal ein D-FlipFlop vorzuschalten bleibt davon unberührt. Diejenigen, die der Flankentriggerung skeptisch gegenüberstehen, können wie beschrieben die interne Synchronisierung per Timer (<= 400kHz) wählen, womit der µC aber eine deutliche Grundlast durch die periodischen Timerinterrupts erfährt: PD.5 an GND. Sofern ein Stromsparmodus angestrebt wird, ist dies nicht unbedingt empfehlenswert. Eine weitere Möglichkeit, mit gestörten Signalen umzugehen, läßt sich durch eine digitale Bandbreitenbegrenzung der Signale erreichen. Hier kann vorzugsweise ein preisgünstiger Attiny13 den INT0/INT1-Eingängen vorgeschaltet werden und nach Bedarf das Signal filtern. Siehe Bild: QCNT_limiter Im einfachsten Fall werden die Eingänge von PHASE_A und PHASE_B beispielsweise nur alle 5µs gelesen und an die Ausgänge PH_A und PH_B weitergeleitet. Folglich liegen alle Flankenwechsel an INT0/INT1 bei >= 5µs. Ein 'Überrennen' des ATmega48/88 kann damit vermieden werden. Weiterhin kann ein anderes Filterverfahren gewählt werden oder die Auffrischung der Ausgänge PH_A und PH_B synchron zum Sync-Eingang erfolgen. Das passende Signal (500kHz) wird von PD.6 am Atmgea48/88 abgegriffen. Der Attiny fungiert als kleingehäusiges D-FF, wobei seine Eingänge über die AVR-typischen Schmitttrigger verfügen und damit gleichzeitig auch analoge Signale aufbereiten können. Der zusätzliche Attiny kann auch als Phasendiskriminator programmiert werden und an INT0/INT1 direkt +1 und –1 Impulse erzeugen. Dadurch kann eine höhere Eingangsfrequenz für digitale Signale erreicht werden. Wegen der fehlenden Information über die aktuelle Phasenlage, muß dabei allerdings auf eine sin/cos-Auswertung verzichtet werden.
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.