FreeBSD/mipsのmrubyで交流周波数を計ってみました。
回路はネットに転がっているフォトカプラー(PC817)を使ったものを作りました。
100V直結の回路も見かけますが、怖いので何かから取ったトランスを使いました。
トランスがあまりよくないのかサイン波のはずがかなりゆがみます。
何故かフォトカプラーの出力がHIが13.5msでLOが6.5msくらいになります???
mruby-bsdgpioにcycleというメソッドを追加します。このメソッドは引数がピン番号で、返り値はワンサイクルのナノ秒です。
ユーザーランドのGPIOイベントで処理しています。GPIO_INTR_EDGE_RISING を指定していますが、なぜか両方のエッジが飛んできます。なんかがおかしいです。
これを組み込んだmrubyで以下のスクリプトを実行します。
t = BsdGpio.new(0)
val = t.cycle(10)
p val
p 1000_000_000.0 / val
実行結果はこんな感じです。
19948562
50.1289265862873
何度か計ってみると小数点以下が変動し、精度が出ない感じです。ちょっと実用には難しいかもしれません。
環境による問題も考えられますが、ユーザーランドのGPIOイベントはあまり精度でないのかもしれません。nsecまで拡張されているので、少し期待しましたが、usecでも十分だと思います。必要なくシステムコールにいろいろな単位ができるのはよくないです。
あと1MHzとかのクロックをGPIOにいれて、GPIOイベント拾おうとすると、システムが固まります。