2系統GPIO割込みとPIO割込みは、幅16nsecのパルスをそれぞれ検出できることが分かった。さらに短いパルスの発生は、ラズピコのPWMでは実現できない。そこで、ラズピコの親分であるラズパイのPWMでパルス発生させて、それを外部入力とした。

以下は、微小パルスを発生させるPythonのプログラムである。最小で幅4nsecのパルスを発生することができる。周期1msecで12nsec、8nsec、4nsecのパルス幅を3秒間隔で順次切り替えていく。

import pigpio
import time
PIN = 13
pi = pigpio.pi()
pi.set_mode(PIN, pigpio.OUTPUT)
# PWM 250MHz -> 4nsec/1step
# Frequency 1kHz, Duty 99.9996 <-> 99.9999% ->  4nsec
# Frequency 1kHz, Duty 99.9992 <-> 99.9995% ->  8nsec
# Frequency 1kHz, Duty 99.9988 <-> 99.9991% -> 12nsec
while 1:
    pi.hardware_PWM(PIN, 1000, 999991) # 12nsec
    time.sleep(3)
    pi.hardware_PWM(PIN, 1000, 999995) # 8nsec
    time.sleep(3)
    pi.hardware_PWM(PIN, 1000, 999999) # 4nsec
    time.sleep(3)

ラズパイからパルス供給を受けるラズピコ

ラズパイ供給の微小パルス(左から12nsec、8nsec、4nsec)

2系統GPIO割込みは、3種類のパルス幅で1秒間に1,000パルスを検出できた。一方のPIO割込みは、12nsecでは1,000パルスであったが、8nsecで約895パルス、4nsecで約345パルスとなった。

.program pioPULSE
    irq clear 1      ; 割込みフラグ1番クリア
.wrap_target         ; ラップ開始
    wait 0 gpio 2    ; GPIO2 LOW状態待ち
    wait 1 gpio 2    ; GPIO2 HIGH状態待ち 
    irq 1            ; パルス検出(割込みフラグ1番セット)
.wrap                ; .wrap_targetへ自動ジャンプ

上記は先に掲載したPIO割込みのアセンブラで、125MHz駆動により1命令8nsecである。非同期外部信号のLOW状態待ちでは、幅8nsecパルスの取りこぼしが発生してしまう。以上から、PIO割込みは8nsec以下のパルス検出不可となった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です