Verwendung des Drehgebers zur Erfassung der Winkelgeschwindigkeit
|
class DrehgeberBASIS { public: virtual double holeOmega(); };
Code 0-1: Virtuelle Basisklasse der Klasse Drehgeber
Konzepte zur Auswertung eines inkrementellen Drehgebers
Die folgenden Konzepte zur Umsetzung einer Drehzahl-Erfassung werden in der Vorlesung entwickelt und sollen dann umgesetzt werden.
Konzept | Beschreibung | Peripherie |
---|---|---|
a) Pulse zählen in festem Zeitintervall | Bei Aufruf der Funktion werden für einen festen Zeitraum die negativen Flanken eines Kanals gezählt und noch wg. der Drehrichtung der Zustand des anderen geprüft. | Nur digitale Eingänge mit Pullup-Widerständen, wg. open collector-Schaltung und z.B. Timer 2 als Geber für das Zeitintervall. |
b) Externe Interrupts mit Zeitstamp versehen und zeitliche Differenz merken | Bei Auftreten einer negativen Flanke an einem Interrupt-Eingang wird der Zählerstand einer Zeiterfassung gespeichert und mit einer vorhergehenden verglichen. | Verwendung von INT0, INT1, oder ICP1 als Auslöser für die Interrupts. Overflow-Interrupt eines Timers als Zeitgeber. |
c) Capturing: Auslösen der Zwischenspeicherung eines Timer-Zählerstandes durch externen Interrupt | Nach jedem Capturing wird das Timerregister des verwendeten Timers wieder auf Null gesetzt, damit beim nächsten Capturing die Zwischenzeit erfaßt werden kann. | Verwendung von ICP1 und Timer1 als Zähler. |
Tabelle 0-1: Drehgeber-Auswertungsverfahren.
Hilfestellung zu a)
Konfiguration des Timers 2 als reinen Zähler
//Timer 2 als Zähler mit Vorteilung von 256 definieren: //WGM20 = 0 WGM21 =0 => Zählbetrieb, zählt ständig von 0 bis 255 //COM20 = 0 COM21 = 0 => Pin OC2 nicht verbunden //COM20 = 1 COM21 = 1 => Pin OC2 löschen on Top, setzen bei Compare //CS 22 21 20 : 000 gestoppt //CS 22 21 20 : 001 Vorteilung durch 1 //CS 22 21 20 : 010 Vorteilung durch 8 //CS 22 21 20 : 011 Vorteilung durch 32 //CS 22 21 20 : 100 Vorteilung durch 64 //CS 22 21 20 : 101 Vorteilung durch 128 //CS 22 21 20 : 110 Vorteilung durch 256 //CS 22 21 20 : 111 Vorteilung durch 1024 TCCR2 = (1<<FOC2) | (0<<WGM20) | (0<<COM21) | (0<<COM20) | (0<<WGM21) | (1<<CS22) | (1<<CS21) | (1<<CS20); //Register TCNT2: Aktuellen Zählerstand auslesen oder verändern.
Code 0-2: Timer2 als Zähler.
Hilfestellung zu b)
Aktivierung von Interrupt 0 und Form einer Interrupt-Funktion
#include <avr/signal.h> #include <avr/interrupt.h> volatile int position2 = 127; SIGNAL(SIG_INTERRUPT0) { .... } ... int main() { //PD6==ICP1 als Eingang und PD2==INT0 als Eingang: DDRD &= 0b10111011; MCUCR |= (1<<ISC01); GICR |= (1<<INT0); //Interrupt 0 aktivieren sei(); //Interrupts freischalten }
Code 0-3: Externer Interrupt.
Hilfestellung zu c)
Aktivierung des Capturing-Modes und Form einer Capturing-Funktion
#include <avr/signal.h> #include <avr/interrupt.h> volatile int position = 127; SIGNAL(SIG_INPUT_CAPTURE1) { register unsigned int wert; unsigned char flag; unsigned char akku; wert = ICR1; flag = TIFR; if(wert>9999 | (flag & (1<<TOV1))) TIFR = flag; } ... int main() { //Capturing Mode TIMSK |= (1 << ICF1); TCCR1B |= (1 << ICES1) | ( 1 << CS12 ) | (1 << CS10); sei(); }
Code 0-4: Capturing.
Durchdenken Sie für jedes Konzept...
|