Forum: Projekte & Code 4-fach Flankenauswertung per Interrupt mit ATmega48/88


von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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

von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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