Netzfrequenzanzeige im Arduino-Plotter


Elektronik-Labor   Projekte   AVR  Tiny85






Überblick

Der Beitrag Plotten der 50Hz-Netz-Frequenz beschreibt eine Python-Lösung zur grafischen Anzeige des Netzfrequenz-Verlaufs. Wem die Installation von Python unter Windows zu umständlich ist, der kann die folgende Bascom-Firmware verwenden und die grafische Ausgabe im seriellen Plotter der Arduino-IDE betrachten.

Da die Parametrierung der Plot-Ansicht automatisch erfolgt, sieht man nur eine Gerade, wenn die Ausgabe des Mikrocontrollers in Hz erfolgt. Die Version "netzfreq-4.bas" gibt die Werte daher in mHz (milliHertz) aus.

Hardware



Verwendet wird die "Sparversion" der Hardware; der Eingang PB2 des Mikrocontrollers fängt das häusliche 50 Hz-Streufeld auf, PB2 darf daher nicht anderweitig beschaltet sein. Der Frequenzfehler durch Weglassen der Quarz-Bürde-Kapazitäten wird in der Software ausgeglichen.

Firmware

Durch die Umrechnung in mHz ergeben sich sehr hohe Zahlenwerte. Will man in Ganzzahl-Arithmetik rechnen, werden die Werte zu groß für Variablen des Typs "Long" (4 Byte) oder "DWord" (4 Byte ohne Vorzeichen). Es passt so gerade, wenn man den Timer0-Vorteiler verdoppelt (und damit die Genauigkeit halbiert) und "DWords" verwendet:

' Netzfreq-4.bas
' Fuses: L = 0xff    H = 0xdf    E = 0xfe
' Compiler BASCOM 2.0.7.5 DEMO 

' Das Programm ermittelt die genaue Netzfrequenz und gibt einen Zählwert
' per serieller Schnittstelle aus.
'
' Version 4: Ausgabe der genauen Netzfrequenz in mHz mit etwas reduzierter
' Genauigkeit (um Fliesskomma-Arithmetik zu vermeiden). Die mHz-Werte
' werden im Arduino-Plotter gut aufgelöst.

$Regfile = "attiny85.dat"
$Crystal = 16000000
$Hwstack = 40
$Swstack = 4
$Framesize = 4

Dim F As DWord                    ' DWord: unsigned Long
Dim Ovfcnt As Dword
Config Portb.0 = Output
Config PortB.1 = Output

' bei Verwendung eines RS232-USB-Wandlers: Open "comb.1:115200,8,n,1,INVERTED" For Output As #1 ' bei Verwendung eines TTL-USB-Wandlers stattdessen: ' Open "comb.1:115200,8,n,1" For Output As #1 Config Timer0 = Counter , Edge = Falling
Enable Timer0
On Timer0 Tim0isr

Config Timer1 = Timer , Prescale = 256 ' statt 128 Enable Timer1
On Timer1 Tim1isr

Enable Interrupts


Do If Ovfcnt < 15 Then ' erzeugt Blinksignal PortB.0 = 1 Else PortB.0 = 0 End If Loop Tim0isr: F = TCNT1
TCNT1 = 0 ' Counter1 zuruecksetzen TCNT0 = 206 ' Counter0 zuruecksetzen Shift Ovfcnt, Left, 8 ' ist schneller als Multiplikation mit 256 F = F + Ovfcnt ' Werte um 125000 Ovfcnt = 0
F= 3125800000 / F ' 3125800000 passt gerade so in ein DWord Print #1 , F
Return Tim1isr: Incr Ovfcnt ' Ovfcnt: Overflow-Counter Return End
Im Nachhinein stellte sich heraus, dass der Mikrocontroller bei 16 MHz doch schnell genug ist, um zeitaufwenige Fließkomma-Arithmetik zu bewältigen. Die beigefügte Version "netzfreq-5.bas" gibt die Frequenz in Hz aus, was im Terminal besser aussieht, aber - wie oben geschildert - nicht für die Arduino-Plotter geeignet ist.

Download der Quellcode-Files: 0219-netzfreq2.zip


Elektronik-Labor   Projekte   AVR  Tiny85