2017年11月29日水曜日

Nucleo(mbed)で電圧を監視する

MAU106±5V電源でDigital+5Vの出力を1/2に分圧して取り出せるようにしているので、Nucleoでその電圧を測定して電圧監視するClassを作ってみた。

Class内でTickerを使うには、attach()を
t.attach(this, &VoltageMonitor::blinkLed, 0.5);
と、第一引数に自分自身を指定する必要がある。(参考:「https://os.mbed.com/forum/mbed/topic/1964/」)
Warning: Function "mbed::Ticker::attach(T *, M, float) [with T=VoltageMonitor, M=void (VoltageMonitor::*)()]" (declared at <a href="#" onmousedown="mbed_doc_goto('/VoltageMonitor_Test//extras/mbed_e7ca05fa8600/drivers/Ticker.h', '102'); return false;">/extras/mbed_e7ca05fa8600/drivers/Ticker.h:102</a>) was declared "deprecated" in "VoltageMonitor/VoltageMonitor.h", Line: 67, Col: 24
というWarningが出るが、mbed-srcのdirvers/Ticker.hに
    template<typename T, typename M>
    MBED_DEPRECATED_SINCE("mbed-os-5.1",
        "The attach function does not support cv-qualifiers. Replaced by "
        "attach(callback(obj, method), t).")
    void attach(T *obj, M method, float t) {
        attach(callback(obj, method), t);
    }
と宣言されていて、cv-qualifiers(constやvolatileの修飾子)をサポートしていないので(mbed-os-5.1以降?)非推奨というような事が書いてある。

mbed OS 5はなんだかイマイチこなれていない感があるので今回はmbed 2で使うことにして、
void attach(T *obj, M method, float t)
をそのまま使うことにした。そもそも
attach(callback(obj, method), t);
の「callback()」が何なのかよくわからない。←そのうち調べるかも?

ブレッドボード配線図

Test Program
https://os.mbed.com/users/ryood/code/VoltageMonitor_Test/ Revision:1

VoltageMonitor Class
https://os.mbed.com/users/ryood/code/VoltageMonitor/ Revision:1

VoltageMonitor Classのコンストラクタで
    // パラメータ
    // _ain: 電圧監視用ADC
    // _vdd: VDDの電圧値(実測値を指定)
    // _loThreshold: 電圧低下閾値
    // _hiThreshold: 過電圧閾値
    // _pLed: 警告用LED (NULL: LEDを使用しない)
VoltageMonitor(AnalogIn* _pAin, float _vdd, float _loThreshold, float _hiThreshold, DigitalOut* _pLed=NULL)
とパラメータを指定し、check()を呼び出す。
    // 返り値
    // -1: 電圧低下
    //  0: 正常
    //  1: 過電圧
    int check()
Nucleo自体には内部レファレンスがあるが、3.3VのVDDを実際にテスタ等で測定して基準電圧として使うことにした。

動作としては電圧が低下した場合はLEDがゆっくり点滅、過電圧の場合ははやく点滅、正常時は常時点灯としている。

内蔵基準電圧


Nucleoをmbedで使って内蔵基準電圧を使いたい場合は
AnalogIn   vrefint(ADC_VREF);
と指定すれば使えるようだ。

参考「https://os.mbed.com/questions/75910/How-to-get-the-value-of-inbuilt-vref-int/

内蔵基準電圧は1.21Vなので今回は使用していない。(入力が0V~2.7V以上を想定)