R-2Rラダー方式のDACについて、いつもどうやったっけなーって調べなおしているので、今回一度愚直に計算してみる。
R-2Rラダー方式DACの回路はこんな感じ。例として4ビットです。
V1=1 or 0, V2=1 or 0, V3=1 or 0, V4=1 or 0でV5に結果が出力される。V5は電流を吸ってしまわないようにボルテージフォロアなんかを付けるのが一般的。V6, V7, V8は計算に使うので割り当てている。
で、節点解析法。
\[ \begin{pmatrix} \frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R} & 0
& 0 & 0 \\ 0 & \frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R} & 0 & 0 \\ 0 & 0 & \frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R} & 0 \\ 0
& 0 & 0 & \frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R} \\ - \frac{1}{2 R} & 0 & 0 & 0 & \frac{3}{2 R} & - \frac{1}{R} & 0 & 0 \\ 0 & -
\frac{1}{2 R} & 0 & 0 & - \frac{1}{R} & \frac{5}{2 R} & - \frac{1}{R} & 0 \\ 0 & 0 & - \frac{1}{2 R} & 0 & 0 & - \frac{1}{R} & \frac{5}{2 R} & -
\frac{1}{R} \\ 0 & 0 & 0 & - \frac{1}{2 R} & 0 & 0 & - \frac{1}{R} & \frac{2}{R} \end{pmatrix} \begin{pmatrix} V_1 \\ V_2 \\ V_3 \\ V_4 \\ V_5 \\ V_6 \\ V_7 \\ V_8
\end{pmatrix} = \begin{pmatrix} I_1 \\ I_2 \\ I_3 \\ I_4 \\ I_5 \\ I_6 \\ I_7 \\ I_8 \end{pmatrix} \tag{1} \]
節点解析法の行列は
i=jの要素は節点iにぶら下がっている要素のアドミタンスの和
i≠jの要素は節点iと節点jの間にある要素のアドミタンスに-1を掛けたものの和
でございます。
ここで、sympyでやる。電気電子系出身だと、あまりやらないアプローチだと思いますが、拙者電気電子系ではないので数学的にアプローチします。sympyについてはPythonで数式処理(1)を見てください。
from sympy import *
from sympy.abc import *
R = symbols('R')
M11=M22=M33=M44=1/(2*R)
M15=M26=M37=M48=-1/(2*R)
M56=M67=M78=-1/R
M55=1/(2*R)+1/R
M66=M77=1/(2*R)+1/R+1/R
M88=1/(2*R)+1/R+1/(2*R)
M = Matrix([[M11, 0, 0, 0, M15, 0, 0, 0],
[0, M22, 0, 0, 0, M26, 0, 0],
[0, 0, M33, 0, 0, 0, M37, 0],
[0, 0, 0, M44, 0, 0, 0, M48],
[M15, 0, 0, 0, M55, M56, 0, 0],
[0, M26, 0, 0, M56, M66, M67, 0],
[0, 0, M37, 0, 0, M67, M77, M78],
[0, 0, 0, M48, 0, 0, M78, M88]])
invM=M**(-1)
invM_small=Matrix([[invM[0,0],invM[0,1],invM[0,2],invM[0,3],invM[0,4]],
[invM[1,0],invM[1,1],invM[1,2],invM[1,3],invM[1,4]],
[invM[2,0],invM[2,1],invM[2,2],invM[2,3],invM[2,4]],
[invM[3,0],invM[3,1],invM[3,2],invM[3,3],invM[3,4]],
[invM[4,0],invM[4,1],invM[4,2],invM[4,3],invM[4,4]]])
M_small=invM_small**(-1)
\[ M= \begin{pmatrix} \frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R} &
0 & 0 & 0 \\ 0 & \frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R} & 0 & 0 \\ 0 & 0 & \frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R} & 0 \\ 0
& 0 & 0 & \frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R} \\ - \frac{1}{2 R} & 0 & 0 & 0 & \frac{3}{2 R} & - \frac{1}{R} & 0 & 0 \\ 0 & -
\frac{1}{2 R} & 0 & 0 & - \frac{1}{R} & \frac{5}{2 R} & - \frac{1}{R} & 0 \\ 0 & 0 & - \frac{1}{2 R} & 0 & 0 & - \frac{1}{R} & \frac{5}{2 R} & -
\frac{1}{R} \\ 0 & 0 & 0 & - \frac{1}{2 R} & 0 & 0 & - \frac{1}{R} & \frac{2}{R} \end{pmatrix} \tag{2} \]
\[ \begin{pmatrix} V_1 \\ V_2 \\ V_3 \\ V_4 \\ V_5 \\ V_6 \\ V_7 \\ V_8 \end{pmatrix} =
M^{-1} \begin{pmatrix} I_1 \\ I_2 \\ I_3 \\ I_4 \\ I_5 \\ I_6 \\ I_7 \\ I_8 \end{pmatrix} \tag{3} \]
ここで、$I_6=0$, $I_7=0$, $I_8=0$で、$V_6$, $V_7$, $V_8$には興味がないので、
\[ \begin{pmatrix} V_1 \\ V_2 \\ V_3 \\ V_4 \\ V_5 \end{pmatrix} = M_s^{-1}
\begin{pmatrix} I_1 \\ I_2 \\ I_3 \\ I_4 \\ I_5 \end{pmatrix} \tag{4} \]
$M_s^{-1}$はこういうものです。
\[ M_s^{-1}= \begin{pmatrix} M^{-1}_{11} & M^{-1}_{12} & M^{-1}_{13} &
M^{-1}_{14} & M^{-1}_{15} \\ M^{-1}_{21} & M^{-1}_{22} & M^{-1}_{23} & M^{-1}_{24} & M^{-1}_{25} \\ M^{-1}_{31} & M^{-1}_{32} & M^{-1}_{33} & M^{-1}_{34} &
M^{-1}_{35} \\ M^{-1}_{41} & M^{-1}_{42} & M^{-1}_{43} & M^{-1}_{44} & M^{-1}_{45} \\ M^{-1}_{51} & M^{-1}_{52} & M^{-1}_{53} & M^{-1}_{54} & M^{-1}_{55} \end{pmatrix}
\tag{5} \]
\[ M_s \begin{pmatrix} V_1 \\ V_2 \\ V_3 \\ V_4 \\ V_5 \end{pmatrix} = \begin{pmatrix}
I_1 \\ I_2 \\ I_3 \\ I_4 \\ I_5 \end{pmatrix} \tag{6} \]
\[ M_s=\left(M_s^{-1} \right)^{-1} \tag{7} \]
コード内のM_smallは$M_s$です。
\begin{pmatrix}\frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R}\\0 &
\frac{3}{8 R} & - \frac{1}{16 R} & - \frac{1}{32 R} & - \frac{1}{4 R}\\0 & - \frac{1}{16 R} & \frac{11}{32 R} & - \frac{5}{64 R} & - \frac{1}{8 R}\\0 & - \frac{1}{32
R} & - \frac{5}{64 R} & \frac{43}{128 R} & - \frac{1}{16 R}\\- \frac{1}{2 R} & - \frac{1}{4 R} & - \frac{1}{8 R} & - \frac{1}{16 R} & \frac{1}{R}\end{pmatrix}
\[ \begin{pmatrix}\frac{1}{2 R} & 0 & 0 & 0 & - \frac{1}{2 R}\\0 &
\frac{3}{8 R} & - \frac{1}{16 R} & - \frac{1}{32 R} & - \frac{1}{4 R}\\0 & - \frac{1}{16 R} & \frac{11}{32 R} & - \frac{5}{64 R} & - \frac{1}{8 R}\\0 & - \frac{1}{32
R} & - \frac{5}{64 R} & \frac{43}{128 R} & - \frac{1}{16 R}\\- \frac{1}{2 R} & - \frac{1}{4 R} & - \frac{1}{8 R} & - \frac{1}{16 R} & \frac{1}{R}\end{pmatrix}
\begin{pmatrix} V_1 \\ V_2 \\ V_3 \\ V_4 \\ V_5 \end{pmatrix} = \begin{pmatrix} I_1 \\ I_2 \\ I_3 \\ I_4 \\ I_5 \end{pmatrix} \tag{8} \]
\[ -\frac{1}{2R}V_1-\frac{1}{4R}V_2-\frac{1}{8R}V_3-\frac{1}{16R}V_4+\frac{1}{R}V_5=I_5
\tag{9} \]
$I_5=0$として、整理すると、
\[ V_5=\frac{8V_1+4V_2+2V_3+V_4}{16} \tag{10} \]
ということで、$V_1$, $V_2$, $V_3$, $V_4$で$V_5$を小刻みにコントロールできます。
LibreOffice Calc(表計算ソフト)で計算するとこうなります。
R-2RラダーDACは簡単な構造でデジタル値をアナログに変換できますが、フルスイングじゃないんだよなー
PWM変調型だと原理的にはフルスイングできそうな気がする。一方で後段にアナログフィルタが必須なので、何やってんだかー的な悩みもある。
コメントをお書きください