Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Tektronix TDS 2024C (200 MHz, 2GS/s)
某マイコン(uC)で50kHzから800kHzのクロックを使うセンサーを試そうとしたが、そのuCで直接試用するのは荷が重いと感じた。
RPiで試すことにした。
参考情報
Raspberry Pi 2 vs. 1 GPIO Benchmark
http://codeandlife.com/2015/03/25/raspberry-pi-2-vs-1-gpio-benchmark/
使ったことがあるRPi.GPIOではPi 2で243kHz出せるとのこと。Pi 1は70kHzとのこと。
上記の関連コードは以下にある。
http://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/
試してみた
ベースcodeは以下にした。
http://qiita.com/7of9/items/d4c2ec34c368569e0882
#!/usr/bin/env python
import RPi.GPIO as gpio
import time
usleep = lambda x : time.sleep(x/1000000.0)
nsleep = lambda x : time.sleep(x/1000000000.0)
gpio.setmode(gpio.BOARD)
kPinCLK = 8 # GPIO14, 4th from the top at right sides
gpio.setup(kPinCLK, gpio.OUT)
print "hello"
while True:
gpio.output(kPinCLK, True)
nsleep(1.0)
gpio.output(kPinCLK, False)
nsleep(1.0)
nsleep(1.0)
にて矩形の1周期を2ナノ秒に設定したが、59.504kHzであった。
nsleep(1.0)
をnsleep(100.0)
にしたところ58.5kHzであった。ほとんど変化がない。
58.82kHzは17マイクロ秒に相当する。
2つのnsleep(1.0)
をコメントアウトした場合は189kHz程度にはなった。
補足
RPi.GPIOの使用時の注意点については、ストックした記事のコメント欄で見た覚えがあるが、その記事を見つけられない。
RPi.GPIOの使用時の注意点などについて、コメントに記載されている。
割込みについての記載。
http://qiita.com/rukihena/items/fb94a2cdcbb37ec8ced7
追加で教えていただいた事項
(追記 2016/02/07)
@mt08さんのコメントにてtime.sleep()関連の実装について教えていただきました。
コメントの通り、usが最小の処理時間になりそうですね。
@rukihena さんのコメントにてソフトウェアクロック生成の問題点、PWM, SPIクロック、周波数ジェネレーターを紹介いただきました。