今回は、LDO(Low Dropout)レギュレータ(降圧電源)回路を試してみたいと思います。
降圧電源回路と言うのは、高い電圧からより低い電圧を作り出す電源回路のことで、UNOにもUSB 5Vから3.3V電源を作ったり、7〜12[V] DC入力から5V電源を作るための降圧電源回路が載っています。
普通の降圧電源回路では、入力電圧Vinに対して出力可能な電圧Voutの電圧範囲が決まっています。通常、Vin−Vout>>0であり、VinとVoutの差分をドロップアウト電圧Vdo=Vin−Voutと呼びます。
UNOの5V電源を作っているレギュレータは、AMS1117-5.0という型番のレギュレータチップで、AMS1117データシートによると、Vdo=1.3V(MAX)でした。従ってスペック上、Vout=5Vを得たい場合、Vin=Vout+Vdo(MAX)=6.3V以上の電圧入力が必要だということになります。
Arduino HPから「RESOURCES ⇒ PRODUCTS ⇒ Arduino UNO ⇒ TECH SPECS」と辿ると、入力電圧の推奨値として7〜12[V]となっているのは納得です。
LDOとは、このドロップアウト電圧Vdoが低いことを表す言葉なのですが、Vdoが何V以下なら「LDO」と呼ぶのか、明確な定義はないみたいです。
ここでは、降圧電源回路をNPNトランジスタと、オペアンプで構成します。
NPNトランジスタは、手持ちのS8050を使います。S8050データシートによると、コレクタに流せる電流Ic=700mA(ABS.MAX)程度のトランジスタです。絶対最大定格(ABS.MAX)で700mAですので、十分に×2倍程度のマージンを取るなら、今回の降圧電源回路で流せる電流値は350mA程度となります。
オペアンプには、手持ちのLM358を使います(下図)。
まずはLTspiceでシミュレーションしてみようと思います。以下、回路図です。
動作原理は以下の通りです。
この回路でシミュレーションしてみると、以下図の様になります。
さて、LDOレギュレータを作りたかったのですが、Vdo≒2.05Vと、さすがにLDOと呼ぶには苦しいほどのドロップアウト電圧になってしまいました。この要因は以下の2点だと考えられます。
オペアンプの出力がトランジスタのベース電位になっている回路ですので、関係式は以下の通りです。
Vb>>Vout+(0.6〜1.2[V])
Vb=Voh
Voh=Vin−(1〜1.5[V])
上の関係式より、以下式が導出できます。
Vin−(1〜1.5[V])>>Vout+(0.6〜1.2[V])
Vin−(1.6〜2.7[V])>>Vout
∴Vdo≒1.6〜2.7[V]
計算式(スペック)上も、シミュレーション上も、Vdo≒2Vが妥当だという結果です。
この回路構成だと、TYP条件でもVout=3V弱までしか出力できないので、Vin=5VからVout=3.3Vを得るのは不可だということになります。ちょっと、ドロップアウト電圧、高すぎですね。このまま使う場合の対策としては、1)もっと高い電圧まで出力可能なオペアンプを使う、2)Vinを十分高くするなどが考えられます。
今度は、負荷を駆動するトランジスタをPNPトランジスタに変更してみます。以下、回路図です。
実は手持ちにPNPトランジスタが無かったので、購入しました。購入した部品の詳細についてはこちらをご覧ください。回路図中、S8550と記載されたトランジスタQ1がPNPトランジスタです。S8550データシートによると、Ic=700mA(ABS.MAX)程度のトランジスタです。
負荷を駆動するトランジスタがNPNからPNPタイプに変わっただけで、動作原理は変わりません。動作原理については前節の解説をご覧ください。
でも、シミュレーションしてみると、結果はだいぶ違うのですよ。まずはシミュレーション結果を見てみましょう(下図)。
駆動段をNPN → PNPトランジスタに変更しただけで、この差はいったいどうしたことでしょうか?
最大の違いは、オペアンプの出力電圧Vdif(上図下段紫線)に有ります。NPNバージョン(前節)とPNPバージョン(本節)のVdif値を見比べてみると、NPNバージョンではVdif≒Vout+0.6V程度で制御されているのに対して、PNPバージョンでは、Vdif≒0.6V程度で制御されています。
つまり、出力電圧Voutを高い電圧に設定しても、PNPバージョンではVdif≒0.6V一定で変化しません。NPNバージョンでVdoを低下させていた要因の一つである、オペアンプLM358のVohの影響がPNPバージョンでは見えなくなっているのです。
更に出力電圧Voutは、入力電圧VinからPNPトランジスタQ1のVce分低下した電圧まで出力可能な回路です。S8550データシートによるとVce(SAT)=0.5V(MAX)ですので、以下の様になります。
Vout(MAX)=Vin−Vce(SAT)=5V−0.5V=4.5V
スペック上はVdo=0.5V程度ですね。シミュレーションでは、Vdo≒0.13Vですので、Vce(SAT)の実力値(もしくはTYP値)がスペックより小さいのでしょう。
この回路であれば、入力電圧Vin=5Vから出力電圧Vout=3.3Vを十分に作り出せるので、Arduinoの周辺に使用可能なレベルに到達できたと言って良いでしょう。
Vout=3.3Vが必要な場合、基準電圧Vref=Vout/2=1.65Vに設定して使用します。
あるいは、関係式Vref=Vout/2の×1/2倍は抵抗分圧比R2/(R1+R2)から来ていますので、基準電圧Vrefを先に決めて、そこから所望の出力電圧になるようにR1,R2を決めた方が使い勝手が良いかも知れません。
※基準電圧にバンドギャップリファレンスを使うのか、ツェナーダイオードを使うのか、いずれにせよ、使用する基準電圧源次第で、Vrefが先に決まってしまうケースの方が多いと思われます。
NPNおよびPNPトランジスタについて、調べた範囲でメモしておきます。
NPNトランジスタ | PNPトランジスタ | |
シンボル | ||
端子 |
矢印の付いた端子がエミッタ(NPNは外向き、PNPは内向き)。 本体から垂直に引き出された端子がベース。 残りの端子がコレクタ。 ベース電位Vb、エミッタ電位Ve、コレクタ電位Vcとして、Vbe=Vb−Veなどと表記する。 |
|
動作 |
Vbeに正電圧を印加することで、ベース→エミッタに電流Ibを流す。 電流増幅率をhFEとすると、コレクタ→エミッタに流れる電流Ic=hFE×Ibとなるのが特徴。 エミッタに流れる電流Ie=Ib+Icとなる。 |
Vbeに負電圧を印加することで、エミッタ→ベースに電流Ibを流す。 電流増幅率をhFEとすると、エミッタ→コレクタに流れる電流Ic=hFE×Ibとなるのが特徴。 エミッタに流れる電流Ie=Ib+Icとなる。 |
各々、矢印端子に絡んだ2端子(ベースとエミッタ)間ではダイオード(PN接合)と同じ様な動きとなります。よって、Vbe≒0.6Vと、シリコンダイオードのVfと同等な値となります。
NPNトランジスタとPNPトランジスタを対で使って、プッシュプル型の増幅回路を形成する場合、NPNとPNPトランジスタの特性を合わせておかないとバランスがずれて、増幅した信号が歪んでしまいます。特性的に対をなすトランジスタを相補型(complementary)と呼び、トランジスタのデータシートには、通常、相補型トランジスタの型名も記載されています。
前節で使ったS8050(NPN)とS8550(PNP)も、互いに相補型のトランジスタです。
実際に回路を組んで試してみましょう。まずは、LDOレギュレータの回路図です(↓)。
先ほどのシミュレーション回路ではVoutとしていた出力電圧端子ですが、都合により上の回路図ではVddとしてあります。あと、シミュレーション上、位相調整用コンデンサC2は10nF程度で十分だったのですが、手持ちが有りませんでした。やむを得ず手持ちの100nFを接続してあります。
Vddに接続する負荷回路や既成容量、既成抵抗など、環境によって多少の違いが想定されます。皆様の環境で発振してしまわないように、適切な値を選んで使ってください。
※多分、発振させてしまうと、オペアンプやトランジスタが異常発熱したり、大電流が流れてしまったりしますので、異常を見落とさないように注意深く実験しましょう。
トランジスタS8050およびS8550は、平らな面を正面に見て左からエミッタ(1)→ベース(2)→コレクタ(3)の順番(EBC)です(下図)。
上の図に書き込んでいないのは、型番によってエミッタ(1)→コレクタ(2)→ベース(3)、ECBの順に並んでいるものもあるからです。データシートなどで端子順を確認して使いましょう。
続いて、基準電圧Vrefを生成する回路を示します(下図右半分)。
前節シミュレーション波形をよく見てみると、右端の方でVdifとIb(Q2)が上昇していることが解ります。今回作成したLDOレギュレータ回路では、Vin−Vdoを超えてVoutを上昇させようとすると、オペアンプ(U1)、トランジスタ(Q1,Q2)に大電流が流れてしまうのです。
要は、VoutがVin−Vdoを超えないようにすれば良いので、基準となるVrefが(Vin−Vdo)/2より少し小さくなるよう、中途半端な抵抗値R4を設定してあります。
※2×Vref>Vin−Vdoにした時流れる電流は、Q1,Q2のベース電流Ibに起因するので、負荷側には流れません。無駄に電流だけ流れる……。
左半分には、出力電圧Vddの変化を目で見て確認できる負荷回路として、LEDを接続しておきました。
Arduinoのデジタル制御では、PWM波形を使ってLEDの明るさを制御していました。PWMは、デジタル信号の0Vと5Vを一定期間でスイッチングすることで、LEDに流れる単位時間当たりの平均電流を変化して明るさを制御する方法でした。
今回は降圧電源回路によって、LEDに掛かる電圧そのものを変化させることで、LEDに流れる電流 → 従って明るさを制御します。電源電圧Vddを変化する時、LED D2に流れる電流Ifは、以下の様な式で求められます。
If=(Vdd−Vf)/R5 …… VfはLEDの順方向電圧,R5=330Ω
Vrefとその2倍の電圧となるVddをArduino UNOのアナログ端子で測定できるように、アナログ端子A0,A1との接続点を設定して有ります。後ほど実験する時に、UNOと接続してください。電源Vcc=5VもUNOから供給します。
以下、実験中の様子です。
可変抵抗器VR1を変化させて、LEDの明るさが変わる様子を確かめてみてください。
※回路が間違っていたり、Vin−Vdoを超えて電圧Voutを上げようとしてしまうと、大電流が流れて、回路を構成する素子や機器にダメージを与える恐れがあります。電源を供給する機器の電流値をモニタしながら実験することを強く推奨します。筆者はUSB電圧・電流計(下図)でUNOの電流値をモニタしながら実験しました。
UNOからは電源Vcc=5Vの供給と、アナログ端子A0,A1に接続したVrefとVdd電圧を測定するため、UNOにLogiscopeを書き込んでおいてください。
実験サンプル:【 】内はLogiscopeからの送信データ
【ina,0】
OK: analogRead(0)=235, 1.15V
【ina,1】
OK: analogRead(1)=472, 2.30V
Vref=A0=1.15Vに対してVdd=A1=2.30Vと、設計通りVdd=2×Vrefとなっていることが確認できました。
【ina,1】コマンドで電源電圧Vddを測定しながら撮影した写真は以下の様になりました。
発行体(LED)が明るくなることで、カメラ📷の露出が絞られて背景が暗くなってしまったのですが、電圧の変化とLED自体の明るさに注目してください。LDOレギュレータ出力電圧Vddの上昇/下降に合わせてLEDの明るさが変化しています。
今回のお買い物は、以下の通りです。
ずいぶんと昔に購入してあった部品なのですが、ようやく使ってみることが出来ました。
17値(種類)のトランジスタが各10個づつの計170個入っていました。購入したパッケージに入っていたトランジスタは以下の通りです。
型番(マーク) | タイプ | Ic(ABS.MAX)[mA] | 端子順番 | 相補型型番 |
S8050 | NPN | 700 | EBC | S8550 |
S8550 | PNP | 700 | EBC | S8050 |
2N5551 | NPN | 600 | EBC | 2N5401 |
2N5401 | PNP | 600 | EBC | 2N5551 |
S9013 | NPN | 500 | EBC | S9012 |
S9012 | PNP | 500 | EBC | S9013 |
A42 | NPN | 500 | EBC | A92 |
A92 | PNP | 500 | EBC | A42 |
2N3904 | NPN | 200 | EBC | 2N3906 |
2N3906 | PNP | 200 | EBC | 2N3904 |
C1815 | NPN | 150 | ECB | A1015 |
A1015 | PNP | 150 | ECB | C1815 |
C945 | NPN | 150 | ECB | A733 |
A733 | PNP | 150 | ECB | C945 |
S9014 | NPN | 100 | EBC | S9015 |
S9015 | PNP | 100 | EBC | S9014 |
ST9018 | NPN | 50 | EBC | − |
※昔何方かに教わった覚え方は「笑窪(エクボ、ECB)」でした。昔のトランジスタはECBの順だったのかな?でも、今となっては色々な端子順があるみたいなので、必ずデータシートで確認してから使いましょう。
詰め合わせ(アソートメントパック)になって売られている物なので、今購入すると違う型番のトランジスタが入っているかもしれません。ご参考まで。
パワートランジスタではなく、普通の小信号用トランジスタを使っていますので、今回のLDOレギュレータで駆動可能な電流値は300mA程度です。UNOの消費電流は60〜70[mA]程度ですので、328duinoくらいなら余裕をもって駆動できるでしょうか??