Raspberry Pi Picoに超音波センサHC-SR04を接続したおりに、NMOSトランジスタを使ったレベルシフト回路を使用いたしました。動作的には問題ないのですが、ロウが続く信号であると消費電流が気になります。そこでダラダラ電流の流れないレベルシフト回路を挿入してみました。老眼にはハンダ付けが辛い。
※「部品屋根性」投稿順Indexはこちら
マイコン「工作」では、3.3Vから5Vとか、5Vから3.3Vとか、IO電圧の変更が必要になる場合が多いと思います。実動作オーライで、ちょいとデータシートの規定からの逸脱を許せば簡素化も可。でも、DC的な仕様くらいはちゃんと守りたいです(どうせ遅い動作であればAC的なところは無問題。)
さて、上記の記事で使用いたしましたNMOSトランジスタを使ったレベルシフト回路は、
-
- 双方向
- トランジスタ1個(とプルアップ抵抗)
で済み、I2Cバスなどオープンドレインの出力トランジスタを使った信号の接続時には簡単で便利じゃないかと思います。もちろんI2Cバス以外の通常の単方向の信号に使っても動作はします。ただ、通常ロウの信号の伝送に使うと、プルアップ抵抗に電流が流れつづけます。「低消費電力な」マイコンを使ってsleepなどしても努力は水の泡となりかねません。そういうときは、ちゃんとスイッチングするデバイスを使用したいです。
ロジックICといえば、74シリーズがまず頭に浮かぶ年寄りです。しかし昨今では、多くのロジックはSoCとか、FPGAとかASICの中に入っているので、外付けロジックの必要性は極小。1パッケージに複数回路を格納している74シリーズはツーマッチな感じがいたします。ピン数が多い分だけフットプリント大きくなってしまうし。そんなロジック事情を反映したと思われるのが、「ワンゲートロジック」といわれる単一ゲートを小さなパッケージに納めたロジックIC製品です。今回使用させていただいたのは以下の2種
-
- TC7S14F シュミットトリガインバータ
- TC7SH00FU 2入力NAND
どちらも東芝様の製品。
上記のページから1か所引用させていただきましょう。
当社はワンゲートロジックICを世界で初めて商品化いたしました。業界のパイオニアとして、小型・薄型・低電圧動作製品など、多彩な製品のラインアップ拡大をしていきます。
海外も含め多くの会社が「ワンゲート」ロジック作っていると思われるのですが、東芝様が元祖だったのだなあ。だいたい「ワンゲート」という言い方自体が日本風味(例えば日本ではワンチップマイコンみたいな言い方するですが、米国式だとシングルチップマイクロコントローラであります。)
さて、今回は購入して手元にあった上記の2デバイスを使用してみました。後でみたら東芝様のQAページに「レベルシフト」そのものずばりの解説ページがあり、そこでもワンゲートロジックを使っていました。正しい使い方だったんだ。安心。
降圧(5V→3.3V)、昇圧(3.3V→5V)のレベルシフト(電圧変換)をしたいのですが?
購入時、頭の中の慣習的にインバータとNANDという反転ゲートを買ってあったのを反省いたしました。レベルシフトに加えて論理反転までしてしまうので、その対応としてマイコン側のソフトに手直し必要になってしまいました(簡単なのだけれど、そういうことをするとバグことが多いのよねえ。)
とりあえず以下の役割分担としました。
-
- 5Vから3.3VへのレベルシフトはTC7SH00FU
- 3.3Vから5VへのレベルシフトはTC7S14F
5Vから3.3Vへのシフトの場合、ICの電源には3.3Vを与えて出力も3.3V出力とします。この場合3.3V電源のICに5V信号を入力することになり「普通はヤバイ」ですが、TC7SH00FUの場合入力端子が「5.5Vトレラント(私的には5Vトレラントで良いように思いますが)」なのです。5Vの信号をそのまま入力しても壊れないで正常動作。2入力NANDなので使用しない1端子には固定ハイを入力。
3.3Vから5Vへのシフトの場合、ICの電源は5Vなので、3.3Vの信号入れても壊れることはないですが、問題はVIHのスペックを守れるかどうか。上記のTC7SH00FUも含め、多くのICの規定は0.7*VCCという感じかと思います。つまり5V電源だと VIH=3.5Vとなって、3.3Vフルスイングでもスペック割れます。まあ、実際にはCMOSだし、動くでしょう。しかし、オールド・ジャパニーズはデータシートのスペック割れているような使い方はまずしないです。その点ね、シュミット回路はいいです。もともと中間電位くらいのダラダラした信号を成型するための回路なので、3.3Vのハイのパルスを入れても問題ない筈。
とりあえずAnalog Discovery 2でテスト用の信号を以下のように生成してみました。上が5V、下が3.3Vのパルスの波形。後で応用回路にすることをちょっと意識したパルス幅です。
まず、3.3Vから5Vへのレベル変換+論理反転の結果がこちら。黄色が入力、青が出力。OKです。
次に5Vから3.3Vへのレベル変換+論理反転の結果がこちら。青色が入力、黄色が出力。これもOKっと。
さて、レベル変換動作を確認できたので、別投稿の回路を置き換えてみたものがこちら。ただしマイコン端子では論理反転していることにご注意ください。
現物の、ワンゲートロジック回路がこちら。TC7SH00FUはSSOP5-P-0.65という0.65mmピッチのパッケージ、TC7S14FはSSOP5-P-0.95という0.95mmピッチのパッケージです。買い置きの秋月電子殿のピンピッチ変換基板の中で、SOT363-6用基板にTC7SH00FU、SOT23用基板にTC7S14Fを載せてみました。パッケージの大きさは微妙に違うのだけれど、ランドのピッチさえ合っていれば半田付けは可能っと。しかし0.65mmピッチ、老眼の目には限界。手先もブレブレ。
一応、動作確認用の改造版MicroPythonスクリプトを添付いたしました。一応、距離測定(30cmくらいまで)は動作している感じ。
部品屋根性(45) SEMITEC製 10TPS83T サーモパイル へ戻る
部品屋根性(47) SiSonic SPM0405HD4H、MEMSマイクロフォン へ進む
レベル変換時の論理反転対応、パルス極性を反転させた、Raspberry Pi Pico用MicroPythonによるHC-SR04インタフェースコード
from rp2 import PIO, asm_pio from machine import Pin, Timer import time countMax = 1024 @asm_pio() def measureX(): pull(block) mov(x, osr) wait(1, gpio, 0) wait(0, gpio, 0) label("lowloop") jmp(pin, "exitloop") jmp(x_dec, "lowloop") label("exitloop") mov(isr, x) push(block) sm0 = rp2.StateMachine(0, measureX, freq=1000000, in_base=Pin(0)) trig = Pin(1, Pin.OUT) trig.value(1) while True: trig.value(0) trig.value(1) sm0.active(1) sm0.put(countMax) dat = sm0.get() sm0.active(0) dist = (countMax - dat) / 29 print("DATA=0x{0:08x} Dist={1:3.1f}[cm]".format(dat, dist)) time.sleep_ms(500)