ADCの値から抵抗値や電圧を求める方法

No Image

ADC(アナログ-デジタル変換器)で取得したデータは量子化されているため、基準電圧に対してのバイナリデータになります。
そのままでも使える場合もありますが、抵抗値や電圧を測定する場合は、計算で求める必要があります。
様々な状況がありますが、換算式を忘れてしまって毎回手計算で求めているのでここにまとめようと思います。

ADCの値から抵抗値や電圧を求める方法

スポンサーリンク

測定回路と変数

解説する前に、抵抗値や電圧を求めるために使う回路と変数を提示しておきます。
測定回路と変数
固定抵抗のR_sと可変抵抗のR_xと書いていますが、これはいろんな状況があると思います。
ボリュームであればR_sR_xのどちらも変化するでしょうし、どちらも固定でV_{in}が変化する場合もあります。

基準電圧がV_sNbitのADCを使います。
次項からの具体的な例は分かりやすいように Arduino Uno を使った場合で解説していきます。
その Arduino Uno でしたら10bit(N)のADCで、基準電圧V_sはデフォルトでは5Vです。
Nが分かったのでM=2^{10}となり、量子化レベル数Mは1024です。
ということはデジタルデータD_x(analogReadで取得する値)は0~1023の値を取るはずです。

抵抗(Rx)にかかっている電圧(Vx)を求める

導出

これを求めるのが一番簡単です。
というのも、ADCは入力端子とGND間にかかっている電圧を見ていますからね。
他に紹介する回路はこの計算を必ずしていますので、ここでは重要な式です。
さて、上記の分圧回路で入力端子-GND間に接続されている抵抗R_xにかかっている電圧V_xを求めます。

この場合はV_xがデジタルデータになっているだけですから、下式になります。

    $$V_x = \frac{V_s}{M}D_x$$

基準電圧V_sM等分されていて、データがどのレベルにあるか(D_x)で読み取った電圧が分かるわけです。

例えばデジタルデータD_xが"800"である場合、以下のように代入できますので、値が求まります。

    $$\frac{5}{1024}\times 800 = 3.906\ldots$$

抵抗にかかっている電圧V_xは約3.9Vということがわかります。
このとき、値を格納する変数は丸められないようにfloat型などにしておきましょう。

抵抗値(Rx)を求める

導出

測定回路にあるように測定抵抗R_xはGNDと入力端子の間に接続して測定します。
別にR_xV_{in}と入力端子の間でもいいんですけど、私はGNDに接続する方が多いかもしれません。
サーミスタはこれで抵抗値を求めてから、温度を計算します。
入力電圧V_{in}は電源電圧(5Vや3.3V)にする場合もよくあります。

分圧回路でとりあえず前述の式で電圧値として取得し、その後に抵抗を計算します。
この場合、抵抗R_sは既知でなければなりません。
分圧の公式を今回の変数に当てはめると、下式になります。

    $$V_x = \frac{R_x}{R_s + R_x}V_{in}$$

分圧の公式の導出は省略します。

これを変形してR_xの式にします。

    \begin{eqnarray*} R_x &=& \frac{V_x}{V_{in} - V_x}R_s\\ &=& \frac{R_s}{\displaystyle\frac{V_{in}}{V_x} - 1}\end{eqnarray*}

ここで、V_x=(V_s / M)D_xですから、これを代入すると下式のように変形できます。(前項で導出しました)

    $$R_x=\frac{R_s}{\displaystyle\frac{V_{in} M}{V_s D_x}-1}$$

少しややこしいですが、これで抵抗値R_xが求まります。
V_{in} M/V_sは定数ですから、あらかじめ計算しておいて求める際にD_xで割れば、計算量を少なくできます。

さらにV_{in}=V_sであれば、もう少しまとまります。

    $$R_x=\frac{R_s}{\displaystyle\frac{M}{D_x}-1}$$

入力電圧V_{in}に5Vなどの電源電圧がかかっていて、それが基準電圧V_sと同じというのはよくある状況です。

先ほどと同じくデジタルデータD_xが"800"で、基準抵抗R_sが1kΩであれば以下のように代入できますので、値が求まります。

    $$\frac{1.0\times 10^3}{\displaystyle\frac{5\times 1024}{5\times 800}-1}=3571.4\ldots$$

というわけで約3.6kΩと求まりました。

Rxが固定でRsの値を求める場合

逆にR_xが固定でR_sの値を求めるとどうなるでしょうか。
別に難しいことはなく、先ほど導出した式を変形するだけです。

    $$R_s=\left(\frac{V_{in}M}{V_s D_x} - 1\right) R_x$$

あくまで、R_xは今回は固定値です。
V_{in}=V_sの場合も一応導出しておきます。

    $$R_s=\left(\frac{M}{D_x} - 1\right) R_x$$

入力電圧(Vin)を求める

導出

ADCの最大入力電圧より高い電圧を測定したい場合は、分圧して電圧を下げてADCに入力します。
そして計算で分圧前の電圧(ここでは入力電圧)を求めますので、このような状況もよくあります。
ただしこの場合はR_xは固定値です。

今回も分圧の公式を変形してV_{in}の式にします。

    \begin{eqnarray*} V_x &=& \frac{R_x}{R_s + R_x}V_{in} \\ V_{in} &=& \left(1+\frac{R_s}{R_x}\right) V_x\end{eqnarray*}

ここで、V_x=(V_s / M)D_xですから、これを代入すると下式のように変形できます。

    $$V_{in}=\left(1+\frac{R_s}{R_x}\right)\frac{V_s}{M}D_x$$

これでV_{in}の値が求まりますね。
\left(1+R_s/R_x\right)V_s/Mは定数ですから、事前計算で計算量はかなり少なくできます。

同じくデジタルデータD_xが"800"のとき、基準抵抗R_sが2.2kΩで、固定抵抗R_xが1kΩであれば以下のように代入できますので、値が求まります。

    $$\left(1+\frac{2.2\times 10^3}{1.0\times 10^3}\right)\times\frac{5}{1024}\times 800 = 12.5$$

ということで入力電圧V_{in}は約13Vと求まりました。


ここで求めた式を実際に使うと、ピッタリ合う!と思いきやそうではありません。
いろんな要因があって、計算値と実際の値は異なります。
基準抵抗の誤差、配線の抵抗、入力電圧の精度など要因は様々です。
どうやって理想の値に近づけるかはまた別の話になってしまいますので、それはまた別の機会に。

ADCの値から抵抗値や電圧を求める方法

スポンサーリンク

Leave a Comment