2016年03月15日 | 公開。 |
2016年03月31日 | 図18の間違いを訂正。 |
2016年04月06日 | Arduino Unoでは図12と図13が電気的に同じ結線になるこ事を説明。 |
I/O電圧が5VのArduinoの場合は、AQM1248Aとの間に、5Vのデジタル信号(論理信号)を3.3Vのデジタル信号に変換する、レベル変換回路を挿入する必要があります。ここでは、抵抗分圧方式の簡易的なレベル変換回路と、レベル変換用のICを用いたレベル変換回路の2種類を2種類を紹介します。
レベル変換回路の種類 | 長所 | 短所 |
---|---|---|
抵抗分圧方式 |
|
|
レベル変換IC使用 |
|
|
それでは、それぞれの方式のレベル変換回路を使って、AQM1248Aを5VのArduinoに接続する方法について、説明します。
まず、抵抗分圧方式のレベル変換回路を使う方法を説明します。
抵抗分圧回路を図9に示します。
この回路は2つの抵抗からなりますが、左の端子V1を入力すると、右の端子に、V2が出力されます。出力電圧V2は、次の式で求まります。
ここで、抵抗値をR1=510[Ω]、R2=1000[Ω](1[kΩ])とすると、V2≒0.663V1となります。
この時、V1=5[V]とするとV2≒3.31[V]となり、出力がHの状態の5Vの論理回路を図9の入力端子につなぐと、出力端子から3.31[V]の出力が出る事が分かります。
また、V1=0[V]の場合はV2=0[V]となり、出力がLの0Vの状態の論理回路を図9の入力端子につなぐと、出力端子から0[V]の出力が出る事が分かります。
以上の事から、図10の様に、510Ωの抵抗と1kΩの抵抗を用いて分圧回路を構成すると、5V→3.3Vのレベル変換回路が構成できる事が分かります。
なお、式(1)を見て分かるように、V1の係数の分子(R2)は分母(R1+R2)よりも必ず小さくなります。よって、このレベル変換回路は、高い電圧を下げる用途にしか使えません。
この記事では510Ωと1kΩの抵抗を使いましたが、R1:R2=0.515:1がおおむね成立していれば、他の抵抗値でもうまく動作します。とはいえ、極端に小さい抵抗値(例:5.1Ωと10Ω)や極端に大きな抵抗値(例:510kΩと1MΩ)にするのは良くありません。(コラム「抵抗分圧型レベル変換回路はなぜ消費電流が大きく、動作速度が遅いのか」を参照)
電子工作をある程度続けていると、部品箱に余った抵抗が残っているでしょうから、それらを使って、簡易型のレベル変換回路を作れます。もし比が0.515:1の抵抗の組み合わせを見つけられなくても、同じ抵抗値の抵抗が3本あれば、図11の様に5V→3.3Vのレベル変換回路を作れます。
ただし、この回路はレベル変換ICを使ったレベル変換回路より消費電流が多く、動作速度も遅いため、レベル変換用のICが入手できる場合は、そちらを使う事をお勧めします。
図10のレベル変換回路を利用して、AQM1246Aを5VのArduinoに接続し、ハードウェアSPIを用いる場合は、図12の様に配線します。
この場合、動作テスト用のスケッチは、前のページのリスト1となります。このスケッチは、Arduino IDE 1.0.X、1.6.Xおよび1.7.Xで動作します。(Arduino IDE 1.0.6、1.6.7および1.7.8とArduino Uno、Arduino LeonardoおよびArduino Mega2560の組み合わせ、計9通りで動作確認済み)
Arduino UnoおよびArduino Mega2560を用いて、図12の配線をした場合の写真を、それぞれ写真11および写真12に示します。
図10のレベル変換回路を利用して、AQM1246Aを5VのArduinoに接続し、ソフトウェアSPIを用いる場合は、図13の様に配線します。
この場合、動作テスト用のスケッチは、前のページのリスト2となります。このスケッチは、Arduino IDE 1.0.X、1.6.Xおよび1.7.Xで動作します。(Arduino IDE 1.0.6、1.6.7および1.7.8とArduino Uno、Arduino LeonardoおよびArduino Mega2560の組み合わせ、計9通りで動作確認済み)
Arduino UnoおよびArduino Mega2560を用いて、図13の配線をした場合の写真を、それぞれ写真13および写真14に示します。
なお、3ページの表3で説明したとおり、Arduino Unoの場合は、11番端子とSPI-4端子、および13番端子とSPI-3端子が、内部でつながっていますので、図12と図13は、電気的に等価な結線になります。よって、ハードウェアSPIとソフトウェアSPIで配線のつなぎ方を変える必要はありません。(もちろん、Arduino LeonardoやArduino Mega 2560の場合は、図12と図13の結線を区別する必要がある)
「とにかくAQM1248Aを5VのArduinoで動かしてみたい」という人は、図12や図13の通りに配線をすれば、うまく動作します。しかし、「自分で抵抗値を変更して、回路をアレンジしたい」という方もいらっしゃるでしょうから、もう少し詳しい理論的な説明をしておきます。 理論的な話に興味がなければ、このコラムを読まなくても問題ありません。
抵抗分圧型レベル変換回路は、ICを使ったレベル変換回路と比較した場合、消費電流や動作速度の点で劣っている事が、このコラムを読むと分かるでしょう。また、抵抗分圧型レベル変換回路の動作原理は、中学校で習うオームの法則が分かっていれば理解できる簡単なものですが、きちんと設計したいなら、意外とやっかいである事が理解できるでしょう。
抵抗分圧型レベル変換回路は消費電力が大きいと表4に書きましたが、その理由について考えてみます。
図14の様に、510Ωと1kΩの抵抗でできた抵抗分圧回路において、入力端子に電圧V1を加えたときの電流Iを考えます。
Iは次の式で与えられます。
ここで、V1=5Vの場合を考えると、I≒3.31[mA]となります。またV1=0[V]の場合を考えると、I=0[mA]となります。
V1=0[V] の場合は問題ありませんが、V1=5[V]の場合は、3.31[mA]もの電流が、抵抗分圧回路で消費されてしまいます。AQM1248Aの消費電流は1[mA]と少ないのですが、これではAQM1248Aの低消費電流性を活かせません。この様に、抵抗分圧回路は、入力端子に電圧をかけた時に、分圧抵抗に比較的大きな電流が流れるのが欠点です。
一方で、後に詳しく紹介するSN74AHC244というICを用いたレベル変換回路の場合、入力電圧が変化しない条件では、消費電流は40[μA]以下(0.04[mA]以下)となります。さらに、IC1個で4つの信号のレベル変換を行えることを考えると、信号1つあたりでは10[μA]以下と、極めて少ない消費電流になります。(ただし、入力電圧が変化する場合は、信号の周波数が高いほど消費電流は増えていく)
なお、ふたつの抵抗値を例えば51kΩと100kΩという具合にそれぞれ100倍すれば、出力電圧V2を変化させる事なく、電流Iを1100にする事ができます。(V1=5[V]のときにI≒33.1[μA]) しかしながら、この様に抵抗値を極端に上げると、後に説明するように、回路がうまく動作しなくなります。
Arduino UnoとAQM1248Aを図15の配線図で接続した場合に、赤色で示した点Aと点Bの電圧波形を測定した結果を、図16に示します。
CH1(黄色)が点Aの波形。CH2(水色)が点Bの波形。測定はGW INSTEKのGDS1062という60MHzのオシロスコープを使い、純正プローブを1:10のモードに設定して行った。
図16を見ると、確かに5Vの信号が3.3V(実測値では3.28V)の信号に変換されているのが分かります。しかしながら、レベル変換後の波形(水色)の波形の立ち上がりがなまってしまい、遅いのが少し気になります。
抵抗分圧型レベル変換回路の伝搬遅延時間(入力の論理が変化してから出力の論理が変化するまでの時間)を測るために、時間軸方向に拡大して測定した波形が図17になります。
入力波形(黄色)がHの電圧の50%(2.5V)に達してから、出力波形(水色)がHの電圧の50%(1.65V)に達するまでの時間を伝搬遅延時間と定義して、図17より伝播遅延時間を測定すると、5.6nsとなります。
また、図18に示す74AHC244をレベル変換に用いた回路(詳しくは次のページで説明)で、点Aと点Bの波形を測定すると、図19の様になります。
図19と図17のCH2(水色)の波形を比較すると、図19の方が波形の立ち上がりが急峻になっている事が分かります。伝播遅延時間についても、5.6ns→4.0nsと、図19の方が少し短くなっています。
この様に、抵抗分圧型のレベル変換回路は、レベル変換用のICを使う場合と比べて、波形の立ち上がり・立ち下がりがなまってしまいます。(この記事では波形を示しませんが、波形の立ち下がりも、立ち上がりと同様、なまります) では、どうしてこのような波形のなまりが生じるか、考えて見ましょう。
高速のCMOSロジックICの出力部の等価回路を図20に示します。
この等価回路で分かるように、出力がHの場合は、VDD(CMOSの電源電圧)と出力が抵抗R0を介してつながります。また出力がLの場合は、GNDと出力が抵抗R0を介してつながります。R0の値はICの種類により変わりますが、おおむね数Ωから数十Ωのオーダーで、高速なIC程R0が小さい傾向にあります。(厳密に言うと、Hを出力している時の抵抗値とLを出力している時の抵抗値は異なりますが、おおむね同じ値になる様にICが設計される場合が多いです。また、出力がL→H、あるいはH→Lに切り替わる瞬間は、図20の様な単純な等価回路で表わせませんが、極めて短時間の出来事なので、無視して差し支えない場合が多いです)
ここで、図20の等価回路で表わせるCMOSロジックICの出力端子に、R1とR2のふたつの抵抗からなるレベル変換回路を接続し、図21(a)の様な回路を構成した場合を考えましょう。図21(a)の回路の、テブナンの等価回路は、図21(b)の様になります。さらに、R0がR1より十分小さい場合は、図21(c)の様に近似できます。(R1//R2は、R1とR2を並列接続した時の合成抵抗値)
ここで、寄生容量の影響を考慮します。レベル変換回路の先には別のロジックICの入力端子が接続されますが、実はロジックICの入力端子には、数pFないし十数pF程度のコンデンサが寄生(設計者が意図的に入れた訳でないのに存在する事)しています。例として、図22にTC74HC00のデータシートの一部を示します。
他にも、配線にも寄生容量があります。特に、ブレッドボードを使って配線する場合は寄生容量が大きくなります。ブレッドボードのコンタクト(ワイヤを差し込む電極)は、隣の列のコンタクトとの間に数pFないし10pF程度の寄生容量を持ちます。(そのため、ブレッドボードは高周波や高速の回路に向いていません)
また、波形を測定する場合はオシロスコープを使用することになりますが、オシロスコープのプローブにも、数pFないし数十pFの寄生容量があります。なお、プローブに1:1と1:10の切り替えスイッチ(写真15参照。×1と×10と表示してある場合が多い)がある場合は、1:10側(×10側)に切り替えると、感度が110になることと引き換えに、寄生容量が激減します。高い周波数や高速の信号の測定を行う場合は、1:10に切り替えて使用すべきです。なお1:10でプローブを使用する場合は、プローブ補正が必要になります。
これらの寄生容量の合計をCSとし、図22(c)の回路にCSを接続したのが図23の回路となります。
ただし、EとRPを次の様に定義しています。
最初出力がLであるとして、時刻t=0で出力がHに変わると仮定すると、寄生容量CSの影響により、出力電圧はいきなり0からEには変化できません。抵抗RPを介して寄生容量CSを充電しながら徐々に電圧が上昇していきます。具体的には、出力電圧v(t)は、次の式で与えられます。(WikipediaのRC回路のページを参照)
式(5)のグラフの概形は図24の様になります。
v(t)がEに向かって徐々に上昇していく様子が、このグラフから分かります。図16や図17のCH2(水色)の波形を見ると、図24のグラフに似ている事に気づくでしょう。(波形の立ち上がり始めは傾きが強いが、徐々に傾きが弱くなって、一定値に近づいていっている点に注意) この様に、抵抗分圧型レベル変換回路を使うと波形の立ち上がり(と立ち下がり)がなまるのは、寄生容量を充電するのに時間がかかるからなのです。
また図24からは、t=CSRPの時に、出力電圧が最終値(収束値)の63.2%まで上昇している事も分かります。CSとRPの積が大きいほど、波形の立ち上がりに時間がかかることから、CSRPが、波形の立ち上がりにかかる時間の指標になる事が分かります。このCSRPを時定数と呼びます。
レベル変換用のICを使う場合、そのICの出力部は図20の様になっており、抵抗値R0が抵抗分圧型レベル変換回路の抵抗値RPよりも小さいため、時定数も小さくなります。その結果、図19のCH2(水色)の波形の様に、立ち上がりが早い波形が得られます。
抵抗分圧型レベル変換回路の消費電流を減らすため、図9のR1とR2の比を保ったまま、これらの値を上げると何が起こるでしょう。
図10ではR1=510[Ω]、R2=1[kΩ]の場合を紹介しましたが、これらをそれぞれ100倍にして、R1=51[kΩ]、R2=100[kΩ]とする場合を例に考えます。
5Vの電圧を印加したときの消費電流は、3.31mAから33.1μA(0.0331mA)と、1100になります。
一方で、式(4)で定義されるRPは、338Ωから33.8kΩ(33800Ω)へと、100倍に上がります。つまり、時定数CSRPが100倍になるのです。これは、波形が立ち上がるのに100倍の時間がかかることを意味します。
図25に示す様に、51kΩと100kΩでレベル変換回路を組み、同図の点Aと点Bの波形を測定した結果を図26に示します。
図26を見ると、CH2(水色)の波形が図17よりも大きくなまっているのが分かります。(波形を比較するときに、時間軸の目盛りが10ns/DIVから500ns/DIVに変わっている事に注意) またそれに伴い、伝播遅延時間も、5.6nsから860nsへ、大幅に長くなっています。
なお伝搬遅延時間は、860÷5.6=154倍と、丁度100倍にはなっていません。これについては、図17の測定において、伝搬遅延時間に対してCMOSの出力(この場合はArduino UnoのGPIOの出力)がLからHへ切り替わる時間が無視できない事、nsオーダーの伝搬遅延時間を測定するにはオシロスコープの帯域(60MHz)が不足している事、抵抗を取り替えた事により微妙に寄生容量が変化した事など、いくつか原因が考えられます。図26の様な変化のゆっくりした波形では、比較的正確に伝搬遅延時間が測定されていると推測されます。
この様に、抵抗分圧型のレベル変換回路において、抵抗値を極端に大きくすると、波形がなまってしまい、高い周波数の信号は正しく伝達できない事が分かります。また、CMOSのICになまった波形を入力すると、誤作動したり、消費電流が大きく増えたりする事があり、この点にも注意が必要です。
なお、点Bの波形を拡大し、出力電圧が63.2% (3.3×0.632≒2.09[V])に上昇するまでの時間(時定数)を測定した結果を図27に示します。
このグラフより、時定数は1.20[μs]と求まります。R1とR2の並列合成抵抗RPは33.8[kΩ]と分かっていますから、これより寄生容量CSは1.20×10-6÷(33.8×103)=3.55×10-11[F]=35.5[pF]と求まります。
先ほどはAQM1248AのSCLK信号(図25の点Aと点B)を観察しましたが、今度は/CS信号(図25の点Cと点D)を観察してみましょう。観測された波形を図28に示します。
この波形より、レベル変換がうまくできていない事が分かります。レベル変換前の電圧が0[V]の時に、レベル変換後の電圧が2.56[V]までしか落ちていません。そのため、AQM1248Aには/CS信号がLと認識されず、液晶画面には何も表示されません。
どうしてこの様になったかは、図1のピッチ変換基板の回路図を見れば理解できます。/CS信号には、プルアップ抵抗(R1)が入っている事が分かります。このプルアップ抵抗は10kΩであり、レベル変換回路に使われている51kΩや100kΩに対して小さいため、レベル変換回路がプルアップ抵抗をLに引っ張るだけの十分な電流を供給できなかったのです。
プルアップ抵抗を考慮して、図25の点Cが0[V]になったときの点Dの電圧を計算すると、51//10010+(51//100)×3.3=2.55[V]となり、実測値の2.56[V]とよく一致します。(図29参照)
510Ωと1kΩでレベル変換回路を構成する場合は、10kΩのプルアップ抵抗があっても、点DのLレベルの電圧の計算値は0.51//110+(0.51//1)×3.3=0.108[V]となり、十分Lレベルとして認識されます。
一般に、プルアップ抵抗やプルダウン抵抗が信号線に入っているときは、レベル変換回路のふたつの抵抗の並列合成値RPがプルアップ抵抗よりも十分小さい必要があります。510Ωと1kΩの抵抗でレベル変換回路を組むと、RP=338[Ω]となりますが、通常プルアップ抵抗には数kΩないし数十kΩの抵抗が良く使われますので、この分圧抵抗なら十分プルアップ抵抗やプルダウン抵抗をドライブできる計算になります。
今回の様にプルアップ抵抗(やプルダウン抵抗)が10kΩだと決まっている場合は、分圧抵抗を10倍の5.1kΩと10kΩにまで大きくしたあたり(この時、LレベルがAQM1248Aの電源電圧の25.3%までしか下がらない)から、だんだん動作が怪しくなるでしょう。
さらに、4.7kΩや3.3kΩなど、もっと小さい抵抗をプルアップ抵抗(やプルダウン抵抗)に使うなら、それに応じて分圧抵抗を下げる必要があります。
今度は逆に、波形のなまりを抑えるために、抵抗分圧型レベル変換回路の抵抗値を小さくする場合に何が起こるかを考えてみます。
例えば、510Ωと1kΩのレベル変換回路の抵抗を、51Ωと100Ωに、それぞれ110にした場合は、5Vを入力した場合の消費電流が3.31mAから33.1mAへと10倍に増えます。(ただしこれは計算上の値で、実際にはCMOS ICの出力部の抵抗の影響が無視できなくなり、33.1mAより少ない電流が流れます)
マイコンのGPIOピンが出力できる電流は、通常数mAです。よって、ほとんどのマイコンにおいて、33.1mAの電流は、スペックをオーバーしてしまいます。過大な電流を出力すると、出力電圧が異常になったり、最悪の場合、マイコンが故障してしまいます。
ただし、Arduino Unoに使われているATmega328Pというマイコンは、1ピンあたり最大40mAも出力できる強力なGPIOを持っているので、その点では33.1mAの電流を許容できます。それでも4つの信号線(/CS、RS、SCLK、MOSI)で同時に33.1mAずつ流すとすると、それだけで132.4mAもの電流を消費します。今度はArduino Unoに搭載している電源回路に余裕がなくなってきます。
以上の事から、510Ωと1kΩというのは、あまり下げる余地のない値である事が分かります。
今回は抵抗分圧型のレベル変換回路を説明しましたが、次のページではレベル変換用ICを用いた回路について説明します。
商品名 | 122X32モノクログラフィックLCDシールド | |
税抜き小売価格 | 3333円 | |
販売店 | スイッチサイエンス | |
サポートページ | 122X32モノクログラフィックLCDシールドサポートページ |
商品名 | GLCD学習シールドキット | |
税抜き小売価格 | 1410円 | |
販売店 | スイッチサイエンス | |
サポートページ | GLCD学習シールドキットサポートページ |