NF-Millivoltmeter mit dem Tiny13
Der Tiny13 misst hier NF-Wechselspannungen ohne
Bereichsumschaltung bis maximal ca. 2000 mVeff bei einer
Auflösung von 1 mV. Die Messwerte werden über die serielle
Schnittstelle an den PC geschickt. Das funktioniert mit guter
Genauigkeit im Frequenzbereich zwischen 50 Hz und 50 kHz. Die
Signalspannung wird über einen hochohmigen Spannungsteiler auf
eine mittlere Spannung von 2,5 V angehoben. Das Messprogramm muss diese
Mittelspannung mit hoher Genauigkeit ermitteln und dann von allen
folgenden Messwerten subtrahieren. Daraus wird dann der Absolutwert
gebildet und über viele Messungen gemittelt.
Die "natürliche" Auflösung des
AD-Wandlers beträgt 5 mV. Um wesentlich kleinere Spannungen zu messen, muss man
über viele Messwerte mitteln. Das gilt auch für die Messung der Mittenspannung.
Zunächst werden 64 Messwerte gemittelt und durch 8 geteilt. Statt des üblichen
Mittelwerts von 512 wird hier mit einem achtfach größeren Wert von
typischerweise 4096 gerecehnet. Es kann aber auch geringfügig mehr oder weniger
sein, d.h. schon der Nullwert der Wechselspannung wird mit einer Auflösung
unter einem Millivolt ermittelt. In der eigentlichen Messschleife aus 2909
Einzelmessungen wird jeder Messwert erstmal mit 8 multipliziert, um dann den
Nullwert abzuziehen. Die Multiplikationen und Divisionen werden hier mit
Schiebefehlen ausgeführt, damit alles noch gut in den Tiny13 passt.
Download: Tiny13_ACmV.zip
'Millivoltmeter 1 mVeff ... 2000 mVeff
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4 ' 16
$framesize = 4
Dim U1 As Integer
Dim U2 As Integer
Dim U3 As Long
Dim N As Integer
'Millivoltmeter 1 mVeff ... 2000 mVeff
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4 ' 16
$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 ' / 64
Shift U3 , Right , 12 'Mittelwert
Print #1 , U3
Loop
End
Wie kommt es zu dieser ominösen Zahl 2780?
Sie sorgt letzen Endes dafür, dass der Messwert einer Sinusspannung genau in
mVeff angezeigt wird. 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 Tiny13 aber überfordert. Deshalb wird hier
der arithmetische Mittelwert der Absolutspannung gebildet. Dieser ist um ca 10%
zu niedrig, genauer um Wurzel aus 2 geteilt durch Pi-Halbe, also 0,9003. Ein
AD-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
irgendwo mit 512*4,8876/0,9003 = 2780 multiplizieren. Und das geht am
einfachsten, wenn man 2780 Messwerte aufsummiert. Das Ergebnis stimmt sehr
gut mit dem überein, was mein Oszilloskop sagt. Und noch wichtiger: Der Eingang
an Masse zeigt wirklich Null. Auch kleine Spannungen von 1 mVeff oder 2 mVeff
stehen stabil. Was will man mehr! Wenn doch noch ein Fehler von ein paar
Prozent festgestellt werden sollte, liegt es vielleicht an der Toleranz der
5-V-Versorgung. Dann kann man ja einfach die Zauberzahl 2780 etwas anpassen.

Die Zuverlässigkeit der Messung wird auch darin
sichtbar, wie genau ein Messwert stehen bleibt. Die Spannung von ca. 1 Veff kam
mit ihrer Frequenz von 5 kHz von einem analogen Sinusgenerator. Man sieht, dass
viele Einzelmessungen auch dann ein gutes Ergebnis bringen, wenn sie völlig
asynchron zur Messspannung ermittelt werden. Das hat auch Martin Ossmann in
seinem SDR-Kurs gezeigt.