Frequenzmessung mit und ohne Timer          


Elektronik-Labor  Projekte  AVR 

  
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

 


Elektronik-Labor  Projekte  AVR