microbit

micro:bit / mbed / 入力パルスのパルス幅を測る


参考


概要

BBC micro:bit に入力したパルスのパルス幅を測る。Arduino の pulseIn() のような函数は JavaScript for micro:bit (Blocks を含む) にはあるが MicroPython for micro:bit には見当たらない。簡単に C で実装してみる。


ポーリング方式にする場合

mbed でコンパイルする。

#include "MicroBit.h"

MicroBit uBit;

int pulseIn(void){
volatile uint32_t start;
volatile uint32_t end;
volatile int elapsedTime;

while(uBit.io.P0.getDigitalValue() == 1){} // H の途中だったら一旦 L になるまで待つ。
while(uBit.io.P0.getDigitalValue() != 1){} // あらためて H になるのを待つ。
start = us_ticker_read(); // H になったら時間〔マイクロ秒〕を取得して、
while(uBit.io.P0.getDigitalValue() == 1){} // L になるまで待って、
end = us_ticker_read(); // L になったらまた時間を取得して、
elapsedTime = (int)(end - start); // H の持続時間を計算して、
return elapsedTime; // 返す。
}

int main(void){
uBit.init();
while(1) {
printf("%d\r\n", pulseIn()); // H の持続時間〔マイクロ秒〕を表示する。
}
return 0;
}

実行結果:

image.png

周波数 1 kHz、デューティー 33% のパルスを micro:bit の P0 端子に入力している。単位はマイクロ秒。最短 10 マイクロ秒くらいまで測れる。


イベントを利用する場合

mbed でコンパイルする。

#include "MicroBit.h"

MicroBit uBit;

// イベントハンドラーを定義する。
void getPulseWidth(MicroBitEvent e){
printf("%d\r\n", (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;
}

実行結果:

image.png

周波数 1 kHz、デューティー 33% のパルスを micro:bit の P0 端子に入力している。単位はマイクロ秒。最短 80 マイクロ秒くらいまで測れる。


ポーリング方式で GPIO の IN レジスタを読み取る場合

http://ti-nspire.hatenablog.com/entry/2018/05/23/160004


関連

http://ti-nspire.hatenablog.com/archive/category/micro%3Abit%20%E5%85%A5%E5%8A%9B%E3%83%91%E3%83%AB%E3%82%B9%E5%B9%85%E3%81%AE%E6%B8%AC%E5%AE%9A