erstellt  05.12.2011

Analog Komparator  am Atmega Mikroprozessor
Der Atmega Mikroprozessor hat zwei Eingänge die als Komparator (Vergleicher) bezeichnet werden, damit hat man die Möglichkeit zwei Spannungen miteinander zu vergleichen.
Die Eingangspins´haben die Bezeichnung AIN0 und AIN1.
Beim Atmega 8 sind das die Anschlüsse 12 und 13, bei Atmega 32 sind es die Anschlüsse 3 und 4.

Durch das Register ACSR ( Analoge Comparator Status Register ) wird das Verhalten der beiden Komparator Eingänge beeinflusst.
Das Register besteht aus 8 Bits wobei das Bit 7 das Höherwertige ist.
Mit dem Komparator kann man zwei Eingangsspannungen miteinander vergleichen, und wenn nötig bei Spannungsgleichheit einen Ausgang schalten oder aber einen Interrupt auslösen,
der wiederum eine Interrupt Routine in Gang setzen kann.

Es gibt auch die Möglichkeit nur einen Eingang zu benutzen und die am Eingang anliegende Spannung mit einer internen Referenzspannung zu vergleichen, um ebenfalls einen  Ausgang oder Interrupt zu schalten.
Die interne Referenzspannung beträgt in etwa 1,36 Volt.
Der Eingang AIN0 ist der Positive und AIN1 der Negative Eingang, der Ausgang wird nur aktiviert wenn die Spannung am Positiven Eingang einen höheren Wert angenommen hat als am Negativen Eingang.
Im Beispiel  am Atmega 32 (unten), sehen wir das beiden Analogeingänge mittels Potentiometer eine einstellbare Spannung zugeführt bekommen ,die Werte zwischen 0 und 5 Volt annehmen können.
Led 1 wird ausgeschaltet sobald  die Spannung am AIN0 die der  am AIN1 überschreitet.Die Höhe der Spannung ist Variable kann sich also zwischen 0 und 5 Volt bewegen.
Das dazu gehörige Programm in Bascom
Programmzeilen
Beschreibung
$regfile "m32def.dat" Definiert den Atmega als Atmega 32
crystal= 16000000
Gibt die Quarzfrequenz an in Herz
$hwstack = 32 Defaultwert 32 Hardware reservierte Speicher
$swstack = 10 Default Software Reservierung Speicher
Config Lcd = 16 * 2 Definiert das LCD Display in Art und Größe
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.6 , Db7 = Portc.7 , Rs = Portc.5 , E = Portc.4 Definiert die Anschlüsse für das Display
Ddrd = &B10000000
D.7 als Ausgang setzen
Ddrb = &B00000000
PB2 und PB3 als Eingang setzen ist der Defaultwert und kann auch weggelassen werden.
ACSR = &B00000000  
Analog Comperator Control and Status Register
Do
Schleifenanfang
Portd.7 = Acsr.aco Portd.7 bei Gleicheit  von Bit 5 vom ACSR Register umschalten
loop


Beispiel für eine Registerzuweisung:
ASCR=&B00000000
Wollen wir nur einen Eingang benutzen  können wir am Eingang AIN0 eine interne Referenzspannung zuschalten indem wir das Bit ACBG auf Eins setzen.Somit können wir auf das Poti P 1 verzichten . Die interne Spannungsreferenz ( also unsere Schaltschwelle )liegt bei etwa 1,36 Volt. In diesem Fall muss das Register folgendermaßen gesetzt werden:
ASCR=&B01000000
Register ACSR
ACD
ACBG
ACO
ACI
ACIE
ACIC
ACIS1
ACIS0
Funktion
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

0
0
0
0
0
0
0
0
Bei  0 ist der Komparator eingeschaltet ( Default)  , bei 1 ausgeschaltet.
0
0
0
0
0
0
0
0
Bei  1  ist die Interne Referenzspannung eingeschaltet und liegt am AIN0 an, bei 0 aus.
0
0
0
0
0
0
0
0
Ausgang des Komparators , kann nur ausgelesen werden
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
Wenn 0 dann ist der Komparator Interrupt ausgeschaltet
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
Interrupt wird bei steigender und bei fallender Flanke ausgelöst
0
0
0
0
0
0
0
1
Verwendung des Interrupt ist ausgeschaltet
0
0
0
0
0
0
1
0
Interrupt bei fallender Flanke aktiviert
0
0
0
0
0

1
1
Interrupt bei steigender Flanke aktiviert
Noch etwas zum Stromverbrauch, standardmäßig ist der Komparator immer eingeschaltet und verbraucht somit auch Strom, um also Strom zu sparen z. B. bei Batterie Betrieb sollte man den Komparator evtl. ausschalten wenn er nicht benötigt wird. Das lässt sich einmal durch die Registeranweisung wie folgt erledigen :
Acsr = &B10000000
oder aber durch die direkte Bascom Anweisung :
Stop AC
 Unten sehen wir das Blockschaltbild zum Komparator, damit lässt sich dann einiges besser verstehen.  Daran erkennen wir auch das die Referenzspannung (Bandgab Reference) nur am Eingang AIN0 wirkt.

Blockschaltplan

Beispielprogramm mit Atmega 8 bei dem nur ein Poti benutzt wird und bei einem Spannungsvergleich mit der internen Referenzspannung bei jeder steigender Flanke ein Interrupt ausgelöst wird.


Programmzeilen
Beschreibung
$regfile "m8def.dat"  
Definiert den Atmega als Atmega8
$crystal = 16000000 
Gibt die Quarzfrequenz an in Herz
$hwstack = 32  
Default use 32 Hardware reservierte Speicher
$swstack = 10 
Default Software resvierung Speicher
Ddrb = &B00000001  
PortB.0 als Ausgang setzen  für gelbe Led
Ddrd = &B00000001 
PortD.0 als Ausgang setzen für Grüne Led
Acsr = &B01000011 Analog Komparator Registereinstellung
On Aci Interrupt_routine Interrupt Routine definieren
Enable Interrupts Interrupt Gloabal freischalten
Enable Aci Interrupt für Comparefunktion aktivieren
Do Anfang der Programmschleife
Portb.0 = Acsr.aco Das Ausgangssignal der Compare Funktion mit Portb.0 ( Led Gelb)verbinden
Loop Schleifenende
Interrupt_routine: Anfang der Interruptroutine
Portd.0 = 1 Led Grün an
Waitms 100 Pause einfügen
Portd.0 = 0 Led Grün aus
Return Rücksprung

Aktualisiert 12.09.2014
Copyrigfht by Ms 2009