B.6  Aufgaben aus Kapitel 6

1.
Beschreibe die Funktionsweise eines Komparators.
Ein Komparator vergleicht die Spannung an seinem positiven Eingang mit der des negativen Eingangs. Ist die Spannung am positiven Eingang größer als die Spannung am negativen Eingang, so ist sein Ausgang logisch TRUE, ansonsten FALSE.

 
 

2.
Konstruiere mit einer einfachen Reflexlichtschranke einen Schließkontakt mit einstellbarer Schaltschwelle.


PIC
Bild B.1.: Lichtschranke am Comparator A.


3.
Bei der Konstruktion des Single-Slope-A/D-Wandlers wurde eine Kompensation der nichtlinearen Ladungskurve des Kondensators vorgenommen. Wie könnte man die externe Beschaltung erweitern, damit man diese nicht mehr benötigt?
Anstelle des RC-Elementes kann man auch einen Integrator verwenden. Dessen Ausgangsspannung u(t) ist linear mit der Zeit verknüpft.

 
 

4.
Erweitere den Single-Slope-A/D-Wandler zum Dual-Slope-A/D-Wandler.
Hierzu ist Einiges an externer Schaltung notwendig. Zum einen ein Integrator und zum anderen ein Analogschalter (z.B. ein CD4066) zum Schalten des Signals und der Referenz. Dabei ist zu beachten, dass auch eine negative Betriebsspannung für Referenzspannung und Analogschalter benötigt wird bzw. alternativ ein virtueller GND z.B. bei VCC/2 mit einem OPAMP gemäß Bild 9.5 erzeugt wird. Das hat den Vorteil, dass dann auch keine negativen Spannungen am Ausgang des Integrators abgefangen werden müssen, die den Eingangspin sonst zerstören würden.

 
 


PIC
Bild B.2.: Dual-Slope-Wandler mit dem Comparator A.


5.
Schreibe ein einfaches Programm, das den positiven Eingang des Komparators mit der Referenzdiode vergleicht und bei Überschreiten in einer Interrupt-Routine immer einen Zähler inkrementiert.
// Comparator-A-Interrupt-Service-Routine 
int count; 
#pragma vector=COMPARATORA_VECTOR 
__interrupt void COMPARATORA(void) 
{ 
  count++;               // Laufzähler hochzählen 
} 
 
int main(void) 
{ 
 // Comparator A konfigurieren 
 CACTL1 = CAON;          // anschalten 
 CACTL1 |= CARSEL        // Referenz ’-’ Eingang 
 CACTL1 |= CAREF0 | CAREF1; //Ref-Diode 
 CACTL1 |= CAIE;         // Interrupt aktivieren 
 
 CACTL2 = P2CA0 + CAF;   // Output-Filter 
 
 P2DIR = 0x00; 
 P2SEL = BIT3;           // P2.3 als positiver Eingang 
 _enable_interrupts ();  // Interrupts global aktivieren 
 while {1}               // Endlosschleife 
 {} 
}
6.
Wie könnte man dieses Beispiel um eine Schalthysterese erweitern?
// Comparator-A-Interrupt-Service-Routine 
#pragma vector=COMPARATORA_VECTOR 
__interrupt void COMPARATORA(void) 
{ 
  if (mode == 1) 
  { 
   count++;         // Laufzähler hochzählen 
   mode = 0;        // VREF = 0.25 Vcc 
   CACTL1 = CACTL1 | CAREF0 & ~ CAREF1; 
   CACTL1 |= CAIES; // jetzt fallende Flanke 
  } 
  else 
  { 
   mode = 1;        // VREF = 0.5 Vcc 
   CACTL1  = CACTL1 | CAREF1 & ~ CAREF0; 
   CACTL1 &=~CAIES; // jetzt steigende Flanke 
  } 
} 
// sonst wie voriges Beispiel