mbedでとりあえずパルス幅計測

こんにちは。

今回はARMのmbedとnucleo F303K8を用いて精度をあまり求めない場合に使用できる、パルス幅測定をしようと思います。

 
使用するモジュールはTimerとInterruptInです。

Timerはこちらを参照してください。
Timer - タイマー時間 | Mbed


InterruptInはピン変化割込みです。こちらを参照してください。
InterruptIn - ピン変化割込み | Mbed


今回想定したパルスは、サーボ信号です。周波数約70Hz、パルスオン幅1500us から 2500us程です。
mbedでは今回のパルスオン幅ではタイマーのオーバーフローを意識しなくとも、コンパイラが勝手に処理して正常な値を返してくれます。(便利すぎる)

以下に割込み処理のコードのみを示します。実際使用する際はご自身でmain関数を書いてください。動作は簡単で、パルスが立ち上がったらタイマースタート、立ち下がったらタイマーストップし、タイマーの値を変数に代入するといった形です。
flip_rise→InterruptIn risng edge mode
flip_fall→InterruptIn falling edge mode
captime→変数
flag→変数

void flip_rise(){             //risng edge interrupt
    t.start();                   //Timer Start
    flag = 0;
    }
    
void flip_fall(){           //falling edge interrupt
    t.stop();                //Timer Stop
    captime = t.read_us();  //captime = pulse on time[us] ,captimeはグローバル変数(任意の変数)
    t.reset();              //reset Timer
    flag = 1;
    }

実際にはタイマーをスタート/ストップするラグがありますので、正確なパルスオン幅が読み取れるわけではないです。しかしパルスオン幅に応じてDCブラシモーターをPWM制御したいといった程度ならば問題ないレベルになります。
適当にggってもそれらしき記事が無かった(このくらい自分で考えつくということでしょうかw)のでノリで作りました。