目次

周波数カウンタB

 100MHz程度までの周波数を測定する必要に迫られ
  手持ちのマイコンにプリスケーラをつけて対応しました。



 回路図は、以下です。



 74AC161を利用しているので、150MHzまで対応できます。

 100MHzまでをカウントしたいとすると、16分周するので
 約6.25MHzまでを正確にカウントできるマイコンがあれば
 充分です。

 AT90S2313を、10.24MHzで動かすとして、5MHzまでは正確に
 カウントできます。
 ATtiny2313で、約6MHzまでカウントできるので、100MHzに
 対応します。

 プリスケーラの74AC161で、16分周するとした場合はBASICで
 ファームウエアを作成すると、以下となります。

$regfile = "2313def.dat"
$crystal = 10240000

Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6
Config Lcdpin = Pin , Db5 = Portb.5 , Db4 = Portb.4
Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.4
Config Lcd = 16 * 2
Config Timer0 = Timer , Prescale = 1
Config Timer1 = Counter , Edge = Rising

' trigger
Dim Flag As Bit
' x 65536
Dim Over As Word
' 1 sec timer counter
Dim Tint As Word
' frequency
Dim Freq As Long
' frequency / 1000
Dim Losc As Long
' mode
Dim Md As Byte

' set port value
Portb = $00        ' 0000 0000
Pind = $03         ' 0000 0011

' set port directions
Ddrb = $ff         ' 1111 1111
Ddrd = $fc         ' 1111 1100

Stop Timer0
Stop Timer1
On Timer0 Timer0_int
On Timer1 Timer1_int
Enable Interrupts
Enable Timer0
Enable Timer1

Cls : Cursor Off
Start Timer0
Start Timer1

Do
  If Flag = 1 Then
    ' clear flag
    Flag = 0
    ' get over flow value
    Losc = Over * 65536
    ' add resident value
    Losc = Losc + Timer1
    ' multiply
    ' 00 (0) => x2
    If Md = 0 Then
      Losc = 2 * Losc
    End If
    ' 01 (1) => x4
    If Md = 1 Then
      Losc = 4 * Losc
    End If
    ' 10 (2) => x8
    If Md = 2 Then
      Losc = 8 * Losc
    End If
    ' 11 (3) => x16
    If Md = 3 Then
      Losc = 16 * Losc
    End If
    ' get kHz value
    Losc = Losc / 1000
    ' get IFT
    Freq = Losc - 455
    ' LCD handling
    Cls
    Lcd "FREQ " ; Freq ; "kHz"
    Lowerline
    Lcd "LOSC " ; Losc ; "kHz"
    ' prepare next stage
    Over = 0
    Tint = 0
    Timer1 = 0
    '
    Start Timer0
    Start Timer1
  End If
  ' get x2 x4 x8 x16
  Md = Pind
  Md = Md And 3
Loop
End

' 1 second interrupt happned
'   10.24MHz / 256 = 40kHz
'   40kHz / 1Hz  = 40000
Timer0_int:
  Incr Tint
  If Tint = 40000 Then
    Stop Timer0
    Stop Timer1
    Flag = 1
  End If
Return

' overflow interrupt happned
Timer1_int:
  Incr Over
Return

 原理は、とても単純です。

 タイマー0で1秒間を計り、その間にタイマー1が何度
 オーバーフローしたかを計算します。

 プリスケーラ74AC161で、元の周波数をいくつに分周した
 のかをジャンパー設定で入力し、係数を乗算します。


目次

inserted by FC2 system