ラベル 電子回路 の投稿を表示しています。 すべての投稿を表示
ラベル 電子回路 の投稿を表示しています。 すべての投稿を表示

2019年4月3日水曜日

LTspice XVII on macで真空管のシミュレーション(3) - 定電流バイアスを試してみる



電源電圧12Vの真空管アンプで定電流バイアスのシミュレーション

「LTspice XVIIで真空管のシミュレーション(2)」では,2次高調波歪みが多かったのですが,Ep-Ip特性を定電流で眺めてみます.以下の図は,前と同じデータを,最大値1mAで切ってみたものです.

負荷直線として1mAの横線を引くことができれば,バイアス0Vから-1Vまで意外と等間隔になっていることが分かります.もっと先まで等間隔になっていそうです.そこで,次のように定電流回路を組み込んだ回路を作ってみます.

まず,定電流回路を作成します.「トランジスタ(2SC1815)を2つ使った定電流回路のシミュレーションと電子工作・その結果」を参考に,1mAの定電流回路を作成します.以下のような回路を作成しました.

ダイオードに流れる電流をプロットすると,次のグラフのようになりました.
これで,2V以上電圧に余裕があれば,だいたい1mAの定電流を流すことができます.
抵抗XRの値は10kΩとします.ここで,上のEp-Ip特性図はEgを0Vから-1Vまでしか振っていないので,1Vより小さい電圧で定電流特性が必要な今回のアンプでは採用できません.

「定電流回路 いろいろ」をみながら,もう少し必要とする電圧の少ない定電流回路を作ってみました.以下のような回路です.この場合,電源電圧の12Vを使っています.

このとき,V1の電圧が変わった時にトランジスタのコレクタ-エミッタ間に流れる電流は以下のようになります.

これを真空管のカソードに組み込んでみます.バイアス電圧を上げるために,定電流回路の上にカソード抵抗2kΩを挟みました.

このときの入力波形が黄緑色,出力波形が青色です.前と同じように,入力波形は0.4Vpp, 0.8Vpp, 1.2Vpp, 1.6Vpp, 2.0Vppです.

カソードを定電流化することで,前よりも出力波形は綺麗になりました.ただ,前の回路よりも出力が小さくなっているので,負荷抵抗を10kΩから20kΩまで増やしてみます.その結果,以下のようになりました.2Vppの入力に対して8Vpp程度の出力です.カソードに抵抗を用いてバイアスを作った前回の回路よりはうまく動作していることが分かります.

電源12Vでは,このくらいでも上出来かと思います.

「LTspice XVIIで真空管のシミュレーション(4)」へ続く.

2019年4月2日火曜日

LTspice XVII on macで真空管のシミュレーション(2) - B電圧12VでEL34Tを動かしてみる

低電圧(12V)でEL34Tを動かしてみる

「LTspice on macで真空管のシミュレーション」では,B電圧200VでEL34Tを動かしてみました.ここでは,B電圧を12Vという低い電圧で,どのような動作になるかシミュレーションしてみます.

Ep-Ip特性のプロット

まず,12V電圧でのEp-Ip特性をプロットしてみます.真空管のプレートの接続点にマウスカーソルを合わせると電流を測るマークが出て,マウスでクリックすればこの抵抗を流れる電流をプロットできます.
グリッド電圧は{VG}と書いて変数にし,

.step param VG list 0 -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1

で0Vから-1Vまで0.1V単位で変化させます.電源電圧は0Vから12Vまで0.1V単位で変化させます.

以下のような指定でも大丈夫です.VGを0から-1まで-0.1ずつずらす,と指定しています.


こうやってプロットしたEp-Ip特性が以下の図です.横軸がプレート電圧,縦軸がプレート電流です.一番上の曲線が,バイアス0Vのときで,バイアスがマイナス方向に大きくなるにつれて,順に下の曲線になります.一番下の曲線がバイアス-1Vのものです.

回路の設計,シミュレーション結果

電源電圧12Vでなるべく多く,この曲線を横切るようにするために,負荷抵抗を1kΩとし,横軸の12Vと縦軸の1.2mAを結んだ直線をロードラインとし,バイアスはその真ん中,0.5Vと設計します.プレート電流と同じくカソード電流が1.2mA流れているとき,バイアスを0.5V上げるには,カソード抵抗として400Ωを置けば良いことになります.
が,ここはシミュレーターなので,色々値を入れて,実際にバイアスが0.5V程度になる1kΩをカソード抵抗にしてみました.その結果,出来上がった回路が以下のものです.

上のEp-Ip曲線より,1Vpp程度までしか信号は入力できないことが明らかですが,わざと入力として0.4Vpp,0.8Vpp,1.2Vpp,1.6Vpp,2.0Vppの信号を入れて,出力信号を見てみます.以下のような結果になりました.

赤色の直線が,カソード抵抗と真空管の間の点の電位なので,バイアス電圧です.黄緑色の正弦波が入力信号で,青色の波形が出力です.振幅が最小の波形(入力が0.4Vpp)でも,ある程度出力波形が歪んでいることが分かります.

出力波形で最も振幅の大きいものは,上下がサチっています.また,全体的に上の波形が膨らんで,下の波形が細くしぼんでいます.これは,上のEp-Ip曲線において,下に行くに従って曲線の間隔が狭くなっているので,こうなっています.

以上のシミュレーションより,だいぶ波形が歪んでいるものの,電源電圧12Vである程度増幅できていることが分かります.

次の投稿では,定電流バイアスを使って,この特性をもう少し改善してみます.

2次高調波歪み

この出力波形の歪みの形は,以下のように作ることができます.gnuplotで$\sin(x) + 0.2\cos(2x)$をプロットすると,以下のように,上が太くて最大値の絶対値が小さく,下が細くて最小値の絶対値が大きいグラフを描くことができます.太い線が$\sin(x) + 0.2\cos(2x)$,細い線が$\sin(x)$と$0.2\cos(2x)$です.

これより,正弦波に対して,その周波数(基本周波数)の偶数倍(この図の場合は2倍)の周波数を持つ,振幅の小さい周波数成分(2次高調波)を加えると,シミュレーションに近い波形を作ることが可能です.このように,基本周波数の偶数倍の成分の信号が含まれる歪みを,偶数次高調波歪みと呼びます.一方,基本周波数の奇数倍の成分が含まれる歪みを奇数次高調波歪みと呼びます.

真空管アンプは2次高調波歪みが多く,一方半導体アンプは3次高調波歪みが多い,そして偶数次高調波歪みが奇数次高調波歪みに比べて聴感上よく聞こえると言われています.さらに,特に弦楽器は2次高調波歪みが多いので,真空管アンプの歪みによって,響きが強調されて心地よく聴こえると言われることもあります.

「LTspice XVIIで真空管のシミュレーション(3)」へ続く.

2014年6月4日水曜日

エレキットUSB-DACにVUメーターの追加

先日作ったエレキットのUSB-DACにVUメーターを追加してみました.

VUメーターとVUメーターへの出力基板はヤフオクで落札.メーターは中古品だったのでだいぶ安く本物を手に入れる事が出来ました.メーターのブツはComponexの2LXとかいう物で,出品者の方によると,TASCAMのオープンリールデッキから外した中古品だそうです.4個がバラバラで出品されていたので,そのうち2個だけ入札して手に入れました.

実際の製作は,基板に部品のハンダ付けが済んでいるものだったので,ケーブルをつなげて終わり.エレキットのUSB-DACは出力がライン出力とヘッドホン出力の2つあり,両方に同時に出力できるので,ヘッドホン出力を真空管アンプに出して,ラインアウトから信号をもらってVUメーター用の基板に入力しました.


ただ,VUメーターの振れ幅は適当に調節しています.本物のVUメーターのレベルはWikipediaによると
インピーダンス600Ωの負荷回路へ1kHzの正弦波を加えて1mWの電力を消費したときの出力電圧を0dBmとし、+4dBmを0VUとする
となっており,0dBmの電圧は
$$\frac{\{E (V)\}^2}{600 (\Omega)} = 1 \times 10^{-3}(W)$$
より$E = \sqrt{0.6} = 0.775 (V)$ (よって0VUの電圧が1.228V)なのですが,Mac側でUSB出力をボリューム調整できるんで,適正なラインレベルが出てるのかよく分からないし,インピーダンスもよく分からないので,結局適当です.この基板を使っていると,入力が30mVから10Vまで調節できるとの事なので,適当に針がよく振れるように調整してみました...どうも左右の針の振れ幅が違うみたい.中古品だからか?

ともかく,真空管とVUメーターで,見た目だけはアナログチックになってきました.ただ,基板むき出しのままで置いてあるので,いい加減ケース買って来て入れなきゃ.

2014年5月29日木曜日

エレキットUSB-DACの製作

真空管アンプを買った日に寄り道して買っておいた,エレキットのUSB-DACを作ってみました.

セルフパワーにするための追加部品は全て手元にあったので,初めからセルフパワーで作製.最初電源をつないでも,パソコンから認識されない!パイロットランプも無いので,電源が来ているかも不明!最初はキット通りに作るべきだったかと,あせりました.

テスターを持ち出してセルフパワーの電源周りを確認してみたところ,DCジャックの配線を間違っていました.DCプラグを差し込むと−側でつながっている2つの端子って離れて,片方だけが−になるのね.久しぶりなので,すっかり忘れていました.

ハンダ付けをやり直したところ,今度は大丈夫.

秋月のUSB-DACと2台,両方とも動きました.


このキットはオペアンプの交換ができたりするので,もう少しいじくれそうです.

2014年5月28日水曜日

秋月電子USB-DACおよびローパスフィルタの製作

秋月電子のUSB-DACキットローパスフィルタを組み込んで,実際に作ってみました.

ローパスフィルタは,ぺるけさんのページにある数値を参考にし,手元にあった部品で自分で再計算(ローパスフィルタのみの場合と,その前段のハイパス(DCカット)フィルタも含めた場合)してシミュレーションしています.ローパスフィルタの効きが分かるように,フィルタなしの回路とフィルタありの回路を切り替えられるようにしました.

あまり配置を考えずに配線してしまいましたが,とりあえず音が出ました.


次のオシロの写真は無音入力時の波形(上の黄色)とFFT(下の赤色)です.波形は縦軸が1ブロックあたり10mV,横軸は4msです.FFTの横軸は1ブロックあたり12.5kHz,縦軸は10dBVです.

次のオシロの写真は,ローパスフィルタを挟んだときの波形(青色)とFFT(赤色)です.

FFTでざっと-10dBVぐらいの差が出ています.電圧比で$1/\sqrt{10}$倍に減ったことになります.波形を見ても明らかにノイズは減っているようなので,ローパスフィルタの効き目はあったようです.

現在のところ,裸のままでタミヤのプラスチック基板にねじ止めしているだけなので,そのうち,ちゃんとしたケースに入れようと思います.


2014年5月25日日曜日

秋月電子USB-DAC用ローパスフィルタの設計(その2)

秋月電子USB-DAC用ローパスフィルタの設計」で,外付けのローパスフィルタに使う抵抗の抵抗値,コンデンサの容量を確認したのですが,元のページでは,さらに回路の出口のすぐ外に10kΩが追加されており,これが回路の出口に直列で付いている47μFの電解コンデンサにたまった電荷を放出するためとの事です.

その結果,電解コンデンサから先の回路は下記の回路のようになっています.
ここで,オレンジで囲まれている部分が,元々のキットに含まれている部分です.この部分まで含めて回路図を描くと
  • ハイパスフィルタ(47μF + 10kΩ)
  • ローパスフィルタ(100Ω + 0.022μF)
  • ローパスフィルタ(330Ω + 0.0047μF)
の3段のフィルタになります.以下では,1段目のハイパスフィルタの周波数特性,3段まとめてのフィルタの特性を計算してみます.

まず,1段目だけのハイパスフィルタの周波数特性を計算します.下図のように変数を定義します.抵抗の抵抗値を$R_0$,コンデンサの容量を$C_0$,入力電圧を$v_i(t)$,出力電圧を$v_2(t)$,コンデンサに流れる電流を$i_1(t)$,コンデンサにかかる電圧を$v_{C_0}(t)$とします.
すると,抵抗に関する式
$$v_2(t) = R_0 i_1(t)$$
コンデンサに関する式
$$\frac{d v_{C_0}(t)}{dt} = \frac{1}{C_0}i_0(t)$$
電圧に関する式
$$v_i(t) = v_{C_0}(t) + v_2(t)$$
が成立します.これらの式から$i_0(t)$と$v_{C_0}(t)$を消すと
$$\frac{d^2}{dt^2}v_i(t) + \frac{1}{C_0R_0}\frac{dv_2(t)}{dt} + \frac{d^2}{dt^2}v_2(t)$$
となります.これをラプラス変換すると
$$V_i(s)s^2 = \frac{1}{C_0R_0}V_2(s)s + V_2(s)s^2$$
となるので,伝達関数は
$$G(s) = \frac{V_2(s)}{V_i(s)} = \frac{C_0R_0 s}{1 + C_0R_0 s}$$
となります.周波数特性は$s = j\omega$,$\omega = 2\pi f$を入れて絶対値を取る事で
$$|G(j\omega)| = \frac{C_0R_02\pi f}{\sqrt{1 + (C_0R_02\pi f)^2}}$$
となるので,dBに直すと
$$g = 20\log_{10}|G(j\omega)| = 20\log_{10}\frac{C_0R_02\pi f}{\sqrt{1 + (C_0R_02\pi f)^2}}$$
となります.

次に,3段まとめたフィルタの周波数特性を計算します.下図のように変数を定義します.抵抗の抵抗値をそれぞれ$R_0$,$R_1$,$R_2$,コンデンサの容量をそれぞれ$C_0$,$C_1$,$C_2$,コンデンサ$C_0$に流れる電流を$i_1(t)$,抵抗$R_0$に流れる電流を$i_r(t)$,抵抗$R_1$に流れる電流を$i_2(t)$,コンデンサ$C_1$に流れる電流を$i_c(t)$,抵抗$R_2$に流れる電流を$i_3(t)$,入力電圧を$v_i(t)$,抵抗$R_1$の手前の電位を$v_2(t)$,コンデンサ$C_0$にかかる電圧を$v_{C_0}(t)$,コンデンサ$C_1$にかかる電圧を$v_{C_1}(t)$,出力電圧を$v_o(t)$とします.


すると,電圧に関する式
$$v_i(t) = v_{C_0}(t) + v_2(t)$$
$$v_2(t) = R_0 i_r(t)$$
$$v_2(t) = R_1 i_2(t) + v_{C_1}(t)$$
$$v_{C_1}(t) = R_2 i_3(t) + v_o(t)$$
電流に関する式
$$i_1(t) = i_2(t) + i_r(t), \quad i_2(t) = i_3(t) + i_c(t),$$
コンデンサの充電に関する式
$$i_1(t) = C_0 \frac{dv_{C_0}(t)}{dt}, \quad i_c(t) = C_1 \frac{dv_{C_1}(t)}{dt}, \quad i_3(t) = C_2 \frac{dv_o(t)}{dt}$$
が得られます.

まず,$v_2(t)$から右だけを見ると,これは$v_2(t)$より左には依存しないので前回の計算と同じ形になり,この部分の伝達関数の逆数は
$$\frac{V_2(s)}{V_o(s)} = (R_1C_1s + 1)(R_2C_2s+1) + R_1C_2s$$
となります.

$v_2(t)$より左については,上のハイパスフィルタとは微妙に式が違う($i_1(t)$が$i_2(t)$と$i_r(t)$に分かれて,電流$i_2(t)$が$v_2(t)$以降の回路に流れ込む)ので,上の式からうまく$i_2(t)$を消して$v_2(t)$を残すようにすると,

$$\frac{d^2}{dt^2}v_i(t) = \frac{C_1 + C_2}{C_0} \frac{d^2}{dt^2} v_o(t) + \frac{C_1C_2R_2}{C_0} \frac{d^3}{dt^3} v_o(t) + \frac{1}{C_0R_0} \frac{d}{dt}v_2(t) + \frac{d^2}{dt^2} v_2(t)$$
が得られます.ラプラス変換すると
$$V_i(s)s^2 = \frac{C_1 + C_2}{C_0} V_o(s)s^2 + \frac{C_1C_2R_2}{C_0} V_o(s)s^3 + \frac{1}{C_0R_0} V_2(s)s + V_2(s)s^2$$
となります.すると,全体の伝達関数の逆数は
$$\frac{V_i(s)}{V_o(s)} = \frac{C_1 + C_2}{C_0} + \frac{C_1C_2R_2}{C_0}s + (\frac{1}{C_0R_0s} + 1)\frac{V_2(s)}{V_o(s)} = \frac{C_1 + C_2}{C_0} + \frac{C_1C_2R_2}{C_0}s + (\frac{1}{C_0R_0s} + 1)\{ (C_1R_1s + 1)(C_2R_2s + 1) + R_1C_2 s\}$$
となります.$s = j\omega$を代入し,複素数としての絶対値を取り,さらに$\omega = 2\pi f$を代入すると,最終的な周波数特性は
$$g = 20\log_{10} |G(j\omega)| = 20\log_{10} \frac{C_0R_02\pi f}{\sqrt{(C_1R_0 + C_2R_0 + C_1R_1 + C_2R_2 + C_2R_1 + C_0R_0 - C_0C_1C_2R_0R_1R_2(2\pi f)^2)^2 (2\pi f)^2 + \{ 1 - ( C_1C_2R_1R_2 + C_1C_2R_0R_2 + C_0C_1R_0R_1 + C_0C_2R_0R_2 + C_0C_2R_1R_2)(2\pi f)^2\}^2}}$$
となります.

以上の2つの式に以下のパラメータを代入してgnuplotでプロットします.
  • $C_0 = 47 \times 10^{-6}$,$R_0 = 10 \times 10^3$
  • $R_1 = 100$,$C_1 = 0.022 \times 10^{-6}$
  • $R_2 = 330$,$C_2 = 0.0047 \times 10^{-6}$

gnuplotに食わせるスクリプトは以下のようになります.
set logscale x
set xrange [0.1:1000000]
set xlabel 'Hz'
set ylabel 'dB'

f(r0, c0, f) = 20 * log10(c0 * r0 * 2 * 3.1415 * f) - 10 * log10((2 * 3.1415 * r0 * c0 * f)**2 + 1)

g(r0, c0, r1, c1, r2, c2, f) = 20 * log10(c0 * r0 * 2 * 3.1415 * f) - 10 * log10((c1*r0 + c2*r0 + c1*r1 + c2*r2 + c2*r1 + c0*r0 - c0*c1*c2*r0*r1*r2*(2 * 3.1415 * f)**2)**2 * (2 * 3.1415 * f)**2 + (1 - (c1*c2*r1*r2 + c1*c2*r0*r2 + c0*c1*r0*r1 + c0*c2*r0*r2 + c0*c2*r1*r2)*(2 * 3.1415 * f)**2)**2  )

set term pdf
set output 'HighPass-47uF-10kohm-0.1Hz-1MHz.pdf'

plot f(10e3, 47e-6, x) title '47uF, 10kohm'

set term png
set output 'HighPass-47uF-10kohm-0.1Hz-1MHz.png'
replot

set term pdf
set output 'HighPass-47uF-10kohm+LowPass-100ohm-0.022uF-330ohm-0.0047uF-0.1Hz-1MHz.pdf'

plot g(10e3, 47e-6, 100, 0.022e-6, 330, 0.0047e-6, x) title '47uf, 10kohm + 100ohm, 0.022uF + 330ohm, 0.0047uF'

set term png
set output 'HighPass-47uF-10kohm+LowPass-100ohm-0.022uF-330ohm-0.0047uF-0.1Hz-1MHz.png'
replot

結果のグラフは以下のようになりました. まず,最初のハイパスフィルタだけの周波数特性です.
次がハイパスフィルタと2段のローパスフィルタ全体の周波数特性です.

ちょっとすごい式になりましたが,プロットしてみると,きちんと計算できてそうに見えます.

2014年5月24日土曜日

秋月電子USB-DAC用ローパスフィルタの設計

真空管アンプにはMac miniのヘッドフォン端子から音を入れているのですが,最近USB-DACが流行っているみたいなので,一番安い秋月電子のUSB-DACを買いました.

エレキットのUSB-DACだと,出力にオペアンプが入っていたりするのですが,秋月電子のキットはD/A変換した信号がそのまま出力されているので,色々と回路を追加した改造例があるようです.その中で,ぺるけさんのページhttp://www.op316.com/tubes/lpcd/aki-dac.htmに,ローパスフィルタを付ける話があったので,やってみることにしました.

ここで一つ問題が.ここに載っていた抵抗値は100Ωと390Ωまたは82Ωと330Ωだったのですが,手元にあった抵抗が100Ωと330Ωなので,どっちの組み合わせでもありません.

折角なので,100Ωと330Ωの組み合わせでも問題ないかどうか自分で計算してみました.あと,100Ω-0.022uFと330Ω-0.0047uFのそれぞれ単体で,どの程度のフィルタ特性になるかも確認します.計算をフォローするWebページが無かったので,教科書「演習で学ぶ基礎制御工学」を取り出して,改めて問題を解いてみます.

まず以下のような1段だけの場合,入力電圧を$v_i(t)$,出力電圧を$v_o(t)$,抵抗値を$R_1$,コンデンサの容量を$C_1$,抵抗に流れる電流を$i_1(t)$とします.
すると,電圧の式として
$$R_1 i_1(t) + v_o(t) = v_i(t)$$
が出ます.また,コンデンサの充電の式として
$$v_o(t) = \frac{1}{C_1} \int_0^t i_1(\tau)\, d\tau$$
が出ます.2番目の式を$t$で微分すると
$$\frac{d v_o(t)}{dt} = \frac{1}{C_1} i_1(t)$$
となるので,これを最初の式に代入すると
$$R_1C_1\frac{d v_o(t)}{dt} + v_o(t) = v_i(t)$$
となります.電圧の初期値を$0$としてラプラス変換すると
$$R_1C_1 s V_o(s) + V_o(s) = V_i(s)$$
となるので,この回路の伝達関数は
$$G(s) = \frac{V_o(s)}{V_i(s)} = \frac{1}{R_1C_1 s + 1}$$
となります.ゲインは
$$|G(j\omega)| = \frac{1}{\sqrt{(R_1C_1\omega)^2 + 1}}$$
となるので,$\omega = 2\pi f$を代入すると,結局周波数特性は
$$g = 20\log_{10} |G(j \omega)| = 10 \log_{10}\frac{1}{(2\pi R_1C_1 f)^2 + 1}$$
となります.

次に,以下のように2段重ねた場合に,入力電圧を$v_i(t)$,1個目のコンデンサにかかる電圧を$v_c(t)$,出力電圧を$v_o(t)$,抵抗の抵抗値を$R_1$と$R_2$,コンデンサの容量を$C_1$と$C_2$,抵抗に流れる電流を$i_1(t)$と$i_2(t)$,$C_1$に流れる電流を$i_c(t)$とします.
コンデンサの充電の式が2個,
$$ i_c(t) = C_1 \frac{d v_c(t)}{dt}, \quad i_2(t) = C_2 \frac{d v_o(t)}{dt} $$
電流の式が1個,
$$i_1(t) = i_c(t) + i_2(t)$$
電圧の式が2個,
$$ R_1 i_1(t) + v_c(t) = v_i(t), \quad R_2 i_2(t) + v_o(t) = v_c(t)$$
出ます.
これらから電流を消すと
$$R_1( C_1\frac{d v_c(t)}{dt} + C_2 \frac{d v_o(t)}{dt} ) + v_c(t) = v_i(t)$$
および
$$ R_2 C_2 \frac{d v_o(t)}{dt} + v_o(t) = v_c(t)$$
が出ますので,全ての初期値を$0$にしてラプラス変換すると
$$R_1( C_1 V_c(s) s+ C_2 V_c(s) s) + V_c(s) = V_i(s)$$
および
$$R_2 C_2 V_o(s) s + V_o(s) = V_c(s)$$
が出ます.この2式から$V_c(s)$を消すと,結局
$$(R_1 C_1 s + 1)(R_2 C_2 s + 1)V_o(s) + R_1 C_2 s V_o(s) = V_i(s)$$
となり,伝達関数は
$$G(s) = \frac{V_o(s)}{V_i(s)} = \frac{1}{(R_1 C_1 s + 1)(R_2 C_2 s + 1) + R_1 C_2 s}$$
となります.ゲインは
$$|G(j\omega)| = \frac{1}{\sqrt{(R_1C_1+R_2C_2+R_1C_2)^2\omega^2 + (1-R_1C_1R_2C_2\omega^2)^2}}$$
となるので,$\omega = 2\pi f$を入れると,周波数特性は
\begin{align*}
g &= 20 \log_{10} |G(j\omega)|
\\
&= 10 \log_{10} \frac{1}{(R_1C_1+R_2C_2+R_1C_2)^2(2\pi f)^2 + (1-R_1C_1R_2C_2(2\pi f)^2)^2}
\end{align*}
となります.

以上の2つの式に下記のパラメータを代入してgnuplotでプロットしてみます.

  • 1段のフィルタ回路で$R_1 = 330$,$C_1 = 0.0047\times 10^{-6}$
  • 1段のフィルタ回路で$R_1 = 100$,$C_1 = 0.022\times 10^{-6}$
  • 2段のフィルタ回路で$R_1 = 82$,$C_1 = 0.022\times 10^{-6}$,$R_2 = 330$,$C_2 = 0.0047\times 10^{-6}$
  • 2段のフィルタ回路で$R_1 = 100$,$C_1 = 0.022\times 10^{-6}$,$R_2 = 330$,$C_2 = 0.0047\times 10^{-6}$
  • 2段のフィルタ回路で$R_1 = 100$,$C_1 = 0.022\times 10^{-6}$,$R_2 = 390$,$C_2 = 0.0047\times 10^{-6}$
  • 2段のフィルタ回路で$R_1 = 100$,$C_1 = 0.022\times 10^{-6}$,$R_2 = 430$,$C_2 = 0.0047\times 10^{-6}$

gnuplotに食わせるスクリプトはこんなかんじ.


set term pdf
set output 'LowPassFilter-100ohm-0.022uF-330ohm-0.0047uF-10Hz-1MHz.pdf'

set logscale x
set xrange [10:1000000]
set xlabel 'Hz'
set ylabel 'dB'

f(r1, c1, f) = 10 * log10(1/((2 * 3.1415 * r1 * c1 * f)**2 + 1))
g(r1, c1, r2, c2, f) = 10 * log10(1/( (r1*c1 + r2*c2 + r1 * c1)**2 * (2*3.1415 * f)**2 + (1 - r1*c1*r2*c2*(2*3.1415 * f)**2) ))

plot \
     f(330, 0.0047e-6, x) title '330ohm, 0.0047uF', \
     f(100, 0.022e-6, x) title '100ohm, 0.022uF', \
     g(82, 0.022e-6, 330, 0.0047e-6, x) title '82ohm, 0.022uF + 330ohm, 0.0047uF', \
     g(100, 0.022e-6, 330, 0.0047e-6, x) title '100ohm, 0.022uF + 330ohm, 0.0047uF', \
     g(100, 0.022e-6, 390, 0.0047e-6, x) title '100ohm, 0.022uF + 390ohm, 0.0047uF', \
     g(100, 0.022e-6, 430, 0.0047e-6, x) title '100ohm, 0.022uF + 430ohm, 0.0047uF'

set term png
set output 'LowPassFilter-100ohm-0.022uF-330ohm-0.0047uF-10Hz-1MHz.png'
replot

set xrange [1000:1000000]
set term pdf
set output 'LowPassFilter-100ohm-0.022uF-330ohm-0.0047uF-1kHz-1MHz.pdf'
replot

set term png
set output 'LowPassFilter-100ohm-0.022uF-330ohm-0.0047uF-1kHz-1MHz.png'
replot

  1. 10Hzから1MHzまでプロットした場合は以下のグラフになりました.
  2. 1kHzから1MHzまでプロットした場合は以下のグラフになりました.

結局,1段と2段ではローパスフィルタの効き目は結構違うこと,また,1段目の抵抗値を100Ωにしておけば,2段目の抵抗値 は330Ωでも390Ωでも430Ωでもあまり変わらないことが分かったので,手元にある100Ωと330Ωで下記のようなローパスフィルタ回路を組んでみる事にしました.


続きは「秋月電子USB-DAC用ローパスフィルタの設計(その2)」で.

2014年3月7日金曜日

BeagleBone BlackでCloud9 IDEからLEDチカチカ

ミニブレッドボードが Arduino で動いたので,本命の BeagleBone Black (BBB)で使ってみます.

BBBは,miniUSBにUSBケーブルを出してパソコンのUSBケーブルに差すと,まずUSB storageとして認識されて,HTMLファイルを開くと設定方法が見られます.


この間,裏ではUSB経由で電源が供給されて,内蔵のフラッシュメモリにインストールされているOS (AngstromというLinuxのディストリビューション)が起動しています.

この画面からUSB用のネットワークドライバをパソコンにインストールすると,パソコンとBBBとの間がIP networkでつながって,パソコン側のWebブラウザで
http://192.168.7.2/
に接続するとチュートリアルが見られるという.
これは簡単.

しかも,
http://192.168.7.2:3000/
では Cloud9 IDE なるJavaScriptの統合開発環境が動いており,Webブラウザ内でJavaScriptを書くとなんとLEDチカチカができるという.
早速やってみました.
Ethernetコネクタが上になるように置いたとき,右側の列にGPIOが集まっています.
ピン番号は,上から順に
P8_1, P8_2
P8_3, P8_4
...
...
P8_45, P8_46
と並んでいるらしい(左側の列がP9_1〜P9_46).P8_1とP8_2がGNDなので,
P8_1 → ブレッドボードのGND
P8_7 →ブレッドボード上のLED1のanode
P8_8 →ブレッドボード上のLED2のanode
P8_9 →ブレッドボード上のLED3のanode
P8_10 →ブレッドボード上のLED4のanode
と結線します.
次にCloud9 IDE上で新しくmyblink1.jsというファイルを作成し,下記のようにソースを書きます.
// myblink2.js
// 2014/3/6
// LED点灯のテスト
// P8_1, P8_2はGND

var b = require('bonescript');

var ledPin = ["P8_7", "P8_8", "P8_9", "P8_10"];
var ledPin2 = ["USR0", "USR1", "USR2", "USR3"];

for ( var i = 0; i < 4; i++ ) {
    b.pinMode(ledPin[i], b.OUTPUT);
    b.pinMode(ledPin2[i], b.OUTPUT);
}

for ( var i = 0; i < 4; i++ ) {
    b.digitalWrite( ledPin[i], b.HIGH );
    b.digitalWrite( ledPin2[i], b.HIGH );
}

setInterval(loop, 100);

var loopCount = 0;
function loop() {
    loopCount++;
    if ( loopCount > 3 )
        loopCount = 0;

    for ( var i = 0; i < 4; i++ ) {
        if ( i == loopCount ) {
            b.digitalWrite(ledPin[i], b.HIGH);
            b.digitalWrite(ledPin2[i], b.HIGH);
        } else {
            b.digitalWrite(ledPin[i], b.LOW);
            b.digitalWrite(ledPin2[i], b.LOW);
        }
    }
}
Cloud9 IDEのDebugボタンを押すだけでチカチカ.

できた!!!

ミソは,先頭の行に書く
var b = require("bonescript");
です.これで,
b.pinMode()
b.digitalWrite()
b.HIGH
b.LOW
などが使えるので,Arduinoのようにお気楽にプログラミング可能という話.ADC内蔵でanalog入力も7pin使えるみたいなので,いろいろできそう.

問題点1:
最初,入出力に使えるピン番号が分かりませんでした.(Ethernetコネクタを上にして置いたとき)右側の列の1行目はGNDなんだけど,2行目と3行目のpinが出力に使えない.

色々と探してみた所,出荷状態のBBBをそのまま使う場合は,
http://192.168.7.2/
に乗っているピン番号配置図のうち,ページの一番下にある「Black eMMC and HDMI pins」という物を見ないといけないらしい.on board eMMCとHDMIに使われている信号とピンが共有されているみたいです.

HDMIに信号出てるの?と思ってpsコマンドで確認してみたら,ちゃっかりX11が立ち上がっています.

問題点2:
何度か動かしているとすぐに動かなくなってしまい,ブラウザ側でreloadしたり,再起動をかけたりする必要がありました.

ここはArduinoと違って,まっとうなLinuxが走っているボード.
ssh root@192.168.7.2
とloginしちゃいます.ファイルを探すと,どうもCloud9 IDEで作成されたファイルは
/var/lib/cloud9/
の中に保存されるらしい./usr/bin/nodeというコマンドがあるので,直接shell promptから
node myblink1.js
とすることでも,LEDチカチカできます.

2014年3月4日火曜日

実験用のミニブレッドボード作成

しばらく実験を続けるので,実験用のミニブレットボードを作成してみました.


使った部品は以下のとおり.

  • LED 赤×2,緑×2,黄×2

  • タクトスイッチ×2



  •  集合抵抗 4素子5pin 一番左が共有で,右の各4端子に1kΩがつながってるタイプ

  • ブレッドボード,ジャンパワイヤ
赤と黄色のLEDはcathode側に集合抵抗をつなげて,1点でアースに落としておきます.
一方,緑のLEDは逆にanode側に集合抵抗をつなげて,1点を5Vにつなげています.

タクトスイッチの配線は以下のようにします.スイッチがつながっていない状態だと5Vが,つなげるとLOWが出力されるように配線.

Arduinoにつないで,ちゃんと配線できているかテストします.
配線は以下のとおり,スイッチを8pinに,LEDを12pinに接続しています.
以下のようにスケッチを作成します.
// 2014/3/4
// LED_Button01

int LEDout = 12;
int BTNin = 8;

void setup() {
  pinMode( LEDout, OUTPUT );
  pinMode( BTNin, INPUT );
}

void loop() {
  // ボタンスイッチはpullupされているので,押されるとLOW
  if ( digitalRead( BTNin ) == LOW ) {
    digitalWrite( LEDout, HIGH );
    delay(1000);
    digitalWrite( LEDout, LOW );
    delay(200);
    digitalWrite( LEDout, HIGH );
    delay(200);
    digitalWrite( LEDout, LOW );
    delay(200);
    digitalWrite( LEDout, HIGH );
    delay(200);
    digitalWrite( LEDout, LOW );
  } else {
    digitalWrite( LEDout, LOW );
  }
}
スイッチを押すと,LEDがチカチカします.


ちゃんと動いたので,次はこのボードをBeagleBoneBlackのGPIOにつなげます.

2014年2月26日水曜日

AdafruitのGPSモジュール

AdafruitのGPSモジュールを購入しました.

購入したものは以下の3つ:
とりあえず,Adafruitのサイトに従ってテストしてみました.

アンテナを接続し,ブレッドボード経由でArduino UNOに接続.
  • PPS → LEDをつないでGNDに
  • VIN → Arduinoの5V出力に
  • GND → ArduinoのGNDに
  • RX → ArduinoのRX(pin 0)に
  • TX → ArduinoのTX(pin 1)に
このモジュールはPPS(pulse per second)が出るので,これを確認するためにLEDをつないでおきます.
0番ピンと1番ピンがシリアル通信としてUSBのI/Oと共有されているので,GPSモジュールのTXをArduinoのTXに,RXをRXにそれぞれつなげると,GPSモジュールからの出力がArduinoからのシリアル出力として,そのままUSBでパソコンに送られるので,パソコンで開いているArduino開発環境のシリアルモニタで表示されるという仕組み.

で,Arduinoのシリアルモニタに表示されるのが以下のようなNMEAデータです.
仕様はこちらを参照.

$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,102232.095,,,,,0,0,,,M,,M,,*44
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,102232.095,V,,,,,0.00,0.00,250214,,,N*41
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,102233.095,,,,,0,0,,,M,,M,,*45
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,102233.095,V,,,,,0.00,0.00,250214,,,N*40
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,102234.095,,,,,0,0,,,M,,M,,*42
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,02,31,,,42,25,,,23*79


$GPGGAの行にある102232.095というのが,UTCで10時22分32.095秒という時刻.20分くらい経つと,ちゃんとGPS衛星をつかまえて,以下のような表示に変わりました.

$GPRMC,104121.000,A,3519.5265,N,13927.1682,E,0.28,165.36,250214,,,A*6D
$GPVTG,165.36,T,,M,0.28,N,0.51,K,A*34
$GPGGA,104122.000,3519.5265,N,13927.1681,E,1,6,1.52,81.5,M,39.6,M,,*62
$GPGSA,A,3,23,25,29,31,16,32,,,,,,,1.74,1.52,0.85*02
$GPRMC,104122.000,A,3519.5265,N,13927.1681,E,0.33,165.36,250214,,,A*67
$GPVTG,165.36,T,,M,0.33,N,0.60,K,A*3C
$GPGGA,104123.000,3519.5265,N,13927.1680,E,1,6,1.52,81.5,M,39.6,M,,*62
$GPGSA,A,3,23,25,29,31,16,32,,,,,,,1.74,1.52,0.85*02
$GPGSV,3,1,12,31,72,027,31,29,40,052,18,16,29,262,24,14,28,170,*7C
$GPGSV,3,2,12,25,17,059,13,21,15,120,16,23,13,320,29,27,12,205,19*77
$GPGSV,3,3,12,32,09,250,22,20,01,283,,193,,,,34,,,*43
$GPRMC,104123.000,A,3519.5265,N,13927.1680,E,0.35,165.36,250214,,,A*61


この時点で10時41分23.000秒.PPSもちゃんと出力されているのが確認できます.



同じ行にある,3519.5265,Nと13927.1680,Eが位置のデータだそうです.
北緯35度19.5265分,東経139度27.1680分となります.google mapで表示するには単位変換が必要らしいので,下記のように計算.

北緯35度19.5265分 = 35 + (19.5265 /60) 度 = 35.3254 度
東経139度27.1680分 = 139 + (27.1680 / 60)度 = 139.4528 度

で,google mapを
http://maps.google.co.jp/maps?q=35.3254,139.4528&hl=ja
と呼び出すと,現在地が出ました.

しばらく取り込んだNMEAデータをファイルに保存してgoogle earthで表示した結果がこれ.
やはり結構ぶれてるみたいです.

今日はここまで.