カイセのKU-2600というデジボルを使っている。
チャージポンプ負電圧を作るため1MHzのクロックをだそうとしている。
1MHzを作るpythonコードを試しているが、KU-2600で測定した周波数が想定通りでない。
code
pythonコードは以下を書いた。
!/usr/bin/env python
import RPi.GPIO as GPIO
import time
usleep = lambda x : time.sleep(x/1000000.0)
GPIO.setmode(GPIO.BOARD)
kPinCLK = 8 # GPIO14, 4th from the top at right sides
GPIO.setup(kPinCLK, GPIO.OUT)
usleep(100)
print "hello"
while True:
GPIO.output(kPinCLK, True)
# usleep(0.5)
usleep(50.0)
GPIO.output(kPinCLK, False)
# usleep(0.5)
usleep(50.0)
結果
Raspberry Pi2 + raspbian
usleepの待ち時間を変更することで、周波数が変わる。
- usleep(5000.0)
- 97.9Hz : だいたいあってる
- usleep(500.0)
- 833.4Hz : あやしい値だ
- usleep(50.0)
- 3.3kHz : 全然違う
usleep(5000.0)の場合、1周期が10msecになるので、1 / (10 * 10^-3) = 100Hz.
あとはその周波数を10倍していく値になるはずだが、上記の結果となった。
KU-2600の取説
によると以下の通りなので、対応できない測定範囲ではないと思う。
- 1-3. 周波数 (Hz)
- レンジ: 9.999Hz から 9.999 MHz
関連
オシロ用プローブを使うという案があるが、それが本当に必要なのだろうか。
http://www.marutsu.co.jp/contents/shop/marutsu/mame/180.html
問題の切り分け
以下のいずれなのだろうか。
- RPiの処理の問題
- KU-2600の問題
code v0.2
pythonコードを変更してみた。
for で10回ループするようにした。以下の場合は usleep(5000.0)と同じ処理になるはず。
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
usleep = lambda x : time.sleep(x/1000000.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)
for loop in range (10):
usleep(500.0)
GPIO.output(kPinCLK, False)
for loop in range (10):
usleep(500.0)
上記の結果、86.0Hzとなった (97.9Hzではない)。
KU-2600は悪くない。
RPiの処理でusleep()処理直後のタスクディスパッチ遅延などによりwaitが累積しているのかもしれない。
The Linux kernels tend to have a higher tick rate, where the intervals are generally closer to 1 millisecond.
1msec程度までしかだめかもしれない。
トラ技でこういう記事があったような気がするが、昨年の何月号だっただろうか。
2015年のトラ技を見たが、載っていなかった。インターフェイスの方だったかもしれない。