kramann.info
© Guido Kramann

Login: Passwort:










3 Verwendung des Drehgebers zur Erfassung der Winkelgeschwindigkeit

  • Folgende virtuelle Klasse soll implementiert werden:
class DrehgeberBASIS
{
    public:
                virtual double holeOmega();
};

Code 3-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 3-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 3-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 3-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 3-4: Capturing.

Durchdenken Sie für jedes Konzept...
  • Was liefert die Auswertung, bzw. was passiert, wenn das Fahrzeug lange steht?
  • Wie genau ist das jeweilige Verfahren? - Ist es zum Einsatz in einem Regelkreis geeignet?
  • Wie stark ist der Recourcenverbrauch? - Kann der Mikrocontroller dann noch andere Aufgaben erledigen, wenn das jeweilige Konzept umgesetzt wird?