Scoppy; Raspberry pico を使ったオシロスコープ

PicoLabo

本文

Installation & Getting Started

Scoppy のセットアップ

電圧範囲とオシロスコープのアナログ フロントエンド

デフォルト (0 ~ 3.3 V) とは異なる電圧範囲 (-5 V ~ +5 V または 0 V ~ 0.1 V など) を測定するには、信号を減衰/増幅したり、信号を減衰したり増幅したりするために、Pico の前に追加の回路を追加する必要があります。

Pico の ADC ピンの電圧が 0 ~ ADC_VREF (デフォルトでは ADC_VREF は 3.3V) になるように、適切な電圧オフセットを提供します。 次のいずれかになるようにアナログ フロントエンドを設計する必要があります。
  • ユーザーによる電圧範囲の選択が可能になります (例: 機械的スイッチを使用)。フロントエンドは、ファームウェアとアプリが現在どの電圧範囲が選択されているかを認識できるように、Pico の電圧範囲ピンに適切な値を設定する必要もあります。
  • または 電圧範囲ピンの値を読み取り、それに応じてフロントエンドの範囲を設定します(たとえば、CD4052 などのアナログ スイッチを介して)。電圧範囲ピンの値は、アプリの現在の Volts/Div 設定に従ってファームウェアによって設定されます。
    引用元: Scoppy - Oscilloscope and Logic Analyzer Analog Front-End

Analog Front End I : PicoLabo動画の入力バッファ回路抜粋

Analog Front End I : PicoLabo動画の入力バッファ回路抜粋 Analog Front End I : PicoLabo動画の入力バッファ回路抜粋 (2) Analog Front End I : PicoLabo動画の入力バッファ回路抜粋 (3) Analog Front End I : PicoLabo動画の入力バッファ回路抜粋 (4) Analog Front End I : PicoLabo動画の入力バッファ回路抜粋 (5)

プローブや回路の容量調整用のコンデンサは、PicoLaboさんの コメント によると、 \[R1 \times C1 ≒ R2//R3 \times C2 \] でバランスが取れるとのこと。具体的に計算してみると、 \[C1 = \frac{R2//R3}{R1} \times 22p = \frac{1}{10} \times 22p = 2.2p\] であった。シミュレーションでは、3p がほどよい値となった。

Analog Front End II : Scoppy開発者の入力バッファ回路の設計事例

Design1:電圧範囲 ±12V


回路定数の決め方について、引用元では次のように説明されている。
まず、正しいゲインが入力信号に適用されるように、入力抵抗 Rin1 と Rin2 の値を選択する必要があります。

  • 3.3 (ピコの電圧範囲) を入力電圧範囲 (この設計では 12V) で割ることにより、分圧器の必要なゲインを計算します。最終的には 0.275 の値になります。
  • Rin2/(Rin1 + Rin2) が必要なゲインと同等になるように、Rin1 と Rin2 の値を選択します。E12 シリーズで機能する値は 680k と 270k です。これらの値を使用したゲインは 0.28 になります。
注記。フロントエンドの入力インピーダンスが高くなるように、高い抵抗値が使用されています。

  • 次に、Vref の必要な値を計算します。これを計算する式は次のとおりです。 Vref = Vinmin / (1 - 1/ゲイン) ここで、Vinmin は入力電圧範囲の最小値です。
以上のことを数式で表せば、次のようになる。

電圧範囲を -Vs から+Vsとし、 Rasp pi のADC電圧を 3.3V とするとき、
Gain=3.3/Vs/2
R2/(R1+R2)=3.3/2/Vs=Gain
Vref=-Vs/(1-1/Gain))
Vref=3.3*R4/(R3+R4)

Design5:1CH 電圧範囲±6V,  2CH 電圧範囲±10V


定数の設計

このフロントエンド回路は、2CH分であることを除けば前項のPicoLabo動画で示された回路と同じである。細かく言えば、容量調整用のコンデンサは含んでいない。

回路定数は次のように考え設計する。

  1. 振幅±Vsの入力電圧を抵抗分圧により、振幅3.3Vに変換する。(R1 と R2//R3 の抵抗分圧。R3の電源側はGNDと考える。)
  2. このとき、マイナス電圧を含む振幅3.3Vにバイアス電圧を加えることによって、0~3.3Vにオフセットさせる。(R3 と R1//R2の抵抗分圧。R1の電源側はGNDと考える。)

これらを数式化すると、次のようになる。

電圧範囲を -Vs から+Vsとし、 Rasp pi のADC電圧を 3.3V とするとき、

Gain=3.3/Vs/2  (例 Vs=10, Gain=3.3/10/2=0.165)
Gain($-\alpha$)=0.16<(R2//R3)/((R2//R3) + R1)<0.165=Gain
(R1//R2)/((R1//R2)+R3)=0.5
R1=1000k


ここで、3番目の式はバイアス電圧の中点が、振幅3.3[V] の中点となる条件である。また、入力インピーダンスを1Meg以上にしたいので、最後の条件を付けた。

この条件を Resister Solver で解析すると、各抵抗値は下記のようになる。


この抵抗値を用いて、シミュレーションした結果が下図である。CH1は引用元で示されていた抵抗値で計算し、CH2は新たに求めた抵抗値で計算したものである。後者でも問題ないことが確認できる。


入力インピーダンス

LTspiceの " .tf解析 " を使えば、入力インピーダンスなどを算出できる。解析すると 1.2MΩ であった。

--- Transfer Function ---

Transfer_function : 0.162376 transfer (入出力変換比率)(出力/入力)
v3#I nput_impedance : 1.19387e+06 impedance (入力インピーダンス)
output_impedance _at_V(gpio27): 100.002 impedance (出力インピーダンス)

Analog Front End III : 入力ゲインを選択できるPicoLaboキット回路

Scoppyには下表に示すように入力レンジを選択できる機能が備わっている。PicoLaboのものは、それを利用した回路である。

GPIO Input/Ouput Summary Description
2 & 3 Input - pulled down CH1 Voltage Range Currently selected voltage range for channel 1
4 & 5 Input - pulled down CH2 Voltage Range Currently selected voltage range for channel 2


PcoLaboオリジナルは入力電圧範囲が、±30, ±8, ±2 なので、±10, ±5, ±2, ±1に変更したシミュレーションを行った。さらに、バイアス電圧も少し動かしている。

入力 V(TP0): 黄色、出力 V(adc0): 濃い青色、抵抗分圧点 V(tp3): 水色 である。位相が $\pi/10$ 程度遅れているのと、マイナス3.3Vが必要なところがデメリットである。

なお、このケースでは出力の波形は次の値であった。

歪率 Total Harmonic Distortion:   0.014820%
最大値 adc0_mx: MAX(v(adc0))=3.12067 FROM 0 TO 0.00500161
最小値 adc0_min: MIN(v(adc0))=0.281937 FROM 0 TO 0.00500161

--- Transfer Function ---
Transfer_function : 0.301997 transfer
v3# Input_impedance : 1e+06 impedance
output_impedance _at_V(adc0): 2700.01 impedance



DIY事例


Raspberry Pi Pico(ラズベリー・パイ Pico)の電源

Raspberry Pi Picoに電源を供給する方法は主に3つあります。USBコネクターにパソコンや5Vの電源ユニットをつなぐ方法(a)、VBUSピンに5Vを供給する方法(b)、VSYSピンに1.8V~5.5Vを供給する方法(c)です。いずれの方法も3V3ピンから外部回路用として3.3Vが出力されます。この3V3ピンは出力専用なので、電源に接続してはいけません。

Recommended ways of powering Raspberry Pi Pico

Recommended ways of powering Raspberry Pi Pico Hardware design with RP2040 - 3.1 Power

予約済みGPIOの24番はVBUSピンの監視、29番はVSYSピンの電圧監視、23番は省電力制御に用いられています。

Raspberry Pi Pico 電源端子等

VBUSに電源繋いでいる状態でUSB挿すと電源同士がショートする。(ふつう、そんなことはしないでしょうけれど)
万が一の事故防止のためにショットキーダイオードが入ったVsys使うのが安全。(つまり、Vsys供給ならUSB挿しても大丈夫)

Raspberry pi Pico を使うときにどの端子に電源を供給されるかがぱっと見でわからないので、電源系端子についてまとめてた。
結論、VSYSに+5.5~1.8Vを供給してGND端子のいずれかに外部電源GNDを接続するだけでよい。

VBUS:
USBから供給される電圧を 出力する端子 。USBが接続されていると5 Vが供給される。

VSYS:
メインシステム用の電源供給 (入力)する端子 。1.8~5.5Vの範囲で供給する。RP2040には3.3Vレギュレータを介して供給される。VBUSにはダイオードを介して接続されているので、5.5Vを供給してもVBUS側には供給されない。

3V3_EN:
3.3Vを出力するかしないかを選択する端子。3.3VレギュレータのEnable端子に接続されている端子。基板上でVSYSにプルアップされているので、通常動作させる際は端子を開放する。逆にレギュレータをDisableにしたいときはGNDに落とす。

ADC_VREF:
ADCのリファレンス電圧供給用端子。正確なADC値が欲しいときはこの端子にADC用の正確な3.3Vを供給する。基板上で抵抗を介して3.3Vレギュレータに接続されているのでこの端子に3.3V を供給しなくてもADCは動作できる。

AGND:
ADC用グランド端子。他のGND端子と回路図上区別はされていない。ADC_VREFを供給する際にこの端子を使用して電圧リファレンスIC等のGNDと接続する。

GPIO:

設定を変更できるが、デフォルトでは1ピンあたり4mAまで(最大でも12mAまで)。さらに全体で合計50mAまでの電流しか供給できないらしい。また電流を流せば流すほど、ピンの電圧が下がることにも注意

RUN:
RP2040のEnable端子に接続されている端子(リセット端子)。RP2040の内部でプルアップされているので、リセットする際はGNDに落とす。

LED:
GPIO25: 基板上でLEDのアノード側に接続されている端子。

引用元: Raspberry Pi Pico を使ってみる(回路とLチカ)
Next Post Previous Post