Raspberry Pi Pico MicroPythonの組み合わせで、レシプロカル(逆数)カウンタを作ってみます。
信号の周期T(sec)を測定して、f(Hz)=1/T(sec)の式で計算して、周波数を求めます。
回路図です。周波数カウンタと同じです。
スクリプトです。以前にmicro:bitでレシプロカル・カウンタを作った時のものをPico用に移植しました。CWトーン・インジケータとして使えるように、700Hz±50HzでLEDが点灯するようにプログラミングしました。サンプリング間隔を短くする場合は、下から2行目のutime.sleep(0.5)の値0.5を0.2などに変更します。
-------------------------------------------------------------------------------------------------
from machine import Pin,I2C
import utime
import ssd1306
i2c=I2C(0,sda=Pin(16),scl=Pin(17),freq=400000)
oled=ssd1306.SSD1306_I2C(128,64,i2c)
sig=Pin(15,Pin.IN)
led=Pin(25,Pin.OUT)
oled.text("Reciorocal",16,0)
oled.text("Counter",56,8)
oled.text("Hz",88,32)
oled.show()
old_value = 0
flag = 0
def display():
global freq
oled.fill_rect(48,32,40,8,0)
oled.show()
oled.text(str(freq),48,32)
oled.show()
if freq>=650 and freq<=750:
led.value(1)
else:
led.value(0)
#main loop
while True:
now_value =sig.value()
if old_value == 1 and now_value == 0:
if flag == 0:
start_time = utime.ticks_us()
flag = 1
else:
end_time = utime.ticks_us()
freq = int(1000000 / (end_time-start_time)+0.5)
display()
flag = 0
utime.sleep(0.5)
old_value = now_value
-------------------------------------------------------------------------------------------------
ブレッドボードです。
自作のSGから1000Hzを出力して、測定しています。
±50Hzくらいの誤差があり、測定値が細かく変化します。
utime.ticks_us()の値のふらつきが原因でしょうか。