555タイマーのPWMを計算する話

  • 本記事は,学ロボAdvent Calendar 2022の12月23日分の記事となります.

adventar.org

初めまして.T-Semiのだたろうと申します. 最初は皆さんが書いた記事を興味深く読んでいただけだったのですが,とあるメンバーから「Advent Calendar書かない?」と言われ,気付いたら書き始めてました.

とはいえ皆さんツヨツヨなので,自分は「何かすごいことをやってる感」が出せるように頑張ります.
「すごいことをやってる感」を出すために後に式がたくさん出てきますが,簡単なところから話そうと思います.

今回はロボコンでよく使われるであろうPWM出力に関するお話をしたいと思います.


追記 (2023/5/31)
555タイマーを普通に使うときの計算を もう少し真面目に555タイマーの計算を説明してみる - だたろう’s diary に改めてまとめました.本記事はこれの延長と考えた方が良いかもしれません.


PWM出力って?

PWMは,パルス幅変調(Pulse Width Modulation)のこと.「パルス」は「短時間で急に変化する信号」,変調は「データを電気信号に変換すること」らしいです.
つまり信号をパルスの幅の変化として伝えるのがPWMってことです.矩形波のONとOFFの割合を変えようぜってこと.
1周期の中のONの割合のことをDuty比といいます.

1kHz,Duty比75%のPWM波形

このPWMはモーターの回転速度の制御やLEDの明るさの制御なんかに使われます.
高速でONとOFFを繰り返すことで平均的な電圧を変え,回転速度や明るさを制御しているってことですね.
夏日と冬日が一日おきに繰り返されたら平均的には秋,みたいなものです.
令和ちゃんはPWMで季節を操作してる,なんて噂があったりなかったり.

PWM信号を出力する方法

PWM信号を吐く方法はいくつかありますが,マイコンが一番よく使われるでしょうか.
プログラムを書き込むだけで好きな周波数,好きなDuty比で矩形波を出力できます.
マイコンは演算や通信もできるので,ロボット制御には必須でしょう.
そのほか,電子工作はじめの一歩としてたまに見かける非安定マルチバイブレータオペアンプの発振回路,ICなどで矩形波出力できます.

まぁ普通はマイコン使うべきなのでしょうが,ちょっと回路のテストをしたいだけなのにプログラムを毎回書き直したり,パソコンと繋ぐUSBケーブルが増えて取り回しがめんどくさくなったり,それなりにお値段するのでミスで破壊すると萎えたり・・・などと不都合を感じていました.(そういうことにします)  

というわけで,マイコンを使わずコーディングなしでPWM出力する方法を考えます.

ICでPWM出力

PWM出力ではDuty比を変えることが必要です.
周波数一定でDuty比を変える方法としては,三角波と基準電圧を比較する方法があります. 三角波は三角形の波の形をした波形で,ある基準電圧とこれをコンパレータを用いてどちらが電圧が高いかを比較します. 基準電圧を上下させることで,周波数を一定にしたままDuty比を変更することができます.

三角波とコンパレータを使用したPWM出力
三角波と基準電圧を比較することで,矩形波を出力
基準電圧を変えてDuty比を変える

この方法なら,PWM信号の周波数は三角波の周波数と一致し,Duty比は三角波に関するパラメータとは独立して決められます.
三角波を出力する方法としては,矩形波オペアンプ積分する方法でやってみました.

なんかミスってますね.真面目かつテキトーに計算したつもりだったのですが勉強不足です.

オペアンプを使った三角波生成はあきらめ,タイマーIC555を使って三角波を作ります.

タイマーIC555

タイマーIC555は,抵抗とコンデンサの充放電を使って矩形波を出したり,タイマーを作れたりするICです. これを選んだ理由は単に過去数回使ったことがあり,面白いICだと思っているからです. 今回はこれを非安定モード(矩形波を出力するモード)で使います. 非安定モードで動作させる最低限の回路はこんな感じでしょうか.

5番のCONTにノイズ対策でコンデンサをつけることがありますが,ここでは省略しています. あともしかしたら3番のOUTピンに何か負荷を接続しないといけないかもしれません.
このように接続すると3番のOUTピンから矩形波が出力され,その周波数とDuty比はR_1R_2C_1で決まります.
ですが今回はOUTからの出力は無視して,C_1の電圧波形に注目します.

コンデンサの電圧波形

上に乗せたような回路では,「コンデンサが電源電圧の2/3になるまでR_1R_2を通して充電」と「コンデンサが電源電圧の1/3になるまでR_2を通して放電」を繰り返します.
(コンデンサが充電されている間OUTがHighに,放電されている間OUTがLowになります.)
なのでコンデンサの電圧波形を求めるには,CRの充放電回路を考えればいいわけです.

充電

電源電圧をV[V]、コンデンサの静電容量をC[F]、流れる電流をi[A]、コンデンサにたまった電荷Q[C]とすると,次の式が成り立ちます.

 \displaystyle
V = (R_1 + R_2)i + \frac{Q}{C}

電流は単位時間あたりに流れる電荷なので

 \displaystyle
i = \frac{dQ}{dt}

よって

 \displaystyle
V = (R_1 + R_2)\frac{dQ}{dt} + \frac{Q}{C}

この微分方程式を解いて,初期条件Q(0)=\frac{1}{3}CVを用いると,

 \displaystyle
Q(t) = CV\left(1-\frac{2}{3}exp\left(-\frac{t}{C(R_1+R_2)}\right)\right)

コンデンサ電荷と電圧の関係(Q=CV)より,充電時のコンデンサの電圧v_{rise}は,

 \displaystyle
v_{rise}(t) = V \left( 1-\frac{2}{3}exp\left(-\frac{t}{C(R_1+R_2)}\right)\right)

ただし,t=0でコンデンサの電圧はv=V/3
これで充電時のコンデンサの波形が求まりました.

放電

放電時は,R_2のみを通ってGNDと接続され放電されます. 同様に,電圧に関する式は次のようになります.

 \displaystyle
0 = R_2i + \frac{Q}{C}

i=\frac{dQ}{dt}を代入すると,

 \displaystyle
R_2\frac{dQ}{dt} + \frac{Q}{C} = 0

となります.
放電開始時のコンデンサの電圧は2V/3なので,この初期条件のもと微分方程式を解くと

 \displaystyle
Q(t) = \frac{2}{3}CVexp\left( -\frac{t}{CR_2} \right)

よって放電時のコンデンサの電圧v_{fall}

 \displaystyle
v_{fall}(t) = \frac{2}{3}Vexp\left(-\frac{t}{CR_2}\right)

これで充放電時のコンデンサの波形を求めることができました.
555タイマーのコンデンサの波形をシミュレーションソフトで見ると,このようになります.

見にくくてごめん

これは電源電圧5V,R_1R_2ともに1kΩ,コンデンサは0.1μFとしたときの場合です. コンデンサの電圧波形は三角波みたいになってるんですね.これが欲しかったわけです.
これを三角波として利用し,コンパレータで基準電圧と比較してPWMを出力したいということです.

つまりこんなイメージ

周期,周波数の計算と3番ピンの出力を無視する理由

コンデンサの充放電の式が得られたので,周期と周波数が求められます. また,今回は555タイマーから直接吐かれる矩形波は無視し,コンデンサの波形に注目するといいました.
その理由は,この回路で555タイマーが出せるDuty比にありますので,計算してみましょう.
3番ピンがHighとなる時間t_{High}コンデンサがV/3から2V/3まで充電される時間なので,

 \displaystyle
v_{rise}(t_{High}) = \frac{2}{3}V

これを解いて,

 \displaystyle
t_{High} = C(R_1+R_2)ln(2)

となります.
出力がLowの時間t_{Low}コンデンサが2V/3からV/3まで放電されている時間なので,

 \displaystyle
v_{fall}(t_{Low}) = \frac{1}{3}V

これを解いて,

 \displaystyle
t_{Low} = CR_2ln(2)

と求まりました.
ここまでくればDuty比,周期,周波数は簡単に求まります. 周期T,周波数f,Duty比は,

 \displaystyle
\begin{aligned}
&T = t_{High} + t_{Low} = C(R_1 + 2R_2)ln(2) \\ \\
&f = \frac{1}{T} = \frac{1}{C(R_1+2R_2)ln(2)} \\ \\
&Duty = \frac{t_{High}}{T} \times 100 = \frac{R_1+R_2}{R_1+2R_2} \times 100
\end{aligned}

さて,Duty比を求める式が求まったのですが,この式からR_1R_2をどのような値にしてもDuty比を50%以下にできないことがわかります.
これは充電時はR_1R_2の両方を通って充電されるのに対し,放電時はR_2のみを通るため必ず充電時間の方が長くなるためと考えられます.
これを解消するにはダイオードで充電時と放電時に通る電流経路を分けて~みたいな工夫が必要ですが,めんどくさい.
そもそもDuty比をいじるために抵抗値を変更するのでは電気的な制御は困難です.
ですので今回は555を三角波っぽい波形を作るためだけに利用し,555の3番ピンから直接出力される矩形波は使用しないということです.

コンパレータで基準電圧と比較する方法でつくるPWMのDuty比

基準電圧とDuty比の関係を計算

ここからが本題です.ここまでは前置き.
三角波っぽい波形を無事得られましたが,あくまで三角波「っぽい」波形であり,実際は直線ではなく指数関数です.
直線で構成されたきれいな三角波なら基準電圧とDuty比は比例関係なりますし,実際に使うときは比例関係にあった方が便利そうです. では,今回の「三角波っぽい波形」(指数関数)の場合,基準電圧とDuty比の関係はどうなるでしょうか.
これを求めてみます.

コンデンサの電圧波形1周期分を取り出して,図のように文字を置きます.基準電圧はv_{ref}としています.
t_1t_2を求めればよさそうです.
t_1v_{rise}(t_1) = v_{ref}となるtです.v_{rise}逆関数から,

 \displaystyle
t_1 = -C(R_1 + R_2)ln\left( \frac{3}{2}\left(1-\frac{v_{ref}}{V}\right)\right)

同様に,t_2v_{fall}(t_2) = v_{ref}となるtなので,

 \displaystyle
t_2 = -CR_2ln\left(\frac{2}{3}\frac{v_{ref}}{V}\right)

コンパレータはコンデンサの電圧と基準電圧を比較するので,コンパレータの出力がHighになるのは図のオレンジの部分です.

よって,Duty比は

 \displaystyle
\begin{aligned}
Duty &= \frac{t_1 + (t_{Low}-t_2)}{T} \times 100 \\\\
&= \frac{-C(R_1+R_2)ln(\frac{3}{2}(1-\frac{v_{ref}}{V}))+CR_2ln(2)+CR_2ln(\frac{3}{2}\frac{v_{ref}}{V})}{C(R_1+2R_2)ln(2)}\times100 \\\\
&= \frac{-(\frac{R_1}{R_2}+1)ln(\frac{3}{2}(1-\frac{v_{ref}}{V}))+ln(3\frac{v_{ref}}{V})}{(\frac{R_1}{R_2}+2)ln(2)} \times100
\end{aligned}

と求まりました.
いい感じにR_1/R_2v_{ref}/Vでまとめることができたので,それぞれrvと置きます.
vに関しては,コンデンサがとる電圧の範囲内にv_{ref}がいないといけないので,1/3 \leq v \leq 2/3となります.
rに関してはr > 0です. すると,

 \displaystyle
Duty = \frac{-(r+1)ln(\frac{3}{2}(1-v)) + ln(3v)}{(r+2)ln(2)}\times100

対数が式の中に入っているので,v_{ref}とDuty比は比例関係ではなさそうです.残念.
ですがまだ諦めません.波形を見ていると,コンデンサが充電されている時間と放電されている時間が同じなら,波形のふくらみとへこみがいい感じに相殺されて基準電圧とDuty比が比例関係になるのでは?と思いました.
これを確かめてみます.
コンデンサの充電時間と放電時間をできるだけ同じにするためには,R_2 >> R_1とします.
この時,rは0に近づきます.
r=0としたとき,vとDuty比の関係は次の式で表されます.

 \displaystyle
Duty = \frac{-ln(\frac{3}{2}(1-v)) + ln(3v)}{2ln(2)}\times100

というわけで充電時間と放電時間を同じにしたとしても,基準電圧とDuty比は比例の関係にはならないことが分かりました.
では,実際にはどのようになるのか,vとDuty比の関係をプロットしてみました.
これはR_1 = R_2 (r=1)の時のグラフです.結構直線っぽいですね.
続いてR_1 = R_2/10 (r=0.1)の時のグラフです.

ほとんど直線ですね.

理想とのズレ

では理想とどれくらいズレているか計算してみます.
理想は基準電圧とDuty比が直線関係にあることなので,次の式で表せます.

 \displaystyle
Duty_{ideal} = (3v-1)\times100

これと先ほど求めたDuty比に関する式を引き算して,直線とのずれdiffを求めます.

 \displaystyle
\begin{aligned}
diff &= duty - duty_{ideal} \\ \\
 &= \left( \frac{(-r+1)ln(\frac{3}{2}(1-v)) + ln(3v)}{(r+2)ln(2)} - (3v-1) \right) \times100
\end{aligned}

この差が最大となるvを求めたいので,微分します.

 \displaystyle
\begin{aligned}
diff' &= 100\times \left(\frac{1}{(r+2)ln(2)}\left(-(r+1)\frac{1}{\frac{3}{2}(1-v)}(-\frac{3}{2})+\frac{1}{v}\right)-3 \right) \\ \\
&= 100\times \left( \frac{1}{(r+2)ln(2)}\left(\frac{r+1}{1-v}+\frac{1}{v}\right)-3 \right)
\end{aligned}

diff'=0の時,

 \displaystyle
\begin{aligned}
&\left( \frac{1}{(r+2)ln(2)}\left(\frac{r+1}{1-v}+\frac{1}{v}\right)-3 \right) = 0 \\ \\
&v = \frac{3(r+2)ln(2)-r \pm \sqrt{(3(r+2)ln(2)-r)^2-12(r+2)ln(2)}}{6(r+2)ln(2)}
\end{aligned}

これで直線とのズレが極大になるvが求まりました.
式からはズレの極大が2つあるように見えますが,どちらも1/3 \leq v \leq2/3の範囲内に入るかどうかはrによります.*1
これをdiffに代入すればDuty比が最大でどれほどズレるかわかります.
が,さすがに式が煩雑なので,式を導出するのはあきらめます.
計算してみると,例えばr=1とすると,v=0.546くらいでズレが最大となり,duty=60.8\%duty_{ideal}=63.8\%で,その差はdiff=-3.1\%位です.
例えばr=0.1とすると,v=0.587くらいでズレが最大となり,duty=75.0\%duty_{ideal}=76.1\%で,その差はdiff=-1.3\%位です.
これが大きいか小さいかは用途によると思いますが,個人的には想像していたより小さいかなと感じました.

まとめ

というわけで,ここまで計算を追って見てくれた方もそうでない方も,ありがとうございます.
結局何をしたのかというと

  • 555タイマーで得られる「三角波っぽい波」でPWM信号を作るときの基準電圧とDuty比の関係
  • コンデンサの充放電で作れる「三角波っぽい波」は,「きれいな三角波」の代用になるのか (Duty比がズレるとすれば,どれくらいズレるのか)

を計算してみた,ということになると思います.
ちなみにここまでの計算は実際の検証はしていません.計算ミスがあるかどうか,確認していません.

確認しようにも抵抗やコンデンサ,ICの誤差の方が大きそうだなと思ってたり.
そもそもこの計算の動機は「マイコンの準備がめんどくさい」だったわけですが,マイコン不要だけどDuty比の精度ほしいなんて場面あるのでしょうか(((

まぁ割とどうでもいいこと?を授業時間中に計算するのは楽しかったので良しとします.

学ロボあまり関係なくね?って思った方,自分がこの計算をしようと思ったきっかけが学ロボだったので許して()

最後に,ここまで長々と駄文に付き合っていただきありがとうございました.

*1:r\ge\frac{3-4ln(2)}{2ln(2)-1}で極大値が1つになりそう