JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Raspberry Pi Pico MicroPython レシプロカル(逆数)カウンタ+CWトーンインジケータ

2021-12-19 12:37:02 | Raspberry Pi Pico
 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()の値のふらつきが原因でしょうか。