erstellt 03.09.2018
Wattmeter
Ein kleines Leistungsmessgerät soll anzeigen wie viel Leistung ein angeschlossener Verbraucher aufnimmt,
gleichzeitig soll Strom und die Spannung gemessen und angezeigt werden.
Die dafür benötigte Schaltung hat nur relativ wenige Bauteile:
  • Prozessor ist ein Atmega 8
  • Display mit 2 mal 16 Zeichen
  • Trimmer (P2) zum einstellen des LCD Kontrast,
  • Programmierschnittstelle mit MISO-MOSI-SCK-RESET und GND.
  • Drei verschieden farbige Leuchtdioden als Funktionsanzeige inklusive die dazugehörigen Vorwiderstände
  • Ein Spannungsteiler bestehend aus zwei Widerstände.
Spannungsmessung
Als erstes wird eine Spannungsmessung zwischen 0 und 30 Volt realisiert
Um die Spannung zu messen benutzen wir die am Atmega 8 vorhandenen Analogeingänge.

Davon hat der Atmega gleich  6 oder 8 Stück je nach Gehäuseform .

Die an diesen analog Eingang anliegende Meßspannung wird in einen digitalen Wert konvertiert.
Beim Atmega 8 im DIL Gehäuse sind nur 6 Analogeingänge vorhanden. Die Analogeingänge ADC4 ( Pin 27) und ADC5 (Pin 28) haben eine Auflösung von jeweils 8 Bit .
Der Analogwert wird also in 256 Teile aufgeschlüsselt.
Die restlichen Analogeingänge haben eine Genauigkeit von 10 Bit , also eine Auflösung von 1024.
Der AD Konverter wird intern mit Spannung versorgt, es wird aber geraten eine eigene Spannungsversorgung anzulegen, somit sollte  PIN 20 (AVCC)
auch mit Spannung versorgt werden, es geht aber auch ohne.
Der "Atmega 8" hat 6 Analoge Eingänge aber nur einen Konverter der die analogen Spannungen in digitale Werte umwandeln kann,
und so wird jeder Analogeingang mittels Multiplexer mit dem Konverter verbunden.
Ein Multiplexer legt also alle Analog Eingänge in schnellen Schritten nach einander an den Konverter.
Um die Analogeingänge zu nutzen ist es unabdingbar Pin 22 (GND) als Masse für den Multiplexer zu legen .
Es werden also die an den 6 Analoge Eingängen angelegt Spannungen immer einzeln der Reihe nach konvertiert,
wenn das aber schnell genug passiert bekommt man als Anwender eigentlich nichts davon mit.
Streng genommen werden die angelegten Spannungen an den Analogeingängen nicht gemessen sondern mit einer Referenzspannung verglichen.
Dabei gibt es mehrere Möglichkeiten um die Höhe der Referenzspannung zu beeinflussen.
1.  Möglichkeit , es kann eine intern bereitgestellte feste Spannung von 2,54 Volt zur Referenz herangezogen werden.

2. Möglichkeit - die Betriebsspannung ist auch die Referenz

3. Möglichkeit - eine Externe Referenzspannung an AREF ( Pin 21)

Hier wird die 2. Option verwendet, also die gemessenen Spannung wird mit der Referenzspannung (Betriebsspannung) verglichen.
Mit dem Analogeingang ADC2 wird die Spannungsmessung vorgenommen ,  später wird dann noch Analogeingang ADC3 zur Strommessung benötigt.
Kommen wir zuerst in Schaltung 1 zur Spannungsmessung .
Die maximal zu messende Spannung von 30 Volt wird durch einen Spannungsteiler bestehend aus R14 und R17 auf maximal 5 Volt Betriebsspannung begrenzt
und am Analogeingang ADC2 gemessen .
Die Rote Led wird als Betriebsanzeige genutzt und sollte immer blinken sobald die Programmschleife abgearbeitet wird.
Blinkt die Rote Led nicht, fehlt evtl die Betriebsspannung , das Programm ist falsch oder defekt, oder das Programm ist irgendwo hängen geblieben.
Schaltung Spannungsmessung

Um eine möglichst genaue Spannungsmessung vornehmen zu können, werden einige Messungen kumuliert und  daraus der Querschnitt berechnet.
So kann man auch einigermaßen genaue Messungen hinbekommen wenn es sich um Impulsförmige kurze Spannungshübe handelt die Beispielweise auftreten
wenn eine Schaltung alle paar Sekunden eine Led für sehr Kurze Zeit aufblitzen lässt.
Also je höher die Anzahl der Messungen pro Zeiteinheit, umso genauer der ermittelte Durchschnittswert.

Programm Spannungsmessung

Programmcode  Beschreibung
$regfile "m8def.dat" Definiert den Atmega als Atmega 8
$crystal = 1000000 Gibt die Quarzfrequenz an in Herz
Config Lcd = 16 * 2 LCD Typ angeben
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portb.1 , Rs = Portc.0 , E = Portb.5 Angeben der Display Verbindungen
Ddrd.6 = 1  Anschluss für rote Led angeben
Ddrd.7 = 1 Anschluss für grüne Led angeben
Ddrd.5 = 1 Anschluss für gelbe Led angeben
Dim Volt As Single Variable setzen
Dim Voltschleife As Byte
Dim Volt_kum As Single
Cls Display löschen
Lcd "L-Messer_1D" Text auf Display ausgeben
Wait 2 Pause zum ablesen des Anzeige-Text
Adcsra = &B11100100 Konfiguration A/D verhalten:
Bit7 schaltet AD Wandler ein  =1
Bit 6 startet Konvertierung =1
Bit 5 =1 Freilaufmodus für permanente Konvertierung
cls

Do Anfang Programmschleife
Admux = &B01000010
Analogeingänge konfigurieren:
Bit 7+6 = 01  interne Referenzspannung (Betriebsspannung)
Bit 7+6 = 00 externe Referenzspannung an Pin 21 (AREF)
Bit 7+6 = 11 interne Referenz von 2,56 V

Bit 5 = 0  für 10 Bit Auflösung (1 für 8 bit Auflösung)

Bit 4 = 0
Bit 3 = 0
Bit 2-1-0 für Wahl des ADC Eingang / ADC2= 010
For Voltschleife = 1 To 10
Volt = Adcd * 0.0277126
Volt_kum = Volt_kum + Volt    '
10 Messungen kummulieren
Next Voltschleife

Volt_kum = Volt_kum / Voltschleife       '
Durch 10 Messungen teilen
If Adcd => 1023 Then Gosub Ov
Locate 1 , 1

Lcd Fusing(volt_kum , "#.##") ; " V"

If Adcd > 1023 Then Gosub Ov
Wait 1
Toggle Portd.6
Loop
Ov: Überspannung Routine
Cls Display löschen
Locate 1 , 1 Cursor in Zeile 1 Spalte 1 setzen
Lcd "Mess-Spannung " Textanzeige
Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
Lcd "zu Hoch !" Textanzeige
Wait 3
Pause
Return Rücksprung zum Programm ( Unterbrechungspunkt)
Strommessung
Nun soll der Strom gemessen werden um dann aus den beiden Werten aus Spannung und Strom die Leistung zu berechnen.
Dazu muss dem Schaltplan noch die Verbindung zur Strommessung zugefügt werden.
Der Strom wird am Analogeingang Pin 26 gemessen.


Programm Strommessung
Dazu wird das Ursprüngliche Programm um die grün hinterlegten Zeilen erweitert
Programmcode  Beschreibung
$regfile "m8def.dat" Definiert den Atmega als Atmega 8
$crystal = 1000000 Gibt die Quarzfrequenz an in Herz
Config Lcd = 16 * 2 LCD Typ angeben
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portb.1 , Rs = Portc.0 , E = Portb.5 Angeben der Display Verbindungen
Ddrd.6 = 1  Anschluss für rote Led angeben
Ddrd.7 = 1 Anschluss für grüne Led angeben
Ddrd.5 = 1 Anschluss für gelbe Led angeben
Dim Volt As Single Variable setzen
Dim Voltschleife As Byte
Dim Volt_kum As Single
Dim Ampere As Single
Dim Ampereschleife As Byte
Dim Ampere_kum As Single



Cls Display löschen
Lcd "L-Messer_1D" Text auf Display ausgeben
Wait 2 Pause zum ablesen des Anzeige-Text
Adcsra = &B11100100 Konfiguration A/D verhalten:
Bit7 schaltet AD Wandler ein  =1
Bit 6 startet Konvertierung =1
Bit 5 =1 Freilaufmodus für permanente Konvertierung
cls

Do Anfang Programmschleife
Admux = &B01000010
Analogeingänge konfigurieren:
Bit 7+6 = 01  interne Referenzspannung (Betriebsspannung)
Bit 7+6 = 00 externe Referenzspannung an Pin 21 (AREF)
Bit 7+6 = 11 interne Referenz von 2,56 V

Bit 5 = 0  für 10 Bit Auflösung (1 für 8 bit Auflösung)

Bit 4 = 0
Bit 3 = 0
Bit 2-1-0 für Wahl des ADC Eingang / ADC2= 010
For Voltschleife = 1 To 10
Volt = Adcd * 0.0277126
Volt_kum = Volt_kum + Volt    '
10 Messungen kummulieren
Next Voltschleife

Volt_kum = Volt_kum / Voltschleife       '
Durch 10 Messungen teilen
If Adcd => 1023 Then Gosub Ov
Locate 1 , 1

Lcd Fusing(volt_kum , "#.##") ; " V"

If Adcd > 1023 Then Gosub Ov
Waitms 10
Admux = &B01000011         
Umschalten auf Analogeingeng ADC3
Waitms 10
For Ampereschleife = 1 To 3
Ampere = Adcd * 0.0039
Ampere_kum = Ampere_kum + Ampere
Next Ampereschleife
Ampere_kum = Ampere_kum / Ampereschleife
Locate 1 , 9
Lcd Fusing(ampere_kum , "#.###")
Locate 1 , 16

Lcd "A"
Wait 1
Toggle Portd.6
Loop
Ov: Überspannung Routine
Cls Display löschen
Locate 1 , 1 Cursor in Zeile 1 Spalte 1 setzen
Lcd "Mess-Spannung " Textanzeige
Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
Lcd "zu Hoch !" Textanzeige
Wait 3
Pause
Return Rücksprung zum Programm ( Unterbrechungspunkt)
Leistungsanzeige
Um die Leistung zu erfahren, benötigt man nur noch eine Multiplikation von Strom und Spannung
siehe Grün hinterlegte Zeilen
Programmcode  Beschreibung
$regfile "m8def.dat" Definiert den Atmega als Atmega 8
$crystal = 1000000 Gibt die Quarzfrequenz an in Herz
Config Lcd = 16 * 2 LCD Typ angeben
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portb.1 , Rs = Portc.0 , E = Portb.5 Angeben der Display Verbindungen
Ddrd.6 = 1  Anschluss für rote Led angeben
Ddrd.7 = 1 Anschluss für grüne Led angeben
Ddrd.5 = 1 Anschluss für gelbe Led angeben
Dim Volt As Single Variable setzen
Dim Voltschleife As Byte
Dim Volt_kum As Single
Dim Ampere As Single
Dim Ampereschleife As Byte
Dim Ampere_kum As Single

Dim Watt As Single

Cls Display löschen
Lcd "L-Messer_1D" Text auf Display ausgeben
Wait 2 Pause zum ablesen des Anzeige-Text
Adcsra = &B11100100 Konfiguration A/D verhalten:
Bit7 schaltet AD Wandler ein  =1
Bit 6 startet Konvertierung =1
Bit 5 =1 Freilaufmodus für permanente Konvertierung
cls

Do Anfang Programmschleife
Admux = &B01000010
Analogeingänge konfigurieren:
Bit 7+6 = 01  interne Referenzspannung (Betriebsspannung)
Bit 7+6 = 00 externe Referenzspannung an Pin 21 (AREF)
Bit 7+6 = 11 interne Referenz von 2,56 V

Bit 5 = 0  für 10 Bit Auflösung (1 für 8 bit Auflösung)

Bit 4 = 0
Bit 3 = 0
Bit 2-1-0 für Wahl des ADC Eingang / ADC2= 010
For Voltschleife = 1 To 10
Volt = Adcd * 0.0277126
Volt_kum = Volt_kum + Volt    '
10 Messungen kummulieren
Next Voltschleife

Volt_kum = Volt_kum / Voltschleife       '
Durch 10 Messungen teilen
If Adcd => 1023 Then Gosub Ov
Locate 1 , 1

Lcd Fusing(volt_kum , "#.##") ; " V"

If Adcd > 1023 Then Gosub Ov
Waitms 10
Admux = &B01000011         
  ' Umschalten auf Analogeingeng ADC3
Waitms 10
For Ampereschleife = 1 To 3
Ampere = Adcd * 0.0039
Ampere_kum = Ampere_kum + Ampere
Next Ampereschleife
Ampere_kum = Ampere_kum / Ampereschleife
Watt = Volt * Ampere    

Locate 1 , 9
Lcd Fusing(ampere_kum , "#.###")
Locate 1 , 16

Lcd "A"
Locate 2 , 1
Lcd Fusing(watt , "#.##")

Locate 2 , 7
Lcd "W"
Wait 1
Toggle Portd.6
Loop
Ov: Überspannung Routine
Cls Display löschen
Locate 1 , 1 Cursor in Zeile 1 Spalte 1 setzen
Lcd "Mess-Spannung " Textanzeige
Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
Lcd "zu Hoch !" Textanzeige
Wait 3
Pause
Return Rücksprung zum Programm ( Unterbrechungspunkt)

Leistungmessung pro Zeit
Um die Leistung pro Zeit zu messen, also die Ampere/Stunde bedarf es in erster Linie eine genaue Zeitdefinition.
Also wird mittels Timer ein Sekundentakt erzeugt der jede Sekunde eine Routine aufruft und die Wattzahl kumuliert.
Damit hat man die Leistung mit Ampere pro Sekunde.
Durch dividieren von 3600 kommen wir auf Ampere/Stunde also Ah.

Zeile
Programmcode  Beschreibung
1
$regfile "m8def.dat" Definiert den Atmega als Atmega 8
2
$crystal = 1000000 Gibt die Quarzfrequenz an in Herz
3
Config Lcd = 16 * 2 LCD Typ angeben
4
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portb.1 , Rs = Portc.0 , E = Portb.5 Angeben der Display Verbindungen
5
Ddrd.6 = 1  Anschluss für rote Led angeben
6
Ddrd.7 = 1 Anschluss für grüne Led angeben
7
Ddrd.5 = 1 Anschluss für gelbe Led angeben
8
Dim Volt As Single Variable setzen
9
Dim Voltschleife As Byte
10
Dim Volt_kum As Single
11
Dim Ampere As Single
12
Dim Ampereschleife As Byte
13
Dim Ampere_kum As Single

14
Dim Watt As Single

15
Dim Ampereneu As Single

16
Dim Amperestunde As Single
17
On Timer1 Sekundentakt Routine die bei Überlauf angesprungen wird
18
Tccr1a = &B00000000
19
Tccr1b = &B00000101
Takt durch 1024 teilen
20
Timsk = &B00000100   
Interrupt für Timerüberlauf von Timer1 einschalten
21
Timer1 = 62911
Timer Vorgabewert um auf 1 Sekunde zu kommen
22
Sreg.7 = 1 
Interrupt Global freischalten
23
Cls Display löschen
24
Lcd "L-Messer_1D" Text auf Display ausgeben
25
Wait 2 Pause zum ablesen des Anzeige-Text
26
Adcsra = &B11100100 Konfiguration A/D verhalten:
Bit7 schaltet AD Wandler ein  =1
Bit 6 startet Konvertierung =1
Bit 5 =1 Freilaufmodus für permanente Konvertierung
27
cls

28
Do Anfang Programmschleife
29
Admux = &B01000010
Analogeingänge konfigurieren:
Bit 7+6 = 01  interne Referenzspannung (Betriebsspannung)
Bit 7+6 = 00 externe Referenzspannung an Pin 21 (AREF)
Bit 7+6 = 11 interne Referenz von 2,56 V

Bit 5 = 0  für 10 Bit Auflösung (1 für 8 bit Auflösung)

Bit 4 = 0
Bit 3 = 0
Bit 2-1-0 für Wahl des ADC Eingang / ADC2= 010
30
For Voltschleife = 1 To 10
31
Volt = Adcd * 0.0277126
32
Volt_kum = Volt_kum + Volt    '
10 Messungen kummulieren
33
Next Voltschleife
34

Volt_kum = Volt_kum / Voltschleife       '
Durch 10 Messungen teilen
35
If Adcd => 1023 Then Gosub Ov
36
Locate 1 , 1
37

Lcd Fusing(volt_kum , "#.##") ; " V"

38
If Adcd > 1023 Then Gosub Ov
39
Waitms 10
40
Admux = &B01000011         
  ' Umschalten auf Analogeingeng ADC3
41
Waitms 10
42
For Ampereschleife = 1 To 3
43
Ampere = Adcd * 0.0039
44
Ampere_kum = Ampere_kum + Ampere
45
Next Ampereschleife
46
Ampere_kum = Ampere_kum / Ampereschleife
47
Watt = Volt * Ampere    

48
Locate 1 , 9
49
Lcd Fusing(ampere_kum , "#.###")
50
Locate 1 , 16

51
Lcd "A"
52
Locate 2 , 1
53
Lcd Fusing(watt , "#.##")

54
Locate 2 , 7
55
Lcd "W"
56
Wait 1
57
Toggle Portd.6
58
Loop
59
Ov: Überspannung Routine
60
Cls Display löschen
61
Locate 1 , 1 Cursor in Zeile 1 Spalte 1 setzen
62
Lcd "Mess-Spannung " Textanzeige
63
Locate 2 , 1 Cursor in Zeile 2 Spalte 1 setzen
64
Lcd "zu Hoch !" Textanzeige
65
Wait 3
Pause
66
Return Rücksprung zum Programm ( Unterbrechungspunkt)
67
Sekundentakt:
68
Timer1 = 64511
69
 Portd.7 = 1
70
Waitms 200
71
 Portd.7 = 0
72
Ampereneu = Ampereneu + Ampere
73
Amperestunde = Ampereneu / 3600
74
Waitms 10
75
Return


Referenzspannung
Die Art der Referenzspannung wird im Register ADMUX eingestellt.
ADMUX
Bit 7 6 5 4 3 2 1 0

REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0

00





Hier kann eine Referenzspannung zwischen Null Volt  und Betriebsspannung angeschlossen sein - Anschluß AREF (Pin21)

01





Referenzspannung ist AVCC (Pin20)

10





Nicht benutzt

11





interne Referenzspannung von 2,56 Volt
Folgende Programmzeile stellt die an Pin 20 anliegende Referenzspannung von 5 Volt ein:
Admux = &B01000000
Analogeingang
Die ADC Eingänge haben eine gewisse Eingangskapazität, es wird  quasi ein Kondensator aufgeladen und anschließend die aufgeladene Spannung gemessen.
Das Aufladen bedarf aber eine gewisse Zeit , deswegen darf die Abtastung der ADC Eingänge nicht zu schnell stattfinden um die vollständige Aufladung
auch sicher zu stellen.
Wenn die volle Taktgeschwindigkeit zu Grunde gelegt wird ist das in vielen Fällen zu schnell, deshalb muss der Prozessortakt herab geteilt werden.
Das macht man mit dem sogenannten Prescaler ( Vorteiler), damit kann der Prozessortakt durch den Faktor 2 geteilt werden.
Der Prozessortakt sollte so oft durch den Faktor 2 geteilt werden bis man in etwa auf eine Frequenz zwischen 50 und 200 KHz kommt.
Die erforderliche Frequenz ist unter anderen abhängig von der gewählten BIT Genauigkeit, also ob 8 Bit oder 10 Bit Auflösung gewählt wird.
Bei einer 8 Bit Auflösung kann die Frequenz auch etwas höher als 200 KHz ausfallen.
Eingestellt wird diese Teilung im Register ADCSRA.
Bespiel:
Hat der Atmega eine Taktgeschwindigkeit von 1 MHz, um also auf eine Frequenz zwischen 50 KHz und 200KHz zu kommen sollte  der Systemtakt durch 16 geteilt werden.
1000000 geteilt durch 16= 62,5 KHz
.
ADCSRA
Bit 7 6 5 4 3 2 1 0

ADENADSCADFRADIFADIEADPS2ADPS1ADPS0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W






0 0 0 Teilfaktor für Analogabtastung =0 ( Systemtakt durch 0)






0 0 1 Teilfaktor für Analogabtastung =2






0 1 0 Teilfaktor für Analogabtastung =4






0 1 1 Teilfaktor für Analogabtastung =8






1 0 0 Teilfaktor für Analogabtastung =16






101Teilfaktor für Analogabtastung =32






110Teilfaktor für Analogabtastung =54






111Teilfaktor für Analogabtastung =128
Im Programm sieht diese Anweisung wie folgt aus:
Adcsra = &B00000100
Mit einem weiteren Bit kann die Funktion des Konverter aktiviert / deaktiviert werden, in diesen Fall handelt es sich um das Bit 7:
ADCSRA
Bit 7 6 5 4 3 2 1 0 Analog-Digital Converter aktivieren mit 1-
die Dauer einer Konvertierung beträgt zwischen
65 und 260 us, abhängig der Auflösung ob 8
oder 10 Bit

ADENADSCADFRADIFADIEADPS2ADPS1ADPS0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W

1






Im Programm sieht diese Anweisung wie folgt aus:
Adcsra = &B10000100
Mit einem weiteren Bit wird die A > D Wandlung gestartet, hier handelt es sich um Bit 6
Adcsra=&B01000000
ADCSRA
Bit 7 6 5 4 3 2 1 0

ADENADSCADFRADIFADIEADPS2ADPS1ADPS0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W


1





Eine 1 startet  die  Wandlung  danach wird ADCS wieder auf Null gesetzt
Mit Bit 5 wird eine permanente Konvertierung eingeleitet:
Adcsra=&B00100000
ADCSRA
Bit 7 6 5 4 3 2 1 0

ADENADSCADFRADIFADIEADPS2ADPS1ADPS0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W



1




Eine 1  betreibt eine Free Running Modus , eine Messung nach der anderen.

ADCSRA
Bit 7 6 5 4 3 2 1 0

ADENADSCADFRADIFADIEADPS2ADPS1ADPS0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W




1



Nach jeder Messung wird dieses Bit gesetzt





1


Nach jeder Messung wird ein Interrupt ausgelöst
Es kann sich auch eine ungenaue , sprich eine Anzeige ergeben die in der Höhe der Werte mal hin und her springt,
das liegt meist an ein nicht angepasstes Signal
bzw Störungen die sich aus der Schaltung ergeben und mit ins Messsignal gestreut werden.
Das beste Ergebnis erzielt man, wenn das Messsignal eine Impedanz von ca. 10 KOhm aufweist, und oder abgeschirmte Leitungen verwendet,

und auf eine saubere Betriebsspannung achtet.

nach obenWichtig für das Funktionieren der Analogeingänge sind die beiden Register ADMUX - ADCSRA
ADMUX
Bit 7 6 5 4 3 2 1 0

REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0




0 0 0 0 0 Spannungeingang  (Kanal)  auswählen hier Kanal ADC0




0 0 0 0 1 Spannungeingang  (Kanal)  auswählen hier Kanal ADC1




0 0 0 1 0 Spannungeingang  (Kanal)  auswählen hier Kanal ADC2




0 0 0 1 1 Spannungeingang  (Kanal)  auswählen hier Kanal ADC3




0 0 1 0 0 Spannungeingang  (Kanal)  auswählen hier Kanal ADC4




00101Spannungeingang  (Kanal)  auswählen hier Kanal ADC5




00110Spannungeingang  (Kanal)  auswählen hier Kanal ADC6




00111Spannungeingang  (Kanal)  auswählen hier Kanal ADC7

00





Referenzspannung einstellen hier =5 Volt Betriebsspannung oder jede andere Spannung zwischen 0 V und Betriebsspannung.an Pin REF Wenn keine Referenz anliegt wird immer 1023 angezeigt

01





interne Referenzspannung an AREF ( Wahrscheinlich die Betriebsspannung , die intern an AREF angelegt wird.) bei 2,56 Volt an ADC werden genau 486 Bit angezeigt

10





Nicht benutzt bei 2,56 Volt am ADSC werden ca 1000 Bit angezeigt die aber stark schwanken

11





interne Referenzspannung von 2,56 Volt ( Anzeige schwankt sehr stark) bei 2,56 Volt am ADSC werden ca 1000 Bit angezeigt
ADCW16 Bit Pseudo Register in den nach der Umwandlung der Digitalwert gespeichert wird offensichtlich nicht beim Atmega 8 , der gibt dann Fehler aus
ADCLdavon werden real die untersten 8 Bit hier abgelegt
ADCHund die höherwertigen 2 Bits hier

um also Die Spannung an Eingang ADC2 mit der internen Referenzspannung von 2,54 Volt zu vergleichen werden folgende Einstellungen benötigt
ADMUX =&B11 00 00 10
Dann ist da noch das Register ADCSRA
ADCSRA
Bit 7 6 5 4 3 2 1 0

ADENADSCADFRADIFADIEADPS2ADPS1ADPS0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W






0 0 0 Teilfaktor für Analogabtastung =2 ( Systemntakt durch 2)






0 0 1 Teilfaktor für Analogabtastung =2






0 1 0 Teilfaktor für Analogabtastung =4






0 1 1 Teilfaktor für Analogabtastung =8






1 0 0 Teilfaktor für Analogabtastung =16






101Teilfaktor für Analogabtastung =32






110Teilfaktor für Analogabtastung =54






111Teilfaktor für Analogabtastung =128

1






Analog-Digital Converter aktivieren mit 1


1





Eine 1 startet  die  Wandlung  danach wird ADCS wieder auf Null gesetzt .
Es wird also eine einmalige Messung durchgeführt und dann gestoppt.



1




Eine 1  betreibt eine Free Running Modus , eine Messung nach der anderen.




1



Nach jeder Messung wird dieses Bit gesetzt , und kann abgefragt werden





1


Nach jeder Messung wird ein Interrupt ausgelöst
Der Multiplexer bezieht seine Arbeitsgeschwindigkeit aus dem Systemtakt also Standard aus 1 MHz wenn nichts anderes aktiviert ist.
Die Geschwindigkeit ist aber zu hoch und sollte laut Datenblatt  ca  50 bis 200 KHz sein , was aber wiederum von der Auflösung abhängig ist.
Da hier aber mit der größtmöglichen  Auflösung  gearbeitet werden soll muß der Systemtakt heruntergeteilt werden,
das wiederum ist im Register ADCSRA mit dem sogenannten Prescaler einstellbar.
Wir teilen also den 1 MHz Systemtakt durch 16 und kommen damit auf einer Frequenz von 62,5 KHz, damit befinden wir
uns im akzeptablen Bereich.

ADCSRA=&B11 10 01 00

Technische Daten:
Betriebsspannung 5 Volt
Stromaufnahme 10 mA
 Mögliche Probleme:

Die Anzeige schwankt sehr stark Referenzspannung nicht stabil, möglicherweise eine andere Referenz testen
Display zeigt unabhängig der angelegten Meßspannung immer den Wert 1023 an Referenzspannung fehlt 
Anzeige zeigt auch bei kurzgeschlossenen Eingang nicht Null an ADMUX Bit 7 oder 6 ist falsch angegeben
Bei interner Referenzspannung schwankt die Anzeige sehr stark Ursache nicht gefunden , statt dessen externe Referenz  benutzt.
Verbesserungswürdig !
Weil das Display einen defekt hatte wurde es gegen ein Display mit 4 Zeilen und 20 Spalten ausgewechselt,
dazu mussten die dazu gehörigen Werte in der Zeilen 3 abgeändert werden

Zeile
Programmcode

3
Config Lcd = 16 * 2Alt
3
Config Lcd = 20 * 4
Neu


Bei der Spannungsmessung werden bei einer Eingangsspannung von 30 Volt nur 788 Bit von 1024 möglichen benutzt,
die Messgenauigkeit konnte noch verbessert werden indem  das Verhältnis der Widerstände R4 und R6  angepasst wurde,
das bei einer Eingangsspannung von 30 Volt auch tatsächlich 1024 Bit erfasst werden.
Dazu wurde der Widerstand R6 von 220 Kilo auf 330 Kilo geändert.

 
Aktualsisiert 12.02.2023