Frequenzmessung mit und ohne Timer
Kann man
mit einem kleinen Controller ohne oder mit nur einem Timer Frequenzen messen?
Die Frage stellt sich z.B. bei einem Tiny13 oder bei einem Holtek HT46F47. Die
Vorversuche sollen hier aber mit einem Mega32 durchgeführt werden. Die
erste Messung kommt ganz ohne Timer aus. Timer 1 wird aber als Signalquelle zum
Test der Messung verwendet. Der Zählereingang ist hier C.0, das Testsignal
mit 27,6 kHz entsteht an D.5. Das Ergebnis erscheint jeweils im LC-Display des
ES-M32.
'Frequenzmessung ohne Timer bis 40 kHz
$regfile = "m32def.dat"
$crystal = 11059200
$baud = 9600
$hwstack = 16
$swstack = 32
$framesize = 32
S1 Alias Pind.2
S2 Alias Pind.3
S3 Alias Pind.6
S4 Alias Pind.7
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2
Initlcd
Cls
Locate 1 , 1
Lcd "AK Modul Bus"
Locate 2 , 1
Lcd "ES-M32"
Waitms 500
Config Timer1 = Counter , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Start Timer1
Pwm1a = 199 'Xtal/2/(199+1) = 27,648 kHz, Testsignal
Dim N As Long
Dim F As Word
Dim F2 As Word
Dim D As Bit
Dim D2 As Bit
Do
F = 0
For N = 1 To 49125
If Pinc.0 <> D Then 'Eingang C.0
F = F + 1
Toggle D
Else
F2 = F2 + 1
Toggle D2
End If
Next N
Cls
Locate 1 , 1
Lcd F 'max 40 kHz
Loop
Das
Prinzip der Messung ist, dass in einer Zählschleife gleichzeitig die Zeit und
alle Pegelwechsel an einem Port gemessen werden. Bei jedem Pegelwechsel wird
der Frequenzzähler F erhöht. Man braucht daher nur eine halbe Sekunde für eine
Auflösung von 1 Hz. Wenn gerade kein Pegelwechsel vorliegt wird aus
Symmetriegründen ein zweiter Zähler (F2) erhöht, einfach nur damit es genauso
lange dauert und die Zeitmessung absolut gleichförmig läuft. Die maximal messbare Frequenz ist etwa 40 kHz.
'Frequenzmessung mit 8-Bit-Timer bis > 1 MHz
Config Timer0 = Counter , Edge = Rising
Start Timer0
Dim N As Long
Dim F As Word
Dim F2 As Word
Dim D As Bit
Dim D2 As Bit
Dim F3 As Long
Do
F = 0
Timer0 = 0
D = 1
Start Timer0 'Eingang B.0
For N = 1 To 92158
D2 = Timer0.7
If D2 < D Then
F = F + 1
D = D2
Else
F2 = F2 + 1
D = D2
End If
Next N
Stop Timer0
D2 = Timer0.7
If D2 = 0 Then
If D = 1 Then F = F + 1
End If
F = F - 1
F3 = F * 256
F3 = F3 + Timer0
Cls
Locate 1 , 1
Lcd F3 '> 1 Mhz
Loop
Die
zweite Methode verwendet zusätzlich den 8-Bit-Timer 0 und reicht bis über 1
MHz. Der Eingang ist nun der Pin B.0. In der Zählschleife werden erstmal nur
die Überläufe des Timers gezählt, und zusätzlich wird die Zeit gemessen. Immer
wenn das höchtwertige Bit im Timer 0 auf Null kippt, hat es einen Überlauf
gegeben und F wird erhöht, also sozusagen das Highbyte der Messung. Wenn
die Torzeit abgelaufen ist, wird der Timer gestoppt und ausgelesen. Nun kann es
aber sein, dass gerade im letzten Moment ein Überlauf stattgefunden hat, der
noch nicht gezählt wurde. Das lässt sich aber auch noch nachträglich durch
einen Vergleich feststellen um F entsprechend zu erhöhen. Das Messverfahren
bringt es mit sich, dass F gleich zu Anfang schon 1 wird, er Start wird also als erster Überlauf
gewertet, sodass man am Ende F um eins verkleinern muss. Und schließlich wird
noch der verbleibende Rest im Timer 0 als Lowbyte hinzugerechnet.
Mit diesem Verfahren erreicht man eine zuverlässige Frequenzmessung auch für
höhere Frequenzen. Bis 1 MHz wurde es getestet. Die Torzeit ist genau
eine Sekunde. Dazu wurde die Zählweite 92158 abgeglichen. Bei Bedarf könnte man
auch mit kürzerer Torzeit und weniger Auflösung messen.
Download: Freq_M32.zip