正弦波を発振させる色々な電子回路|ウィーンブリッジ・クワドラチャ・ブリッジドT・コルピッツ

ウィーンブリッジ正弦波発振器 回路図 こちらがその回路図である。「OPアンプ回路の設計」を参考にさせてもらった。 発振周波数の計算 RとCの値によって発振周波数が次式で決定する。 $$f=\frac{1}{2πCR}$$ よって、この回路定数では約1kHz(1061Hz)で発振するようになっている。 解説 普通のウィーンブリッジ回路では、電源オン時に発振しないことがある。しかし、このダイオードを付け足した回路では確実に発振するようだ。もともとはフィラメント電球を使って発振を安定させていたようだ。しかし、フィラメント電球の消費電力は大きく、オペアンプにはミスマッチということで発振を安定させるための工夫が色々考え出された様子。ダイオード以外にもFETを使ったフィードバック制御で発振を安定させる回路も見つかった。 さて、ウィーンブリッジ回路は反転増幅回路の形である。その増幅率を2倍に設定しなければならないようだ。つまり、反転入力の10kΩと22kΩの比が大事である。これらの抵抗の値は、単純に手に入りやすい抵抗を選んだわけではなく、色々と実験した結果この値に決定した。 正弦波がキレイになるように、そして確実に発振するように最適値を選んだのがこれらの値である。数100Ω違うだけで波形や発振に影響が出るので、作るときは各自一度はブレッドボードで実験して調整して欲しい。もしかしたら、4558以外のオペアンプではキレイに発振しない可能性もありうる。 今回もモジュール化してブレッドボードで使いやすいようにしてみた。音響回路の実験ではとても重宝しそう。1kHzの他に、20Hzや20kHzの発振モジュールも作る予定。 出力波形 オシロスコープで出力を観察すると、このようにキレイな正弦波が確認できる。 クワドラチャ正弦波発振器 ウィーンブリッジ発振器では、出力信号がだんだん小さくなり発振が止まってしまいました。ウィーンブリッジ発振器で安定して発振させるには難しいようです。そこでもっと安定して発振するといわれる「クワドラチャ発振器」を作ってみることにしました。 クワドラチャ発振器は、デュアルオペアンプ1つで作ることができます。部品数は ウィーンブリッジ発振器 と大差ありませんので、これから作るのであればクワドラチャ発振器をおすすめします。 なお、この記事で紹介する回路は 「OPアンプ回路の設計」を参考に、私が単一電源で動くように改造 したものになります。 回路図 9V電池の単一電源で動かせるようになってます。 オペアンプのV+(8番)は9V電源に、V-(4番)はGND(仮装ではないGND)につないでください。 単一電源9V電池で動かす設計ですので、GNDと表現しているのは電池のマイナス極の意味になります。 オペアンプはNJM4558になってますが、TL072などでも構いません。 発振周波数の計算 ウィーンブリッジと同様に、 CとRを同じ値にそろえれば、発振周波数を簡単に設定できます。 発振周波数の計算は次のとおりです。 $$f=\frac{1}{2πCR}$$ 解説 この回路では、約1kHz(1061Hz)で発振するように設定しました。出力にボリューム抵抗を使って、出力の大きさを調整できるようにしてあります。 オペアンプの3番ピンから7番ピンにまたがっている160kΩ(10kΩ+150kΩ)の抵抗は、Rの値の10%くらいに調整するとキレイに発振するようです。 オペアンプの7番ピンからは、位相が90度ズレた余弦波(cos波)も得られます。興味のある方はやってみましょう。 回路の組み立て ブレッドボードで扱いやすいようにするため、基板を作ってクワドラチャ発振器モジュールを作ってみました。 出力波形 クワドラチャ発振器を動かして、出力波形を観察してみました。このようにキレイなサイン波が得られました。 わずかですが下側がクリップしてましたので、3番ピンから7番ピンの抵抗を160kΩから157kΩに変更しました。ここらへんは各自で微調整してみてください。 出力の可変抵抗を調整して、1Vppにすると低周波回路実験で使いやすいです。 ブリッジドT型正弦波発振器 回路図 ブリッジドT型のノッチフィルタを利用した正弦波発振回路である。今まで作ってきたウィーンブリッジやクワドラチャ発振器よりも簡単に作れる回路である。 回路図の、R2を10kΩあたりの半固定抵抗にしてキレイな正弦波になるところで固定する(それ以外の値だと、歪んだ正弦波になってしまう)。この場合だと丁度2kΩでキレイな正弦波が観察された。オシロスコープのメモリから周波数は大体500Hzと読み取れる。 発振周波数の計算 理論上の発振周波数は、ノッチフィルタと同様に次式で計算可能である。 $$f=\frac{1}{2π\sqrt{\frac{R_1}{R_2}}CR_2}$$ 回路図の定数を上の式に当てはめて計算すると、発振周波数は520Hzとなりオシロスコープで観察した周波数と大体一致する。 出力波形 出力インピーダンスはそれほど高くなく、10kΩ以上の負荷で使用すること。心配ならば後段にバッファー回路を設けた方が良い。 他にも似たような発振回路としてツインT型発振回路がある。同じようにキレイな正弦波が得られるが、ブリッジドT型よりも部品数が若干多くなるため、どうせ作るならこちらの方が良いだろう。 ブリッジドT型ノッチフィルタは他にもバンドパスフィルタにもなって何かと便利な回路である。 コルピッツ正弦波発振器 コイルとコンデンサを使ったコルピッツ発振器を紹介する。 オペアンプを使った回路図 エフェクターなどの低周波回路でコイルを使うとすると、コイルの大きさがデカくなってしまいなかなか出番がないが、高周波回路ではコイルが大活躍できる。今回は可聴音域以上の100kHzあたりで発振するオシレータを作ってみた。こちらが今回オペアンプで作ったコルピッツ発振回路である。 解説 9Vの単一電源で動作させる想定。バイアス電位は、電源を抵抗分割で作った4.5Vに繋ぐ。 回路図から分かる通り、反転増幅回路となっている。R2をR1より大きくすることで、増幅率が1以上となり発振する。増幅率をわざと大きくすれば矩形波を作ることも可能。 キレイな正弦波になるように、R3を調節して100Ωと決めた。R3を0Ωにすると、消費電流が2mAも上がり、オペアンプに負荷がかかっている様子。逆に大きくしすぎると発振しない。ここら辺はLCの値や使うオペアンプによっても変わってくるため、実験しながら決めた方が良いだろう。10Ω単位で波形の歪みが大きく変わるので要注意だ。 また、確実に発振させるためには、C2はC1より大きくした方が良いようだ。LとCの大きさの組み合わせによっては発振しなかったりするのでとにかく試行錯誤するしかない。 今回は、何かの部品取りで残っていた68μHのコイルを基準にし、100kHz〜200kHz以内の発振に収めたかったためこのような定数となった。 ...

公開: 2021年2月13日 · 更新: 2026年3月25日 · Toshihiko Arai
伝達関数から周波数応答(周波数振幅特性と周波数位相特性)

伝達関数から周波数応答(周波数振幅特性と周波数位相特性)

はじめに 前回の記事では、RCローパスフィルタの伝達関数を計算し、ステップ応答を調べるところまでを行なった。今回はその続きとして、RCローパスフィルタの伝達関数を使って周波数応答(周波数振幅特性と周波数位相特性)を調べてみよう。 Pythonで伝達関数などを扱うにあたっては、こちらの書籍を大いに参考させてもらった。計算が複雑になりがちな制御工学の伝達関数なども、Pythonでらくらくシミュレーションできるようになるのでおすすめだ。 ステップ応答やインパルス応答などの過渡応答特性は時間関数f(t)の形であるが、周波数特性の場合は、$s$の代わりに$jω$となる。jは虚数($j^2 = -1$)であり、ωは角周波数である$ω=2πf$。 実は伝達関数$G(s)$の代わりに$G(jω)$とすることで周波数振幅特性を調べることができる。また、$arg(G(jω))$とすることで周波数位相特性を調べることができる。 周波数振幅特性とは、さまざまな周波数の正弦波をシステムへ入力にした時、どの程度の振幅で出力されるか調べたもの である。たとえばシステムが単純なローパスフィルタなら、高周波になるほど出力は小さくるだろう。 また、 周波数位相特性とは、さまざまな周波数の正弦波をシステムへ入力にした時、どの程度の入力の位相とずれているかを調べたもの である。 これらのことが$G(jω)$や$arg(G(jω))$で調べられるわけだが、なぜ$s=jω$とするのかの理由はフーリエ変換やオイラーの公式を使って説明されるため非常に難しので本記事では省略する。しかし、 理屈を知らなくても伝達関数さえ分かっていれば簡単に周波数特性を調べられるので、本記事ではとにかく実践を大事に周波数応答の実験をしてみたいと思う。 具体的にはPythonでプログラミングして周波数特性をグラフ化していく。 周波数応答 さて、RCローパスフィルタの伝達関数は次の通りであった。 $$G(s)=\frac{1}{1+RCs}$$ よって、周波数振幅特性を調べるためには $$G(jω)=\frac{1}{1+jωRC}$$ とすれば良いことになる。 また、周波数位相特性を調べるためには$arg(G(jω))$であった。argとは複素数平面上での偏角のことである。 さて、$ω=2πf$であるので調べたい周波数$f$を変えて計算すれば良いわけだが、周波数は膨大にあるため手動で計算するのはほぼ不可能だ。そこでPythonを使って周波数応答をグラフ化していく。 次のプログラムは抵抗R=1kΩ、コンデンサの容量を1μF、入力のサイン波の電圧を1としたときの周波数応答をグラフ化させるプログラムである。 from control.matlab import * import matplotlib.pyplot as plt if __name__ == '__main__': R = 1 * pow(10, 3) # 1kΩ C = 1 * pow(10, -6) # 1μF K = 1 # ゲイン T = R * C # 時定数 G = tf([0, K], [T, 1]) # 伝達関数 W = logspace(1, 5) # 対数スケールの配列 gain, phase, w = bode(G, W, Hz=True) plt.show() このプログラムを実行すると、図のように周波数振幅特性(上)と周波数位相特性(下)が表示される。システムはローパスフィルタなので、周波数が高くなるにつれてゲインが下っていく。また、周波数が高くなるにつれて入力との位相ズレが出力にあらわれていく。 プログラムの説明 ここで、先ほどのプログラムをもう少し詳しく解説する。 ...

公開: 2021年1月22日 · 更新: 2026年3月25日 · Toshihiko Arai

伝達関数とインパルス応答(Python)

はじめに インパルス応答は身近なところで日常的に使っている。電車のレールや機械をハンマーで叩いて音の反響を聞き取る打音検査、これはインパルス応答で異常がないか調べているわけだ。そしてこのインパルス応答をラプラス変換したものが伝達関数である。この記事ではそんな伝達関数とインパルス応答について詳しく解説していく。 伝達関数とは 伝達関数とは、複素数領域sにおいてシステムに(X(s))を入力したときの出力(Y(s))との比である。つまり、伝達関数を(G(s))とすれば次の式で表される。 $$G(s)=\frac{Y(s)}{X(s)}$$ 具体的にRCローパスフィルタ回路の伝達関数をラプラス変換を使って導き出してみよう。 RCローパスフィルタの伝達関数 時間領域tにおいては、回路図より次の式が成り立つ。 $$v_{in}(t)=Ri(i)+v_{out}(t),~~~i(t)=C\frac{dv_{out}(t)}{dt}$$ よって $$v_{in}(t)=RC\frac{dv_{out}(t)}{dt}+V{out(t)}$$ である。これをラプラス変換して複素数領域sへ書き換えると $$V_{in}(s)=RC(sV_{out} - v_{out}(0)) + V_{out}(s)$$ (t=0) のとき (v_{out}=0) とすれば、 $$V_{in}(s)=RCsV_{out} + V_{out}(s)$$ よって、RCローパスフィルタの伝達関数 (G(s)) は $$G(s)=\frac{V_{out}(s)}{V_{in}(s)}=\frac{1}{1+RCs}$$ である。 ここで(V_{in}=1)となる入力を与えたときの過渡応答が伝達関数(G(s))である。複素数領域sで1となる関数はインパルス関数 (δ(t)) である。つまりインパルス応答をラプラス変換したものが伝達関数である。 $$G(s)=\mathcal{L}[δ(t)]$$ インパルス関数とは インパルス関数とは、時間幅が無限小で高さが無限大のパルス信号である。またすべての時間領域において、積分値が1となる。数学ではディラックのデルタ関数、制御工学ではインパルス関数と呼ばれる。 $$δ(t)=\begin{cases}\infty~(t=0)\0~~~(t\neq0)\end{cases}$$ 実は、インパルス関数はさまざまな周波数の余弦波を足し合わせることによって作り出すことができる。つまり、すべての周波数成分を含んだ信号と考えることができるのだ。 Pythonでインパルス関数を作ってみよう! 図の左側が、1Hzkから11Hzまでの余弦波を1Hz間隔で足し合わせたものである。右側が1Hzkから10001Hzまでの余弦波を1Hz間隔で足し合わせたもである。 import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots() ax.grid(ls=':') if __name__ == '__main__': F1 = np.arange(1, 11, 1) F2 = np.arange(1, 10001, 1) T = np.arange(-1, 1, 0.001) Y1 = [0]*len(T) Y2 = [0]*len(T) for f in F1: for i in range(len(T)): Y1[i] += np.cos(2 * np.pi * f * T[i]) for f in F2: for i in range(len(T)): Y2[i] += np.cos(2 * np.pi * f * T[i]) plt.plot(T, Y1, label='{} times'.format(len(F1))) #plt.plot(T, Y2, label='{} times'.format(len(F2))) plt.legend() plt.show() ...

公開: 2021年1月21日 · 更新: 2026年3月25日 · Toshihiko Arai

RCローパスフィルタのステップ応答

はじめに この記事では、ステップ入力によるRCローパスフィルタの過渡応答を計算していく。 上の回路図のように抵抗Rと静電容量Cのコンデンサでローパスフィルタを組む。そしてこの回路に(Eu(t))のステップ電圧を入力した時の出力電圧の様子を調べていく。 ステップ入力によるRCローパスフィルタの過渡応答 ステップ電圧は、(t \geqq 0)で電圧が(E)ボルトとなるような信号のことである。ちょうど(t=0)で、電圧のスイッチをオンにしたと思ってもらえれば良い。 また、出力電圧はコンデンサの両端の電圧(V_c)である。 ここで電圧(V_c)は $$V_c(t)=\frac{q(t)}{C} \tag{1}$$ である。 また、out端子につながる機材はハイインピーダンスであると考えて、電流はoutへほとんど流れないものとする。するとコンデンサに蓄えられる電気量の変化量が回路へ流れる電流と考えることができるので $$\frac{dq(t)}{dt}=I(t) \tag{2}$$ である。よって、 $$q(t)=\int I(t)dt \tag{3}$$ となる。 式3を式1へ代入すると $$V_c(t)=\frac{1}{C}\int I(t)dt \tag{4}$$ が導き出される。 さて、ラプラス変換により電流(I(t))は次の通り導き出される。 $$I(t)=\frac{E}{R}e^{-\frac{1}{CR}t} \tag{5}$$ 式5を式4に代入すると $$V_c(t)=\frac{1}{C}\int \frac{E}{R}e^{-\frac{1}{CR}t} dt \tag{6}$$ である。 Tip 指数関数の積分は次の通り(ただしDは積分定数)。 $$\int e^{kx}dx = \frac{1}{k}e^{kx}+D \tag{7}$$ 式7より式6は、 $$V_c(t)=\frac{E}{CR}(\frac{1}{-\frac{1}{CR}}e^{-\frac{1}{CR}t} + D) \tag{8}$$ $$V_c(t)=-Ee^{-\frac{1}{CR}t}+\frac{E}{CR}D \tag{9}$$ となる。 (\frac{E}{CR}D)は定数なのでまとめてDと置き換えてしまう。すると式9は、 $$V_c(t)=-Ee^{-\frac{1}{CR}t}+D \tag{10}$$ となる。 ここでDについて考えてみよう。(t=0)の時、コンデンサの電圧は0Vであるから $$V_c(0)=-Ee^{-\frac{1}{CR}0}+D=0 \tag{11}$$ である。よって、 $$D=E \tag{12}$$ である。 式12を式10へ代入すれば $$V_c(t)=-Ee^{-\frac{1}{CR}t}+E \tag{13}$$ となり、 $$V_c(t)=E(1 - e^{-\frac{1}{CR}t}) \tag{14}$$ となる。これがRCローパスフィルタにステップ入力したときの過渡応答である。 プログラミングでシミュレーション せっかくなので式14をPythonでプログラミングしてプロットしてみよう。前回と同様に、Eを5V、Rを1kΩ、Cを1μFとしてシミュレーションしてみた。 ...

公開: 2021年1月20日 · 更新: 2026年3月25日 · Toshihiko Arai
はじめてのラプラス変換

はじめてのラプラス変換

はじめに この記事では、ラプラス変換の理屈は分からなくてもラプラス変換をとにかく使ってみようというテーマでお届けする。 電子回路に慣れ親しんでいる方なら、オペアンプの中身や仕組みが分からなくてもオペアンプを使うことはできるだろう。ラプラス変換も一緒で、 ラプラス変換そのものの理屈は分からなくても、ラプラス変換を扱うことは高校生レベルの数学で可能なので安心を! ラプラス変換といえば制御工学で学ぶと思うが、教科書ではラプラス変換の仕組みから説明が入り、実際ラプラス変換のご利益に触れないまま工学分野を嫌いになってしまう方も多いのではないだろうか?実は私もその一人だ。 しかし、ラプラス変換を実際に使ってみるとこれが非常に面白い。いままで諦めていた微分方程式などもすらすら解けるようになるのだ。だからラプラス変換を知らないのは非常にもったいない。もう一度言おう。 ラプラス変換することは高校生レベルの数学を学んでいれば誰でもできる。 そこでこの記事では、ラプラス変換の難しい説明をできるだけ省き、とにかく手を動かしてラプラス変換を使ってその利便性に触れることを目的として進めていく。 ラプラス変換とは ラプラス変換をとにかく使ってみよう! とはいえ、使う上で大体のイメージは必要である。 ラプラス変換とは、時間領域tの関数を複素数領域sへと置き換えて、微分・積分などの演算を簡単にするための手法である。 さっそく、複素数領域だとかなんのこっちゃ分からないかもしれないが、 大事なのは、微積分の面倒な計算を足し算に置き換えてくれる超便利なツールであるということ。 複素数が分からなくてもラプラス変換は使えるので安心してもらって良い。 実は、電気回路や制御工学などでは解に微分・積分が多く含まれてしまうため、ラプラス変換することで足し算・割り算レベルの簡単な数式に置き換えられるメリットがあるのだ。 しかも、ラプラス変換はすでに用意されている変換表と照らし合わせて変換すれば良いだけなので何も難しいことはない。 作業手順としては次のような流れになる。 時間関数 $f(t)$ を組み立てる ラプラス変換する s領域で計算する 逆ラプラス変換して再び時間領域tへ戻す ラプラス変換された関数は複素数領域の関数であるため、そのままでは現実世界に適応できない。そこで、再び時間領域へ戻すために逆ラプラス変換が必要である。しかしこの逆ラプラス変換というのも、変換表通りやれば高校生レベルでできる話なので安心して良い。 それでは、ラプラス変換対応表を見ていくことにしよう。 ラプラス変換対応表 下の表が、ラプラス変換対応表である。時間領域tの関数を複素数領域sへ置き換えることがラプラス変換である。sがなんのこっちゃ分からなくても、とにかく時間tをsの関数に置き換えるにはこの表に当てはめて変換すれば良い。 この表を使えば、複素数領域sから時間領域tへ置き換えること(逆ラプラス変換)も簡単にできる。 $$f(t)$$ $$F(s)$$ 説明 $$δ(t)$$ $$1$$ 単位インパルス関数 $$δ(t)=\begin{cases}\infty~(t=0)\0~~~(t\neq0)\end{cases}$$ $$u(t)$$ $$\frac{1}{s}$$ 単位ステップ関数 $$u(t)=\begin{cases} 0~(t \lt 0) \ 1~(t \geqq 0) \end{cases}$$ $$e^{-at}$$ $$\frac{1}{s+a}$$ 指数関数 $$sin(ωt)$$ $$\frac{ω}{s^2+ω^2}$$ 三角関数(正弦) $$cos(ωt)$$ $$\frac{s}{s^2+ω^2}$$ 三角関数(余弦) $$f’(x)$$ $$sF(s)-f(0)$$ 微分 $$f’’(x)$$ $$s^2F(s)-sf(0)-f’(0)$$ 二階微分 $$\int_0^tf(τ)dτ$$ $$\frac{1}{s}F(s)$$ 積分 この記事では、上記の表の単位ステップ関数 指数関数 積分だけを使うので、今これらの全部の変換を覚える必要はない。 ...

公開: 2021年1月19日 · 更新: 2026年3月25日 · Toshihiko Arai

デジタル信号におけるRCハイパスフィルタ

はじめに デジタル信号におけるRCハイパスフィルタは次の式となる。 $$y_i=ay_{i-1}+a(x_i-x_{i-1}) \tag{1}$$ なぜこの式がRCハイパスフィルタになるのか、ここで詳しく解説してみたいと思う。 基本的にローパスフィルタの記事で説明した方法と同じやり方でハイパスフィルタは導き出すことができる。 アナログ回路のRCハイパスフィルタ 電圧を分かりやすくするために最初の回路図を少し変形させた。 回路図より、 $$E_R(t)=I(t)R \tag{1}$$ である。 また、 $$q(t)=CE_C=C(E(t)-E_R(t)) \tag{2}$$ $$I(t)=\frac{dq(t)}{dt} \tag{3}$$ なので、式1は $$E_R(t)=\frac{dq(t)}{dt}R=C(\frac{dE(t)}{dt}-\frac{dE_R(t)}{dt})R\tag{4}$$ となる。よって出力電圧(E_R(t))は次式で導き出される。 $$E_R(t)=RC(\frac{dE(t)}{dt}-\frac{dE_R(t)}{dt})\tag{5}$$ 電圧をデジタルデータで考える ここで、電圧をサンプリングデータに置き換える。(E(t))を(x_i)とし、(E_R(t))を(y_i)とすると、式5は次のようになる。ただし、(ΔT)はサンプリング周期である。 $$y_i=RC(\frac{x_i-x_{i-1}}{ΔT}-\frac{y_i-y_{i-1}}{ΔT}) \tag{6}$$ さて、式6を(y_i)について解くと、 $$y_i=\frac{RC}{RC+ΔT}y_{i-1}+\frac{RC}{RC+ΔT}(x_i-x_{i-1})\tag{7}$$ となる。 ここで(a=\frac{RC}{RC+ΔT})に置き換えると、 $$y_i=ay_{i-1}+a(x_i-x_{i-1}) \tag{8}$$ となり、RCハイパスフィルタのデジタルフィルタ計算式が導き出された。 カットオフ周波数 最後にカットオフ周波数と(a)の関係を導き出してみよう。 係数(a)は、 $$a=\frac{RC}{RC+ΔT}\tag{9}$$ であった。 また、RC回路におけるカットオフ周波数(f_c)は次式で求められる。 $$f_c=\frac{1}{2πRC}\tag{10}$$ これを展開すると、 $$RC=\frac{1}{2πf_c}\tag{11}$$ となる。式11を式9へ代入して係数(a)について展開すれば、 $$a=\frac{1}{2πΔTf_c+1} \tag{12}$$ の関係となる。

公開: 2021年1月18日 · 更新: 2026年3月25日 · Toshihiko Arai

デジタル信号におけるRCローパスフィルタ

はじめに デジタル信号におけるRCローパスフィルタは次の式となる。 $$y_i=ax_i+(1-a)y_{i-1} \tag{1}$$ なぜこの式がRCローパスフィルタになるのか、ここで詳しく解説してみたいと思う。 アナログ回路のRCローパスフィルタ 話を分かりやすくするために、最初の回路図を少し変形させてみよう。 信号源を(E(t))とし、時間(t)によって信号の電圧は変化する。 抵抗(R)に流れる電流は(I(t))なので、抵抗の両端にかかる電圧は(RI(t))である。また、コンデンサの電圧は(Ec(t))とすると、(Ec(t)=\frac{q(t)}{C})が成り立つ。 よって、キルヒホッフの法則より、 $$E(t)=RI(t)+\frac{q(t)}{C} \tag{2}$$ となる。 また、ある時間における電流(I(t))はコンデンサの電気量(q)の変化量であるから $$I(t)=\frac{dq(t)}{dt} \tag{3}$$ で表せる。 ここでポイントなのは、図のOUT端子(抵抗とコンデンサの間)へ接続される負荷はハイインピーダンスであるため、出力端子へほとんど電流が流れていかないものとしている。 式3を式2へ代入すると、 $$E(t)=R\frac{dq(t)}{dt}+\frac{q(t)}{C}\tag{4}$$ となる。 コンデンサの電圧は(CE_c(t)=q(t))なので $$E_c(t)=\frac{q(t)}{C}\tag{5}$$ である。式5を式4へ代入すると、 $$RC\frac{dE_c(t)}{dt}+E_c(t)=E(t)\tag{6}$$ である。 電圧をデジタルデータで考える ここで、電圧をデジタルのサンプリングデータとして考えると(x_i=E(t))、(y_i=E_c(t))で置き換えることができる。 よって、式6は次のようになる。ただし(ΔT)はサンプリング周期である。 $$RC\frac{y_i-y_{i-1}}{ΔT}+y_i=x_i\tag{7}$$ これを(y_i)について解くと、 $$y_i=\frac{ΔT}{RC+ΔT}x_i+\frac{RC}{RC+ΔT}y_{i-1}\tag{8}$$ となる。 また、 $$\frac{RC}{RC+ΔT}=\frac{ΔT-ΔT+RC}{RC+ΔT}=\frac{RC+ΔT}{RC+ΔT}-\frac{ΔT}{RC+ΔT}$$ なので、ここで(a=\frac{ΔT}{RC+ΔT})とおけば、式8は $$y_i=ax_i+(1-a)y_{i-1}\tag{9}$$ となり、デジタル信号におけるRCローパスフィルタが導き出された。 カットオフ周波数 最後にカットオフ周波数と(a)の関係を導き出してみよう。 係数(a)は、 $$a=\frac{ΔT}{RC+ΔT}\tag{10}$$ であった。 また、RC回路におけるカットオフ周波数(f_c)は次式で求められる。 $$f_c=\frac{1}{2πRC}\tag{11}$$ これを展開すると、 $$RC=\frac{1}{2πf_c}\tag{12}$$ となる。式12を式10へ代入して計算すれば、 $$a=\frac{2πΔTf_c}{2πΔTf_c+1}\tag{13}$$ の関係が導き出される。

公開: 2021年1月16日 · 更新: 2026年3月25日 · Toshihiko Arai

【Arduino】時定数によるコンデンサの静電容量測定

Arduinoで静電容量の測定する方法 Arduinoなどのマイコンボードでコンデンサの静電容量を測定するには、次の2つの方法が考えられます。 発振回路と組み合わせる コンデンサの時定数を利用する ここでは❷の「コンデンサの時定数を利用する」方法でコンデンサの静電容量を測定します。 時定数とは 時定数とは、コンデンサCに、E[V]の電圧を、抵抗R[Ω]の抵抗を介してかけた時、 コンデンサCの電圧がEの63.2%まで充電される時間 のことです。 つまり、 コンデンサの電圧が、電源電圧の63.2%になるまでの時間 が「時定数」です。 時定数をτとすると、抵抗値Rと静電容量Cは次の関係になることが知られてます。 $$τ = RC$$ 静電容量の算出 アナログ電圧を測れるピンを備えているArduinoでは、時定数を測ることは簡単です。 デジタルピンの5V電圧を、抵抗Rを介してコンデンサCへ充電します。コンデンサの電圧が、5Vの63.2%の電圧3.22Vになるまでの時間を計測すれば時定数が分かりますから、次の計算でコンデンサの静電容量を導き出すことができるはずです。 $$C = \frac{τ}{R}$$ Arduinoとコンデンサの配線図 こちらが、Arduinoでコンデンサを測定する配線図です。静電容量が未知なコンデンサCxと、抵抗RおよびArduinoを図のように配線します。 デジタルピンD2をHIGHにした瞬間、2MΩの抵抗を介して電流がコンデンサへ蓄電されていきます。コンデンサの両端の電圧は徐々に上がっていき、アナログ入力ピンのA5地点が、電源電圧の63.2%Vになるまで監視します。この時間を測定して時定数を導き出します。 ちなみに、デジタルピンD3と1kΩの抵抗は、コンデンサの電荷を放電してリセットさせるためのものです。 コンデンサの静電容量を測定するプログラム コンデンサの静電容量を測定するプログラムがこちらになります。 #include <Arduino.h> const int PULSE_PIN = 2; const int DIGITAL_READ_PIN = 3; const int ANALOG_READ_PIN = 5; const double E = 5.06; // GPIO電圧実測値 const double R = 2000000.0; // 2MΩ const double V = E * 0.632; void setup() { Serial.begin(9600); pinMode(PULSE_PIN, OUTPUT); digitalWrite(PULSE_PIN, LOW); } void discharge() { pinMode(DIGITAL_READ_PIN, OUTPUT); digitalWrite(DIGITAL_READ_PIN, LOW); delay(1000); pinMode(DIGITAL_READ_PIN, INPUT); delay(10); } unsigned long charge() { digitalWrite(PULSE_PIN, HIGH); return micros(); } void loop() { discharge(); unsigned long time_start = charge(); double volts = 0; while (volts < V) { volts = double(analogRead(ANALOG_READ_PIN)) / 1023.0 * E; } double T = micros() - time_start; // T: 時定数 double c; char *farad = "uF"; if (T < 2500) { c = T / R * 1000000; // pFに対応 farad = "pF"; } else if (T < 50000) { c = T / R * 1000; // nFに対応 farad = "nF"; } else { c = T / R; // uF } Serial.print(c); Serial.print(farad); Serial.println(); digitalWrite(PULSE_PIN, LOW); discharge(); } 実験してみた感想 実際、100pF〜10uFまで測定してみました。かなり良い精度でコンデンサの静電容量を測定することができたことに、正直驚きです。 ...

公開: 2021年1月12日 · 更新: 2026年4月26日 · Toshihiko Arai
【Raspberry Pi】ステップ応答による抵抗値の測定

【Raspberry Pi】ステップ応答による抵抗値の測定

はじめに この記事では、Raspberry Pi(ラズパイ)でステップ応答による抵抗値を測定する方法を解説していく。 Raspberry PiはArduinoのようなアナログ入力ピンが備えられていないため、抵抗値を測りたい場合に通常ADコンバータが必要。しかし、ADコンバータを使わなくても抵抗値を測定する方法がある。それがステップ応答による測定である。 この記事では最初にステップ応答の原理を詳わしく説明し、後半ではステップ応答による抵抗値を測定するプログラムの紹介をする。 ステップ応答による抵抗値の測定 ステップ応答による抵抗値の測定を説明していく。 まず、ステップ応答による抵抗値の測定ではコンデンサを使う。電荷が空の状態のコンデンサへ3.3Vの電圧をかける。そしてコンデンサが約1.65Vの電位(デジタルピンがHIGH)になるまでに掛かった時間を測ることで抵抗値の計算できる。 次からは回路図を使って説明していく。 抵抗値を測定する回路図 今回使用する回路は図のとおり。可変抵抗R_POTの抵抗値を測定する。 R1とR2は、Raspberry PiのGPIOへ過大な電流が流れ込まないようにするための保護抵抗である。話をわかりやすくするため、ここではいったん省略して説明する。また、R_POTも固定抵抗Rとして説明する。すると、次のようなシンプルな回路図になる。 {{#step-response-flow}} ステップ応答で測定する手順 これから簡略した回路図を使って、ステップ応答で測定する手順を説明していく。 手順は次の通り。 コンデンサを放電する コンデンサの電荷を空にする コンデンサへ充電するを開始する コンデンサの電位を1.65V以上にする ❶コンデンサを放電する はじめに、コンデンサの電荷をすべて放電しておく。そのため図のようにA点のGPIOを入力モードにし、B点のGPIOを出力モードに設定する。また、B点はLOWに設定しGNDと同じ電位にする。 A点は入力モードのためハイインピーダンスとなり、ほとんど電流は流れない。だから、コンデンサに溜まった電荷はB点を通して放電される。 ❷コンデンサの電荷を空にする コンデンサの電荷が空の状態、つまりコンデンサの電圧が0Vの状態にしておく。これで充電を開始する準備が整った。 ❸コンデンサへ充電を開始する コンデンサへ充電を開始すると同時に、この瞬間から時間の測定を行う。 コンデンサへ充電をするためには、A点のGPIOを出力モードにしHIGHの状態に設定する。また、B点のGPIOは入力モードに設定する。 A点はHIGHのため3.3Vの信号を出力する。B点はハイインピーダンスなので電流がほとんど流れない。よって、A点から電流が抵抗Rを通してコンデンサCへ充電されていく。Rの抵抗値が大きいほど充電に時間がかかり、抵抗値が小さいほど充電時間は短くなる。 ❹コンデンサの電位を1.65V以上にする コンデンサへ電荷が溜まっていくと、B点の電圧は上がっていく。そして約1.65Vを超えた瞬間、B点のデジタル入力はHIGHとなる。この時までに掛かった時間、つまりコンデンサの電圧が0Vから約1.65Vまで上がるのに掛かった時間をt秒とする。 RC直列回路における抵抗値Rを算出する計算式 RC直列回路における抵抗値Rを算出する計算式の説明をする。 ここでは、抵抗R[Ω]・コンデンサC[F]・直流電源E[V]とした。 コンデンサの電圧を時間関数Vc(t)[V]として経過時間t[s]を図で表すと次のようになる。 この時、コンデンサの電圧Vc(t)は次式で表される。つまり図の青い曲線のことである。 $$ v_c(t) = E(1 - e^{-\frac{1}{CR}{t}}) \tag1$$ この式をtで微分すると、青い曲線の傾きがわかる。微分した結果は次の通り。 $$ \frac{dVc(t)}{dt} = Et + \frac{E}{CR}e^{-\frac{1}{CR}t} \tag2$$ この式にt=0を代入すると次の式が導き出される。これが図の赤い直線の傾きである。 $$ V=\frac{E}{CR}t \tag3 $$ さて、0Vから1.65Vまではほぼ時間と比例してコンデンサの電圧は上昇していく。 つまり赤い線と青い線は1.65Vまでは同じ傾きだとみなせる。 だから式3を展開してRを求める事ができる。 $$ R = \frac{E}{CV}t \tag4$$ ...

公開: 2020年12月28日 · 更新: 2026年3月25日 · Toshihiko Arai
【Raspberry Pi】10日で作る!倒立振子ロボット

【Raspberry Pi】10日で作る!倒立振子ロボット

はじめに この記事では、Raspberry Piを使って10日ほどでつくった倒立振子ロボットのご紹介をします。 とあるきっかけで、夏休みの宿題のノリで倒立振子を作ってみることにしました。 倒立振子ロボットを作るには、 ジャイロセンサや加速度センサを駆使して、モータを制御し倒立させる 必要があります。しかし、予想通りといいますか、これがなかなか大変でした。結論からいってしまうと、 相補フィルタとPID制御で倒立振子の姿勢をコントロール させました。 そんな私の倒立振子ロボット製作の葛藤の記録をご紹介します。これから倒立振子の製作に挑戦するみなさんのご参考になれば幸いです。 倒立振子とは「とうりつしんし」と読みます。二輪で自立するロボットで、近年ではセグウェイやバランススクーターなど、移動手段のロボットにも応用されてます。 Raspberry Piの操作は、MacのターミナルからSSHでリモート操作します。また、これから紹介するプログラムはすべて、Python 2.xで動かしてます。Python 3.xをお使いの方は、各自で読み替えてください。m(_ _)m 千里の道もLチカから さっそく、モータでも動かしてみたいところですが、それを実現するための予備知識がまったくないので、まずは、 とても小さな一歩であるLチカ(LED点滅) から始めてみます。 gpiozeroライブラリのインストール Raspberry PiのデジタルピンでLEDを制御するために、gpiozeroライブラリを次のようにインストールしました。 $ sudo apt install python-gpiozero LEDとRaspberry Piの配線は、Raspberry Piの11番ピンにLEDのアノードを、そして200Ω〜1kΩくらいの抵抗を介してカソード側をGNDへ接続します。 シンプルなLチカプログラム 1秒おきに5回、LEDが点滅を繰り返すプログラム を書いてみました。 from gpiozero import LED from time import sleep led = LED(11) for t in range(0, 5): led.on() sleep(1) led.off() sleep(1) ホタルのようなLチカ 次にすこし発展させて、 正弦波でなめらかな、ホタルのようなLEDの点滅 をさせてみました。そのプログラムがこちら。 from gpiozero import PWMLED from time import sleep import numpy as np led = PWMLED(11) led.value = 0 for t in np.arange(0, 100*2*np.pi ,0.01): a = 0.5 * np.sin(t-np.pi/2) + 0.5 # print(a) led.value = a sleep(0.002) ▲ aの値を0〜1に正規化するため、また、プログラムスタート時の値を0からにするため、 $ 0.5 \times sin(t-\frac{π}{2}) + 0.5 $ としてます。 ...

公開: 2019年8月25日 · 更新: 2026年3月25日 · Toshihiko Arai