ポーリング方式ではなくイベントを利用してパルス幅を測ってみる。
#include "MicroBit.h" MicroBit uBit; // イベントハンドラーを定義する。 void getPulseWidth(MicroBitEvent e){ printf("%d\n\r", (int)e.timestamp); // コールされたらそのときのタイムスタンプを表示する。 } void printPulseWidth(void){ // メッセージバスにイベントを登録する。 uBit.messageBus.listen(MICROBIT_ID_IO_P0, // 指定の端子から発生するイベントである。 MICROBIT_PIN_EVT_PULSE_HI, // H のときに発生するイベントである。 getPulseWidth, // イベントが発生したら getPulseWidth() 函数を実行する。 MESSAGE_BUS_LISTENER_IMMEDIATE); // イベントが発生したらすぐに処理する。 // どのような状態のときにイベントを発生させるのかを設定する。 uBit.io.P0.eventOn(MICROBIT_PIN_EVENT_ON_PULSE); // 指定した端子が H または L のときにイベントを発生させる。 } int main(void){ uBit.init(); printPulseWidth(); return 0; }
micro:bit の P0 端子に周波数 1 kHz、デューティー 33% のパルスを入力している。単位はマイクロ秒である。80 マイクロ秒くらいまで測れる。