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
|
|
| 0 | 0 |
|
|
|
|
|
| Hier kann eine Referenzspannung zwischen Null Volt und Betriebsspannung angeschlossen sein - Anschluß AREF (Pin21)
|
| 0 | 1 |
|
|
|
|
|
| Referenzspannung ist AVCC (Pin20)
|
| 1 | 0 |
|
|
|
|
|
| Nicht benutzt |
| 1 | 1 |
|
|
|
|
|
| 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
|
|
| ADEN | ADSC | ADFR | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
|
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
|
|
|
|
|
|
| 1 | 0 | 1 | Teilfaktor für Analogabtastung =32 |
|
|
|
|
|
| 1 | 1 | 0 | Teilfaktor für Analogabtastung =54 |
|
|
|
|
|
| 1 | 1 | 1 | Teilfaktor 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
|
| ADEN | ADSC | ADFR | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
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
|
|
| ADEN | ADSC | ADFR | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
|
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
|
|
| ADEN | ADSC | ADFR | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
|
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
|
|
| ADEN | ADSC | ADFR | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
|
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.
|
|
Wichtig 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
|
|
|
|
| 0 | 0 | 1 | 0 | 1 | Spannungeingang (Kanal) auswählen hier Kanal ADC5 |
|
|
|
| 0 | 0 | 1 | 1 | 0 | Spannungeingang (Kanal) auswählen hier Kanal ADC6 |
|
|
|
| 0 | 0 | 1 | 1 | 1 | Spannungeingang (Kanal) auswählen hier Kanal ADC7 |
| 0 | 0 |
|
|
|
|
|
| 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
|
| 0 | 1 |
|
|
|
|
|
| interne
Referenzspannung an AREF ( Wahrscheinlich die Betriebsspannung , die
intern an AREF angelegt wird.) bei 2,56 Volt an ADC werden genau 486
Bit angezeigt
|
| 1 | 0 |
|
|
|
|
|
| Nicht benutzt bei 2,56 Volt am ADSC werden ca 1000 Bit angezeigt die aber stark schwanken
|
| 1 | 1 |
|
|
|
|
|
| interne Referenzspannung von 2,56 Volt ( Anzeige schwankt sehr stark) bei 2,56 Volt am ADSC werden ca 1000 Bit angezeigt
| ADCW | 16
Bit Pseudo Register in den nach der Umwandlung der Digitalwert
gespeichert wird offensichtlich nicht beim Atmega 8 , der gibt dann
Fehler aus
| ADCL | davon werden real die untersten 8 Bit hier abgelegt | ADCH | und 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
|
|
| ADEN | ADSC | ADFR | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
|
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
|
|
|
|
|
|
| 1 | 0 | 1 | Teilfaktor für Analogabtastung =32 |
|
|
|
|
|
| 1 | 1 | 0 | Teilfaktor für Analogabtastung =54 |
|
|
|
|
|
| 1 | 1 | 1 | Teilfaktor 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 * 2 | Alt
|
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
|