JH7UBCブログ

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

Raspberry Pi Pico MicroPython 周波数カウンタ

2021-12-10 20:23:14 | Raspberry Pi Pico
 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でのプログラミングでは、この辺が限界のようですが、オーディオ周波数なら実用になりそうです。



最新の画像もっと見る

コメントを投稿