MicroPython的午睡(65) ラズパイPico、アナログコンパレータのトリップ電圧

Joseph Halfmoon

前回MicroChip社製MCP4018デジタルポテンショメータをラズパイPicoに取り付けて制御。I2Cで制御できる「可変抵抗」です。今回は応用例としてデータシートに載っているアナログコンパレータの閾値調整をやってみます。想定の応用はセンサなどからのアナログ信号がある閾値を超えたらマイコンに割り込むとか。

※「MicroPython的午睡」投稿順 Indexはこちら

最近のマイコンにはADコンバータが搭載されていることが多いので、それを使って何かの電圧、例えばセンサの値などをモニタするというのはアリです。しかし定期的にADの値を調べるためにソフトウエアに負荷がかかります。その点、アナログコンパレータであれば、ある特定の電圧を超えたら割り込みかけるとか、アクションが不要な期間はソフトに負荷かけないで済むので楽です。

この頃のマイコンにはコンパレータ搭載している機種も増えている感じがします。コンパレータが反応する電圧を設定するためには、可変の電圧源、多くはDAコンバータの1チャネルが使われることが多いです。でもDAない機種も多いし。そんなとき、このプログラマブルな抵抗MCP4018が役に立つと。

実験に使用したMicroPythonスクリプト

例によって前回使用のスクリプトを流用、チョイ変で対処しています。前回のコードのmain関数のところを以下に差し替えただけです。

    1. MCP4018の実験用の値設定に関数 setMCP4018UI()を追加
    2. main()関数内で上記を呼び出して15から127まで16毎にポテンショメータの値を設定するようにした。1つの値に30秒確保するようにした。

30秒間同じ値で固定しているのでその間に波形などキャプチャして観察するという目論見。ただ呆然と待っていると30秒は長いですが、波形キャプチャをしていると意外と短いです。

なお、Pin4を入力に設定しているのは、コンパレータの値を見て何かするための準備です。今回は何もしてません。ただコンパレータが反応する電圧をMicroPythonスクリプトから調整するのみ。

def setMCP4018UI(res):
    global mcp4018
    print("RES: 0x{0:02x}".format(res))
    tpl = mcp4018.dataWrite(res)
    print("adrACK: {0} datACK: {1}".format(tpl[0], tpl[1]))

def main():
    global mcp4018
    comparatorOUT = machine.Pin(4, machine.Pin.IN)

    mcp4018 = fullSoftMCP4018(2, 3)
    mcp4018.softResetMCP4018()
    res = 0xF
    while(1):
        #sweepRangeUI()
        #sweepRangeFast()
        setMCP4018UI(res)
        res = (res + 0x10) if res < 0x70 else 0xF
        time.sleep(30.0)

if __name__ == "__main__":
    main()
実験に使用した回路

回路図は冒頭のアイキャッチ画像に掲げました。前回の回路の横に低電圧動作(3Vから動く)のCMOSオペアンプ、NJU7031を載せて「コンパレータ」として使ってみました。NJU7031は、元の新日本無線、今年の1月からは日清紡マイクロデバイス社の製品です。合併で名前が変わる件は別件で書かせていただいているので知ってましたが、いざWebページで新たな社名の元にデータシート配られている(実体はJRC印のデータシートのままでしたが)のを見ると感慨もひとしお(ホントか、そんなに思い入れないだろ~)

DUT

実機動作確認

MicroPythonスクリプトを走らせると、標準出力に仮想端末が接続されていれば、以下のようにMCP4018への設定値を16進で報告してきます。この値を見て、コンパレータの動作の波形キャプチャをするという段取りです。

ThonnyShell

以下は、実機の動作例です。設定値は 0x0F。入力波形は黄色のC1です。振幅1.5V、オフセット1.5V、周波数1kHzの三角波です。これをコンパレータ(非反転)に入力するとMCP4018で設定しているトリップ電圧と比較されて、それより電圧が高ければ青色の出力(C2)がハイになるという動作です。

右側の計測ウインドウに出力波形のデューティ比が出ているので目安になるかと思います。

RES0x0F

設定値 0x2Fがこちら。波形上でC2のほぼ立ち上がり、立下り付近にカーソル(赤)を置いてあります。

RES0x2F

設定値 0x4Fが以下に。順調に閾値が上昇しているのが分かります。

RES0x4F

設定値 0x6F のときがこちら。コンパレータがハイを出力するギリギリの線に近づいています。三角波の入力とコンパレータ出力との間にタイミング的なズレがあるのも見てとれます。信号処理用の高速なコンパレータではない、汎用オペアンプなのでこんなもんですかね。考察はパス。

RES0x6F

入力波形の観察を止めて、C1をコンパレータの参照電圧に切り替えました。0x0F設定のときの電圧がこちら。Vtrip0x0F

各測定点で、閾値電圧を測定、X軸 MCP4018への設定値(D、0~127)に対してプロットしてみたものが以下に。表計算ソフトは回帰直線も計算して表示してくれるので直線とそのときの式を記載してみました(無駄に桁数が多いですが。)

VtripGraph

コンパレータのトリップ電圧調整、MCP4018使えばチョロイな。ホントか?

MicroPython的午睡(64) ラズパイPico、デジタルポテンショメータを制御 へ戻る

MicroPython的午睡(66) ラズパイPico、非反転アンプのオフセットとゲイン調整 へ進む