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