Arduino UNO R4のOPAMPを使う

Arduino UNO R4の6回目です。
今回は、Arduino UNO R4で追加になったOPAMP機能の確認です。(OPアンプの英略は色々ありますが、ArduinoのHPとルネサス社のデータシートの記載に合わせてOPAMPとします。)
まだ、ネット上でも出回っている情報が少ないので、新しいことが分かったら追加して行きます。

基本情報

Arduino UNO R4には、R3にはなかった機能が追加されていますが、その1つがOPAMPです。
「Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編」によれば、
・入力端子2 つと出力端子1 つを備えた差動オペアンプユニットを合計で4 つ搭載しています。(ユニット0~ユニット3)
(Arduino UNO R4では、標準で1つが端子に接続されています。)
・「高速モード」と「低消費電力モード」があります。
・必要に応じて(A/D変換の動作に合わせて)ユニットごとに停止させることで、消費電力を低下させることが出来る。

「コモンモード入力範囲」は、0.2 V ~ 5 V (5.5 V -0.5 V)
「ゲイン帯域幅」は、低消費電力モードで 0.04 MHz、High-speedモードで 1.7 MHzです。
「オープンゲイン」は、120 dBです。
その他の値はデータシートの「48 電気的特性」の「48.14 OPAMP 特性」に記載されています。

動作確認

それでは、実際にOPAMPの性能を確認してみましょう。
(まともな信号発生器やオシロスコープは、引っ越しの際に処分してしまったので、自作機材や小型計測器で確認しますので目安程度で御覧ください。)

特殊なことはせずに、まずはArduinoのHPにある、「Arduino UNO R4 Minima OPAMP」に従って機能確認を行います。
ここでは、OPAMPを「ボルテージフォロア」と「電圧増幅器」として使用する場合について書かれています。その後、OPAMPを動作させるための最低限のコードが書かれています。

あれ?OPAMPの出力段の最大電圧は4.7 Vと書かれていますね。5 Vではなかったです。気をつけます。

信号発生器、オシロスコープ、可変式のアッテネータとブレッドボード1式を準備します。
信号発生器の製作(Pa-Lab2号機)で紹介した機材を使います。
(詳細は以下をクリック)

信号発生器の出力を1 V p-p程度まで減衰して、Arduino UNO R4につなぎます。

OPAMPのスケッチ

OPAMPを動作させるためのスケッチは、以下のとおりで簡単です。

#include <OPAMP.h>

void setup () {
  OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}

void loop() {}

「OPAMP.h」ライブラリを呼び出します。
「OPAMP.begin(speed)」の speed 部分を「OPAMP_SPEED_LOWSPEED」:低速モード又は「OPAMP_SPEED_HIGHSPEED」:高速モードと記載するだけです。

Arduino IDEでコンパイルして転送すると、OPAMPが動作開始します。(もちろん、プログラムを書き込んだ後にUSBケーブルを抜いたらOPAMPは動作しません。経験談)

OPAMPの接続

OPAMPの接続は、「電圧増幅器」として紹介されているとおりにつなぎました。

A1端子が 「OPAMP +」
A2端子が 「OPAMP -」
A3端子が 「OPAMP OUT」

です。

このような正弦波を入力したら、

こんな波形になりました。
(接続後に信号発生器のノブを触ってしまったので、周波数は上図と異なります。)
そうですよね。
単電源のOPAMPですから、そうなりますね。
波形のマイナス部分をなんとかします。

いつもお世話になっている、ラジオペンチさんの「Arduinoで作るオシロ、ACモードを追加(回路、ソフト解説)」で紹介されている、バイアスを加えてオフセットする方法を使わせていただきます。

動作周波数

普通にOPAMPとして使用できそうなので、一番気になる動作周波数を簡単に確認します。
まずは周波数の低い側

自作の信号発生器で安定して出力できる500 Hz位を入力します。
もちろん、低い側は問題なく動作しました。(写真を取り忘れました。)

1 kHz位から、切り替えて少しずつ周波数を上げます。
このぐらいの周波数なら、全く問題有りません。
(写真は100 kHz付近です。)

途中の写真は省略しますが、段階的に周波数を上げていきます。
画像は400 kHz付近です。
問題ありません。

700 kHzを越えると波形は問題なく見えますが、振幅に減衰が見られます。
p-pで300 mV程度が250 mVぐらいに見えます。

900 kHzを越えると、明らかに小さくなり、1 MHzを越えるとまともな波形が見られませんでした。
(ブレッドボードの回路にワニ口ケーブルで接続している為かも?)

データシートでは、「ゲイン帯域幅」が、High-speedモードで 1.7 MHzなので、半分の800 kHz位まで使えるかな?と思っていましたが、何度か試してみて 500 kHz位までが実用範囲と感じました。
しっかりとしたテストベンチで、検定済みの計測器でテストすれば違った結果になるかもしれません。

OPAMPの停止

スケッチの解説のところで、OPAMPの開始の仕方は分かりました。OPAMP.begin(speed); ですね。

でも、停止の仕方が出ていません。
データシートのOPAMPの項目には、消費電力を抑えるために色々な停止方法があると書いてはあるのですが、その方法がArduinoのHPの「Arduino UNO R4 Minima OPAMP」には出てきません。もちろん、OPAMPライブラリの動作例にも記載が有りません。

ネットでArduino UNO R4 OPAMP「停止」で色々と検索しても見つかりません。
ダメ元で、「OPAMP.begin」に対応しそうな、OPAMP.stopとか、OPAMP.offとか打ってみましたがもちろん停止しません。エラーになります。
しかたがないので、、ライブラリの「OPAMP.cpp」を確認します。(最初から見ろよ)
(ファイルの場所は、C:\Users\◯◯\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.0.5\libraries\OPAMP\src\OPAMP.cpp)

void OpampClass::end() {
    // deactivate all channels.
    R_OPAMP->AMPC = 0;
}

この部分を見ると、停止は「end()」ですね。「OPAMP.end();」でOPAMP停止です。(R_OPAMP->AMPC = 0; でも停止できそうです。 )

これで一通りの検証が出来ました。

懸案事項

簡単な検証だけですが、Arduino UNO R4で追加されたOPAMPが使用できました。
ただし、OPAMPの機能で未検証で気になることがいくつかあります。

2個目以降のOPAMP

「RA4M1」MCUには4つのOPAMPが内蔵されています。「OPAMP.cpp」には以下の記述があります。

// See Renesas RA4M1 Group Datasheet
// Note: Channel 0 is the only accessible one one the Arduino Minima boards. 
static const opamp_channel_pins_t opamp_channels[] = {
    {BSP_IO_PORT_00_PIN_00, BSP_IO_PORT_00_PIN_01, BSP_IO_PORT_00_PIN_02}, /* CH0 */
    {BSP_IO_PORT_00_PIN_13, BSP_IO_PORT_00_PIN_12, BSP_IO_PORT_00_PIN_03}, /* CH1 */
    {BSP_IO_PORT_00_PIN_11, BSP_IO_PORT_00_PIN_10, BSP_IO_PORT_00_PIN_04}, /* CH2 */
    {BSP_IO_PORT_00_PIN_05, BSP_IO_PORT_00_PIN_06, BSP_IO_PORT_00_PIN_07}, /* CH3 */
};

つまり、Arduino UNO R4で選択されるOPAMPは通常はゼロですが「opamp_channels[]」で、その他の3つのOPAMPが選べるということですね。

No.OPAMP +pinOPAMP –pinOPAMP OUTpin
0A100A201A302
RX LED13TX LED12NC03
NC11VREF10NC04
なし05なし06なし07

表にしてみると、OPAMPの2つ目と3つ目は配線すれば使えそうです。4つ目はこのサイズのMCUでは外部に配線が出ていないようです。(100-pin LQFPパッケージなら全ての端子が出ています。)
もし、アナログ回路を作る場合で入力が2つ必要な場合は、改造すれば対応できるのかな?

OPAMP出力の接続先

データシートのOPAMPの解説に以下の記載があります。
「すべてのユニットからの出力信号は、ADC14 への入力信号に使用できる。」
つまり、各OPAMPの「OPAMP OUT」端子は、設定すると任意のチャンネルの14ビットA/Dコンバータ(ADC14)に内部でつなぐことが出来る?
これが出来るのなら、外部で配線しなくて済むのでノイズを減らせられそうです。
特に、Arduino UNO R4(64-pin LQFP)で外に出ていないチャンネル(最大で28チャンネルあります。)のADC14に接続できれば言うことなしです。(Arduino UNO R4は6チャンネルが使用可能)

コメント