stfan1409
08.02.2014, 17:57
Hallo Forum,
ich habe eine 0815 Stromzange zum messen von Wechselstrom. Sie wird an ein Multimeter angeschlossen, welches einen proportionalen Spannungswert zum gemessenen Strom anzeigt.
Nun möchte ich diese Werte mit einem µC mitloggen bzw. µC -> RS232 -> PC.
In einer Zeitung habe einen Artikel gefunden, wie man mit einem ATiny13 eine 50Hz Wechselspannung von 2000mVeff misst.
Ich habe aber 3 Spannungen (3 Zangen wegen 3 Phasen).
Nun wär das einfachste einen Mega8 zu nehmen und 3 Analogeingänge zum messen. Den Printbefehl im Programm würde ich so ändern, dass die ersten beiden Werte ohne "CR" gesendet werden und bei letzten Wert wird ein "CR" angehängt, damit der PC erkennt, dass der Datensatz abgeschlossen ist.
Frage:
Messe ich dann die richtigen Werte oder schmeiße ich dann etwas im Programm durcheinander - sprich kommt es auf das Timing an?
'Hier der Original CODE von ELEKTOR 10/2012
'Millivoltmeter 1 mVeff ... 2000 mVeff
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4
$framesize = 4
Dim U1 As Integer
Dim U2 As Integer
Dim U3 As Long
Dim N As Integer
Config Adc = Single , Prescaler = Auto
Start Adc
Open "comb.1:9600,8,n,1,INVERTED" For Output As #1
Do
U2 = 0
For N = 1 To 64
U1 = Getadc(3)
U2 = U2 + U1
Next N
Shift U2 , Right , 3 ' /8
U3 = 0 ' Nullpunkt
For N = 1 To 2780
U1 = Getadc(3)
Shift U1 , Left , 3 ' *8
U1 = U1 - U2
U1 = Abs(U1)
U3 = U3 + U1
Next N ' * 2780
Shift U3 , Right , 12 ' / 4096
Print #1 , U3
Loop
End
Hier noch die Beschreibung zur Funktion:
Für die Untersuchung der hier vorgestellten Verstärker kann man ein
NF-Millivoltmeter gut gebrauchen. Eigentlich kann der A/D-Wandler
im ATtiny13 nur Gleichspannungen messen. Aber durch das Hochlegen
der mittleren Spannung auf 2,5 V und schnelle Messungen
können auch Wechselspannungen untersucht werden. Das Ergebnis
wird seriell an den PC gesendet und kann mit einem Terminalprogramm
angeschaut werden. Das Prinzip des Messprogramms ist einfach. Zuerst wird die Mittenspannung
durch eine Mittelwertbildung bestimmt. Dann folgt eine
schnelle Serie vieler Einzelmessungen, bei der die Mittenspannung
subtrahiert und dann jeweils der Absolutwert gebildet wird. Eigentlich
liegt die kleinste messbare Spannungsstufe des A/D-Wandlers
bei 5 mV. Durch die Mittelung über viele Einzelmessungen kommt
man dennoch bis herunter auf 1 mV. In der eigentlichen Mess-Schleife
werden 2780 Messungen durchgeführt, verarbeitet und aufsummiert.
Die Messpunkte liegen übrigens völlig asynchron zum Messsignal.
Aber die große Anzahl der Messungen und der Zufall führen
zum Ergebnis, solange das Eingangssignal etwa zwischen 50 Hz und
50 kHz bleibt.
Wie kommt es aber zu dieser ominösen 2780? Diese Zahl geht
von einer Referenzspannung von genau 5 V aus und berücksichtigt
schon den Unterschied zwischen arithmetischer Mittelung und echter
Effektivmessung, sodass das Ergebnis im Fall eines Sinussignals
tatsächliche Effektivwerte in mVeff zeigt. Um genaue Effektivwerte
zu ermitteln, müsste man eigentlich das Quadrat der Spannung aufsummieren
und dann später aus dem Mittelwert die Wurzel ziehen.
Damit wäre der ATtiny13 aber überfordert. Deshalb wird hier der
arithmetische Mittelwert der Absolutspannung gebildet. Dieser ist um rund 10 % zu niedrig, genauer gesagt um die Wurzel aus 2 geteilt
durch pi/2, also 0,9003. Ein A/D-Schritt beträgt 5000 mV / 1023 =
4,8876 mV. Außerdem wird der Messwert einmal mit 8 multipliziert
und dann durch 4096 geteilt, also effektiv durch 512 geteilt. Damit
am Ende alles korrekt in mV angezeigt wird, muss man also mit
512 * 4,8876 / 0,9003 = 2780 multiplizieren; und das geht am einfachsten,
wenn man 2780 Messwerte aufsummiert.
Das Ergebnis ist erstaunlich genau. Auch Werte wie 1 oder 2 mVeff
werden stabil angezeigt!
Vielleicht interessiert sich ja noch jemand dafür wie man die günstigen Stromzangen mitloggen kann ;-)
- - - Aktualisiert - - -
Hier noch der geänderte CODE
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 4
$framesize = 4
$baud = 19200
Dim U1 As Integer
Dim U2 As Integer
Dim U3 As Long
Dim N As Integer
Config Adc = Single , Prescaler = Auto
Start Adc
Do
'Strommessung 1
U2 = 0
For N = 1 To 64
U1 = Getadc(0)
U2 = U2 + U1
Next N
Shift U2 , Right , 3 ' /8
U3 = 0 ' Nullpunkt
For N = 1 To 2780
U1 = Getadc(0)
Shift U1 , Left , 3 ' *8
U1 = U1 - U2
U1 = Abs(u1)
U3 = U3 + U1
Next N ' * 2780
Shift U3 , Right , 12 ' / 4096
Print U3; 'ohne CR senden
'_________________________________________________ ______________________________
'Strommessung 2
U2 = 0
For N = 1 To 64
U1 = Getadc(1)
U2 = U2 + U1
Next N
Shift U2 , Right , 3 ' /8
U3 = 0 ' Nullpunkt
For N = 1 To 2780
U1 = Getadc(1)
Shift U1 , Left , 3 ' *8
U1 = U1 - U2
U1 = Abs(u1)
U3 = U3 + U1
Next N ' * 2780
Shift U3 , Right , 12 ' / 4096
Print U3; 'ohne CR senden
'_________________________________________________ ______________________________
'Strommessung 3
U2 = 0
For N = 1 To 64
U1 = Getadc(2)
U2 = U2 + U1
Next N
Shift U2 , Right , 3 ' /8
U3 = 0 ' Nullpunkt
For N = 1 To 2780
U1 = Getadc(2)
Shift U1 , Left , 3 ' *8
U1 = U1 - U2
U1 = Abs(u1)
U3 = U3 + U1
Next N ' * 2780
Shift U3 , Right , 12 ' / 4096
Print U3 'MIT CR senden
'_________________________________________________ ______________________________
Loop
End
ich habe eine 0815 Stromzange zum messen von Wechselstrom. Sie wird an ein Multimeter angeschlossen, welches einen proportionalen Spannungswert zum gemessenen Strom anzeigt.
Nun möchte ich diese Werte mit einem µC mitloggen bzw. µC -> RS232 -> PC.
In einer Zeitung habe einen Artikel gefunden, wie man mit einem ATiny13 eine 50Hz Wechselspannung von 2000mVeff misst.
Ich habe aber 3 Spannungen (3 Zangen wegen 3 Phasen).
Nun wär das einfachste einen Mega8 zu nehmen und 3 Analogeingänge zum messen. Den Printbefehl im Programm würde ich so ändern, dass die ersten beiden Werte ohne "CR" gesendet werden und bei letzten Wert wird ein "CR" angehängt, damit der PC erkennt, dass der Datensatz abgeschlossen ist.
Frage:
Messe ich dann die richtigen Werte oder schmeiße ich dann etwas im Programm durcheinander - sprich kommt es auf das Timing an?
'Hier der Original CODE von ELEKTOR 10/2012
'Millivoltmeter 1 mVeff ... 2000 mVeff
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4
$framesize = 4
Dim U1 As Integer
Dim U2 As Integer
Dim U3 As Long
Dim N As Integer
Config Adc = Single , Prescaler = Auto
Start Adc
Open "comb.1:9600,8,n,1,INVERTED" For Output As #1
Do
U2 = 0
For N = 1 To 64
U1 = Getadc(3)
U2 = U2 + U1
Next N
Shift U2 , Right , 3 ' /8
U3 = 0 ' Nullpunkt
For N = 1 To 2780
U1 = Getadc(3)
Shift U1 , Left , 3 ' *8
U1 = U1 - U2
U1 = Abs(U1)
U3 = U3 + U1
Next N ' * 2780
Shift U3 , Right , 12 ' / 4096
Print #1 , U3
Loop
End
Hier noch die Beschreibung zur Funktion:
Für die Untersuchung der hier vorgestellten Verstärker kann man ein
NF-Millivoltmeter gut gebrauchen. Eigentlich kann der A/D-Wandler
im ATtiny13 nur Gleichspannungen messen. Aber durch das Hochlegen
der mittleren Spannung auf 2,5 V und schnelle Messungen
können auch Wechselspannungen untersucht werden. Das Ergebnis
wird seriell an den PC gesendet und kann mit einem Terminalprogramm
angeschaut werden. Das Prinzip des Messprogramms ist einfach. Zuerst wird die Mittenspannung
durch eine Mittelwertbildung bestimmt. Dann folgt eine
schnelle Serie vieler Einzelmessungen, bei der die Mittenspannung
subtrahiert und dann jeweils der Absolutwert gebildet wird. Eigentlich
liegt die kleinste messbare Spannungsstufe des A/D-Wandlers
bei 5 mV. Durch die Mittelung über viele Einzelmessungen kommt
man dennoch bis herunter auf 1 mV. In der eigentlichen Mess-Schleife
werden 2780 Messungen durchgeführt, verarbeitet und aufsummiert.
Die Messpunkte liegen übrigens völlig asynchron zum Messsignal.
Aber die große Anzahl der Messungen und der Zufall führen
zum Ergebnis, solange das Eingangssignal etwa zwischen 50 Hz und
50 kHz bleibt.
Wie kommt es aber zu dieser ominösen 2780? Diese Zahl geht
von einer Referenzspannung von genau 5 V aus und berücksichtigt
schon den Unterschied zwischen arithmetischer Mittelung und echter
Effektivmessung, sodass das Ergebnis im Fall eines Sinussignals
tatsächliche Effektivwerte in mVeff zeigt. Um genaue Effektivwerte
zu ermitteln, müsste man eigentlich das Quadrat der Spannung aufsummieren
und dann später aus dem Mittelwert die Wurzel ziehen.
Damit wäre der ATtiny13 aber überfordert. Deshalb wird hier der
arithmetische Mittelwert der Absolutspannung gebildet. Dieser ist um rund 10 % zu niedrig, genauer gesagt um die Wurzel aus 2 geteilt
durch pi/2, also 0,9003. Ein A/D-Schritt beträgt 5000 mV / 1023 =
4,8876 mV. Außerdem wird der Messwert einmal mit 8 multipliziert
und dann durch 4096 geteilt, also effektiv durch 512 geteilt. Damit
am Ende alles korrekt in mV angezeigt wird, muss man also mit
512 * 4,8876 / 0,9003 = 2780 multiplizieren; und das geht am einfachsten,
wenn man 2780 Messwerte aufsummiert.
Das Ergebnis ist erstaunlich genau. Auch Werte wie 1 oder 2 mVeff
werden stabil angezeigt!
Vielleicht interessiert sich ja noch jemand dafür wie man die günstigen Stromzangen mitloggen kann ;-)
- - - Aktualisiert - - -
Hier noch der geänderte CODE
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 4
$framesize = 4
$baud = 19200
Dim U1 As Integer
Dim U2 As Integer
Dim U3 As Long
Dim N As Integer
Config Adc = Single , Prescaler = Auto
Start Adc
Do
'Strommessung 1
U2 = 0
For N = 1 To 64
U1 = Getadc(0)
U2 = U2 + U1
Next N
Shift U2 , Right , 3 ' /8
U3 = 0 ' Nullpunkt
For N = 1 To 2780
U1 = Getadc(0)
Shift U1 , Left , 3 ' *8
U1 = U1 - U2
U1 = Abs(u1)
U3 = U3 + U1
Next N ' * 2780
Shift U3 , Right , 12 ' / 4096
Print U3; 'ohne CR senden
'_________________________________________________ ______________________________
'Strommessung 2
U2 = 0
For N = 1 To 64
U1 = Getadc(1)
U2 = U2 + U1
Next N
Shift U2 , Right , 3 ' /8
U3 = 0 ' Nullpunkt
For N = 1 To 2780
U1 = Getadc(1)
Shift U1 , Left , 3 ' *8
U1 = U1 - U2
U1 = Abs(u1)
U3 = U3 + U1
Next N ' * 2780
Shift U3 , Right , 12 ' / 4096
Print U3; 'ohne CR senden
'_________________________________________________ ______________________________
'Strommessung 3
U2 = 0
For N = 1 To 64
U1 = Getadc(2)
U2 = U2 + U1
Next N
Shift U2 , Right , 3 ' /8
U3 = 0 ' Nullpunkt
For N = 1 To 2780
U1 = Getadc(2)
Shift U1 , Left , 3 ' *8
U1 = U1 - U2
U1 = Abs(u1)
U3 = U3 + U1
Next N ' * 2780
Shift U3 , Right , 12 ' / 4096
Print U3 'MIT CR senden
'_________________________________________________ ______________________________
Loop
End