Frequenzmessung mit der Ping-Pong-Platine
von Hermann Nieder
Lässt
sich der Mikrocontroller auf der Ping-Pong-Platine [1] so
programmieren, dass man mit wenigen zusätzlichen Bauteilen in
einem bestimmten Bereich Frequenzen messen und ihren Wert mit den
Leuchtdioden als ganze dreistellige Zahl anzeigen lassen
kann? Dies ist möglich, wie ich im Folgenden aufzeigen werde.
Die
zusätzliche Schaltung passt auf ein kleines Steckboard. Sie besteht aus
einer Transistorstufe mit Gegenkopplung, der das
Wechselspannungssignal, dessen Frequenz gemessen werden soll, an der
Basis von T1 über einen Kondensator zugeführt wird. Das Ausgangssignal
steht zur Impulsformung am Eingang einer Schmitt-Triggerstufe eines
Bausteins CD4093 an. Sein Pin 11 (B) ist mit Anschluss INT0
(Portd.2) des ATMEGA8 der Ping-Pong-Platine verbunden. Mit einer
anderen Schmitt-Triggerstufe, zwei Widerständen und einem Kondensator
ist
ein Taktgenerator aufgebaut. Dessen Ausgangssignal
steht am Eingang einer weiteren Stufe an, wird negiert und steht
am Ausgang A zur Verfügung. Beim Anschluss eines Verbrauchers werden
auf diese Weise Rückwirkungen auf die Frequenz des Taktgenerators
vermieden. Durch Austausch des abgebildeten Kondensators durch ein
Exemplar mit einer anderen Kapazität kann der Frequenzbereich des
Signals an Anschluss A grob festgelegt werden, während die
Feineinstellung durch das Trimmpotenziometer P1 erfolgt.
Im Initialisierungsteil des Programmlistings wird u. a. 256 als Vorteiler für den Timer0 festgelegt und dieser gestartet.
Sub Initialisierung
...
Config Timer0 = Timer , Prescale = 256
Enable Timer0
Start Timer0
On Timer0 Tim0_isr
End Sub
…
Um
bei einer Frequenz von 8000000 Hz mit dem Vorteilerwert von 256 eine
Torzeit von 1 Sekunde für den Frequenzzähler einzustellen, wird Timer0
mit 6 geladen, damit bis zum Überlauf (Overflow) 250 Schritte
erforderlich sind. Der Inhalt der Variable Timer_2 darf
schrittweise vom Anfangswert 0 bis zum Betrag 125 steigen.
...
'8000000:256:250:125=1
Tim0_isr:
Timer0 = 6
'250 bis Overflow
Portb.6 = Not Portb.6
Incr Timer_2
If Timer_2 < 125 Then
Goto Timer0_end
End If
If Timer_2 = 125 Then
Timer_2 = 0
Incr Sekunde
End If
Timer0_end:
Return
…
Der
Inhalt der Variablen „Timer_2“, „Sekunde“ sowie
„Frequenz“ ist jeweils zunächst 0. Anschließend wird
ähnlich wie in einem Programmlisting zur Frequenzmessung im
Handbuch eines Lernpakets von Burkhard Kainka [2] während der Torzeit
des Frequenzzählers die Anzahl der Impulse am Messeingang gezählt, um
den Inhalt der Variablen Frequenz anschließend als Dezimalwert anzeigen
zu können.
...
Do
Timer_2 = 0
Sekunde = 0
Frequenz = 0
Z1:
Enable Timer0
Z_bit = Pind.2
If Z_bit = 0 Then
Goto Z2
End If
If Sekunde = 1 Then
Goto Z4
Else
Goto Z1
End If
Z2:
Z_bit = Pind.2
If Z_bit = 1 Then
Goto Z3
End If
If Sekunde = 1 Then
Goto Z4
Else
Goto Z2
End If
Z3:
Incr Frequenz
If Frequenz < 10000 Then
Goto Z4
End If
Z4:
If Sekunde < 1 Then
Goto Z1
End If
Disable Timer0
Z5:
Dat = Frequenz
Gosub Dez_darst
Gosub Darst_hz_zi1
Loop
Es
wird zunächst der Betrag der Frequenz, wie z. B. im Bild oben
530, ermittelt, um ihn anschließend zusammen mit dem Kurzzeichen der
Einheit “Hz“ wie im Bild anzeigen zu können.
Dies geschieht in den folgenden Programmschritten.
...
Darst_hz_zi1:
' Datei: Hz_u
'Leds(1) = Splt1_1
Leds(2) = Splt2_1
Leds(3) = Splt3_1
Leds(4) = Splt4_1
Leds(5) = 992 + Splt5
Leds(6) = 128 + Splt6
Leds(7) = 992 + Splt7
Leds(8) = Splt8
Leds(9) = 576 + Splt9
Leds(10) = 832 + Splt10
Leds(11) = 704 + Splt11
Leds(12) = 576 + Splt12
Return
...
Die
Ziffern werden auf der Ping-Pong-Platine „rechtsbündig“
dargestellt. Neun der Leuchtdioden der ersten Spalte werden
zur Anzeige der Tausenderstelle genutzt.
Der gemessene Wert der Frequenz im folgenden Bild lautet: 1175 Hz
...
'Darstellung der Frequenz im Dezimalformat
Dez_darst:
Tausender = Dat / 1000
Tausender1 = Tausender * 1000
Dat = Dat - Tausender1
Hunderter = Dat / 100
Zeichen = Hunderter
Gosub Darstellung1
Hunderter1 = Hunderter * 100
Dat = Dat - Hunderter1
Zehner = Dat / 10
Zeichen = Zehner
Gosub Darstellung2
Zehner1 = Zehner * 10
Dat = Dat - Zehner1
Einer = Dat
Zeichen = Einer
Gosub Darstellung3
'Anzahl der Punkte in 1. Spalte = Anzahl der Tausender (maximal 9)
Select Case Tausender
Case 0 : Splt1_1 = 0
Case 1 : Splt1_1 = 16
Case 2 : Splt1_1 = 24
Case 3 : Splt1_1 = 28
Case 4 : Splt1_1 = 30
Case 5 : Splt1_1 = 31
Case 6 : Splt1_1 = 63
Case 7 : Splt1_1 = 127
Case 8 : Splt1_1 = 255
Case 9 : Splt1_1 = 511
End Select
Return
...
Die
Werte zur Darstellung der Buchstaben „Hz“ sowie die der einzelnen
Ziffern wurden mit einer verbesserten Version des Programms
„Mustergenerator“ [3] bestimmt und in das Programmlisting in BASCOM AVR
übernommen.
Hier ist ein Auszug davon für die Anzeige der Ziffern 0 bis 2
...
Zeichen_z:
Select Case Zeichen
'Zifferndarstellung oben
Case 0:
Splt1 = 0
Splt2 = 31
Splt3 = 17
Splt4 = 31
Case 1:
Splt1 = 0
Splt2 = 0
Splt3 = 2
Splt4 = 31
Case 2:
Splt1 = 0
Splt2 = 29
Splt3 = 21
Splt4 = 23
...
Mit
der Ping-Pong-Platine als Frequenzmesser kann z. B. die Frequenz des
Taktgenerators auf dem Steckboard gemessen werden und ihre Veränderung
beim Ändern der Schleiferposition des Trimmpotenziometers mit einem
Schraubendreher beobachtet werden. Die Anzeige im Bild lautet:
2546 Hz.
Sollen höhere Frequenzen als 9999 Hz gemessen werden
können, ist zwischen den Ausgang der Verstärkerstufe mit dem Transistor
und den Eingang INT0/Portd.2 der Ping-Pong-Platine ein Vorteiler zu
schalten. Mit zwei Ics des Typs 74HC390, die jeweils zwei
Dekadenzähler enthalten, ist sogar eine Frequenzteilung durch 10
000 möglich. Die komplette Schaltung passt auf ein kleines Steckboard.
Das IC CD4093 entfällt in diesem Fall. Für eine feste Teilung der zu
messenden Frequenz durch 1000 kann die LED-Anzeige z. B. wie im
folgenden Bild aussehen.
Download: ping_frqm2_gr.zip