erstellt 05.07.2010
Analogeingang
Erster Test mit der Beschaltung eines Analoeingang und drei Digitalausgängen.
Bei diesem Versuch wird ein Analogeingang mit einer variablen Spannung beaufschlagt, und je nach Höhe der Spannung
ein bis drei Led's an den Digitalausgängen zum Leuchten gebracht.
Als Analoge Eingangsspannung wird eine Spannung aus der 5 Volt Betriebsspannung über ein Potentiometer zwischen 0 und 5 V
geregelt und dem Eingang PC0 zugeführt.
PC0 ist Standardmäßig ein Digitaleingang, wird aber duch eine Programmierungs-Anweisung als Analogeingang deklariert.
Der Analogeingang arbeitet mit einer Auflösung von 10 Bit, dass bedeutet eine Auflösung von 1024 Schritte,
ergo habe ich bei einer Spannung von 5 Volt eine Spannungsauflösung von 4,8 Millivolt pro Schritt
.
 Plan vergößern  
     

Schaltungsbeschreibung:

Die Spannungsversorgung des Mikroprozessors muß 5 Volt betragen , diese erhalten wir dadurch dass beispielsweise eine Eingangsspannung von 6 bis 30 Volt
durch einen Festspannungsregler (LM7805) auf 5 Volt runter geregel wird.

Der Condensator C1 dient zur Glättung der Betriebsspannung

Pin 1 ( Reset ) am Atmega wird über einen 10 KOhm Widerstand Standarmäßig auf Plus (VCC) gelegt , und sollte nur beim beschreiben (Programmieren) auf Minus liegen.

Pin 7 (VCC) wird auf Plus 5 Volt gelegt als Versorgungsspannung des Prozessors

Pin 8 (GND) Minus der Versorgungsspannung

Pin 14 (PB0) Digitalausgang für LED 1

Pin 15 (PB1) Digitalausgang für LED 2

Pin 16 (PB2) Digitalausgang für LED 3

Pin 20 (VCC) wird auf Plus 5 Volt gelegt als Versorgungsspannung des Prozessors

Pin 22 (GND) Minus der Versorgungsspannung

Pin 23 (PC0 / ADC0 ) Analogeingang

So sieht die Schaltung aus
hhh
Und so sieht das dazugehörige Programm aus.:
Erweiterung auf 5 Digitale Ausgänge
b
Hier das Programm bei 5 Digitalausgänge

Der AD Wandler
Die folgenden Ausführungen gelten hier Explizit für den Atmega 32 Prozessor ,sind  aber bis auf wenige Ausnahmen auch für den Atmega 8 und Atmega 16 zutreffend.
Die Atmega 32  Prozessoren haben mehrere Analoge Eingänge
( ADC0 bis ADC7 )  ,und einen Analog/Digitalumsetzer (A/ D Wandler), wobei alle analogen Eingänge  auf einen internen A/D Wandler führen und im sogenannten Multiplexverfahren abgefragt werden.
Ein Multiplexverfahren ist praktisch ein Zeitliches hintereinander Abfragen der Eingänge , das  meist so schnell geschieht das es in der Realität  nicht auffällt wenn das Ergebnis beispielsweise als Anzeige dienen soll, und weil das Menschliche Auge, und meist auch das Gehirn eine gewisse Trägheit besitzt hat der Betrachter den Eindruck alles würde Zeitgleich geschehen.
Die Analogeingänge haben eine Auflösung von  10 Bit , das entspricht 1024 Werte, bei einer möglichen Eingangsspannung von max. 5 Volt entspricht das einer Auflösung von   0,0048 Volt.



Mit diesen analogen Eingängen kann man  Spannungen messen oder besser gesagt vergleichen , dies geschieht indem eine angelegte Spannung am Analogeingang mit einer festen Spannung die sogenannte Referenzspannung verglichen wird. Das Ergebnis wird als Digitaler Wert (10 Bit) ausgegeben.
Die Referenzspannung die zum Vergleich herangezogen wird kann intern aus dem Atmega bezogen werden und beträgt in diesem Fall immer 2,56 Volt oder aber extern am AREF Anschluß angelegt werden, in diesem Fall kann der Wert 0 bis 5 Volt betragen.
Aber Achtung !
Sollte die   interne Referenzspannung  benutzt werden darf auf keinen Fall eine Externe Spannung am Anschluß AREF anliegen , weil dies evtl. das Ende des Atmega bedeuten könnte.
Getestet hab ich das allerdings noch nicht.

Beispiel:
Wir legen eine Spannung von 5 Volt an ADC0 , diese wird mit einer 5 Volt  Referenzspannung verglichen und als 10 Bit Wert ausgegeben.
Der Ausgabewert beträgt dann 1024.
Würden wir 2,5 Volt anlegen , hätten wir ein Ausgangswert von 512
Beim Atmega 32 und auch bei vielen anderen haben die meisten Ports mehrere Funktionen die je nach Bedarf konfiguriert werden.
Standardmäßig dienen die Pin  Anschlüsse 33 bis 40 ( Port A) beim Atmega 32 als Digitale Ein/Ausgänge um sie als Analoge Eingänge zu benutzen muss dies dem Atmega natürlich mitgeteilt werden, dies kann man über Bascom  Anweisungen erledigen oder aber direkt in sogenannte Register einstellen, hier wird es am Beispiel der Registereinstellungen vorgenommen ( Programm Zeile 8).
Zuvor müssen wir erst einmal die Eingänge die benutzt werden sollen als Eingänge definieren (Programm Zeile 7).

Der Analog / Digital Wandler benötigt eine eigene Spannungsversorgung Im Plan unten sehen wir das der Anschluss AVCC mit der Positiven Spannungsversorgung verbunden ist, und auch der GND neben den AVCC Anschluss wurde zusätzlich belegt.Der Anschluss AREF wurde ebenfalls mit der Positiven Versorgungsspannung verbunden und dient hier als 5 Volt externe Referenzspannung.
Es besteht auch die Möglichkeit eine Interne von Controller zu Verfügung gestellte Spannung von 2,54 Volt als Referenz zu nutzen , dazu müssen einige Bits im ADMUX Register gestellt werden , und am AREF Eingang ( Pin 32 beim Atmega 32)muss mindestens ein kleiner Kondensator ca 20 nF angeschlossen werden, sonst funktioniert diese Funktion nicht.

   

Zeile Programm Beschreibung
1 $regfile "m32.dat" Holt sich aus der Datei "m32def.dat" die Bauteil Spezifischen Informationen wie Anschlussbelegung Speichergröße usw.
2 $crystal=1000000 Setzt die Taktfrequenz auf 1 Mhz ( Default)
3 Config Lcd=16*2 Definiert das Display in Art und Größe
4 Config Lcdpin=Pin,Db4=Portc.3,Db5=Portc.2,Db6=Portc.1,Db7=Portc.6,Rs=Portc.5,E=Portc.4 Definiert die Anschlussbelegung bzw, die Verbindungen zwischen Display und Atmega
5 On ADC ADC_interrupt Legt die Bezeichnung "ADC_Interrupt" für die Unteroutine fest die nach jedem Messvorgang angesprungen werden soll
6 Sreg.7=1 Gibt die Globale Interrupt's frei
7 DDRA=&B00000000 DDR für "Daten Richtungs Register" in dem Angegeben wird in welche Richtung die Ein/Ausgänge wirksam werden sollen das Zeichen "&B" gibt dem Prozessor an das nun die folgende Eingabe im Binärformat vorliegt, es gibt auch z.B. die Möglichkeit die Werte im Dezimalformat usw anzugeben .
Die folgenden Werte geben den gesamten Port an wobei eine 1 angibt das der jeweilige Anschluß als Ausgang interpretiert werden soll und eine 0 gibt an das es sich um einen Eingang handelt .
Es wird  von rechts mit den niederwertigen Anschluss begonnen .
Also die Rechte Null enspricht dem ADC0 usw. In diesem Beispiel ist also ADCO bis ADC7 als Eingänge definiert.
8 ADMUX=&B00000000 Mit dem Register ADMUX werden Grundlegende Angaben zum Verhalten der Analogeingänge gemacht.
Bit 7 + 6 =00 ( Externe Referenzspannung an PIN AREF, hier 5 Volt)
Bit 7 + 6= 01 (Anschluss AVCC dient als Referenz)
Bit 7 + 6= 11 (Interne Referenzspannung von 2,56 Volt)
Bit 5 = 0 ( Auflösung des Messwert in 10 Bit also 1023 Werte)
Bit 5 = 1 ( Auflösung des Messwert in 8 Bit also 255 Werte)
Bit 3 ( Wird nur benötigt bei Vergleichsfunktionen der verschiedenen Analogeingänge )
Bit  2 + 1 + 0 = 000 ( Eingang ADC0 wird abgefragt )
Bit  2 + 1 + 0 = 001 ( Eingang ADC1 wird abgefragt )
Bit  2 + 1 + 0 =  010 (Eingang ADC2 wird abgefragt )  usw.
9 ADCSR=&B11101111 Mit dem Register ADCSR wird die Funktion des A/D Wandlers beeinflusst
Bit 7=1 schaltet den AD Wandler ein (Standard = 0 )
Bit 6=1 startet die Konvertierung
Bit 5=1 Freilaufmodus für permanente Konvertierung
Bit 3=1 Interrupt soll benutzt werden
Bit 2 + 1 + 0 legt die Samplerrate fest, also mit welcher Geschwindigkeit die Analogeingänge abgefagt werden. Die Geschwindigkeit wird aus dem Systemtakt des Atmegas gewonnen indem dieser durch einen Teiler den Takt reduziert. Dieser Teiler Faktor wird durch BIT 2-1-0 bestimmt laut Datenblatt sollte die Samplerrate zwischen 50 und 200 Khz betragen.
Bit 2 + 1 + 0 = 010 Teilt Systemtakt durch 4
Bit 2 + 1 + 0= 111 teilt Systemtakt durch 128
10 Do Anfang der Hauptprogrammschleife
11 cls Display löschen
12 Lcd "Messwert"; ADCD Messwert als Digitaler Wert anzeigen ( Wert zwischen 0 und 1023)
13 waitms 500 Pause
14 loop Schleifenrücksprung
16 ADC_interrupt Routine für Interrupt der nach Jedem Messvorgang angesprungen wird
17 ???? Irgend eine Funktion ( noch nicht benutzt)
18 Return Aus Interrupt Routine aussteigen
Aktualisiert 20.12.2017
Copyright by ms 2009