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以下のパルス検出不可となった。