Raspberry Pico Pi をMicroPythonでプログラミングして、周波数カウンタを作ってみます。
回路図です。入力信号を簡単なアンプで増幅して、GPIO15に加えます。
入力波形の立ち上がり(0→1)をカウントします。Timer割込みで、1secごとに1sec間のカウント数をOLEDに表示します。
ブレッドボードです。入力ゲートが開いているとき、内蔵のLED(Pin25に接続されている)が点灯します。
スクリプトです。1sec間ゲートを開け(gate_flag=1)、信号の立ち上がりをでカウントします。1sec経ったら、ゲートを閉じ(gate_flag=0)、count数をOLEDに表示します。ゲートのコントロールはTimer割込みで、1secごとに割込みを発生させています。
OLEDを使いますので、ssd1306ライブラリをインストールしておき、このスクリプトは、main.pyという名前でPicoに保存します。
数字を右寄せで表示したいのですが、MicroPythonでは、右揃え関数rjust()が使えないので、文字数を数え、文字数が足りないときは、左側にスペースを入れるプログラムにしました。
-----------------------------------------------------------------------------------------------------
from machine import Timer,Pin,I2C
import utime
import ssd1306
led = Pin(25, Pin.OUT)
sig = Pin(15,Pin.IN)
i2c=I2C(0,sda=Pin(16),scl=Pin(17),freq=400000)
oled=ssd1306.SSD1306_I2C(128,64,i2c)
oled.text("RP2 Fre Counter",0,8)
oled.text("Hz",96,24)
oled.show()
led.value(0)
#Timer生成
timer = Timer()
#counter関係設定
counter = 0
old_sig = 0
gate_flag=0
def gate_ctrl(timer):
global led,counter,gate_flag
gate_flag = 1 - gate_flag
if gate_flag == 0:
oled.fill_rect(48,24,40,8,0)
oled.show()
count=str(counter)
if len(count)<5:
for i in range(5-len(count)):
count=" " + count
oled.text(count,48,24)
oled.show()
counter=0
led.value(gate_flag)
timer.init(freq=1, mode=Timer.PERIODIC, callback=gate_ctrl)
while True:
if gate_flag == 1:
sig_val=sig.value()
if sig_val==1 and old_sig==0:
counter += 1
old_sig = sig_val
-----------------------------------------------------------------------------------------------------
さて、どの程度の周波数まで測定できるでしょうか。自作のSGから信号を加え、少しずつ周波数を上げていきます。
10KHzまでは、ほぼ正確な値をカウントします。MicroPythonでのプログラミングでは、この辺が限界のようですが、オーディオ周波数なら実用になりそうです。
※コメント投稿者のブログIDはブログ作成者のみに通知されます