NF-Millivoltmeter mit dem Tiny13      


Elektronik-Labor  Projekte  AVR 

 

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.


Elektronik-Labor  Projekte  AVR