2014年9月26日金曜日

I2Cの5V↔3.3Vレベルシフト

負電源を測定するためにAVRを5V駆動することにしたので
AVRとI2C LCDの間のレベルシフトについて考えてみた

tozさんにレベルシフトはツェナーとかLEDでやっては?とアドバイスいただいた。

HIDaspx(http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2FHIDaspx#content_1_5
の回路図を眺めてみたがUSBの5Vをツェナーで3.3Vに落としてる(と思う)

5Vの信号(USB)→3.3Vの信号(AVR)はこれでわかるんだが

3.3V→5Vはこの場合どうなるかわからん

HIDaspxはUSB(5V)→AVR(3.3V)の一方通行なんだろうか?

使う予定のI2CのLCDは、基本的にWriteのみだが
I2CのプロトコルのACKだけはLCD→AVRの信号の流れになるので
3.3V→5Vの変換が必要なはず

そこで、I2Cのレベルシフトを調べてみたら
そのものずばりの「I2Cバス用双方向電圧レベル変換モジュール」というのがあった
http://akizukidenshi.com/catalog/g/gM-05452/

もう少し調べると、エアバリアブルさんのところで
http://airvariable.asablo.jp/blog/2013/03/02/6734772
Nch MOS FETを使う方法があった

以前はNXPの公式の仕様書にのっていた(半?)オフィシャルな方法だそうだ

さらに、ねがてぃぶろぐさんのとこで2SC1815を使う方法があった
http://gomisai.blog75.fc2.com/blog-entry-46.html

手持ちの部品では3.3V(3.6V?)のツェナーがないしNch MOS FETもない。

送料とか考えると、変換モジュールを秋月で通販するのもしゃくなので
手持ちにある2SC1815で実験してみた

LTSpiceのシミュレーション


ねがてぃぶろぐさんのところにあるスリーステート出力の74HC125モデルの
Yahoo! Tech Groups - LTspice/SwitcherCAD III(http://tech.groups.yahoo.com/group/LTspice/)の
リンクがたどれなかったので

LTWiki(http://ltwiki.org/?title=LTspiceIV-library_Library_Listing_Expanded)から拾ってきた

2SC1815はどこからとってきたか忘れたが、LTSpiceに入れておいたやつをそのまま使った

5V → 3.3V


3.3V→5V



ねがてぃぶろぐさんのところとは違った結果に

正直自分のシミュレーションの方が正しいという自信はない(というよりどっか間違ってるはず)

バイポーラなのでMOS FETよりかなりスイッチングスピードが落ちる結果なんだろうか

CLOCKはI2Cを100kHzで駆動する予定なので10usにした
(ここもねがてぃぶろぐさんの計算とは違う。ぐぬぬ・・・)

波形的にかなりキツそうだが、とりあえずArduinoで実験

SCL、SDA、RSTの3本を3.3V<->5V変換
LCDのVCCはArduinoの3.3Vからとった

Arduinoのスケッチは前回と同じく
Sim's blogさんのところから(http://blog.goo.ne.jp/sim00/e/ab138be751d447bcdb0eecaaca232214

写真は撮ってないが、何も表示されなかった。

同じArduinoのスケッチでLCDを5V駆動すれば動いたので、スケッチとLCDは問題ないはず。
(LCDの濃さの値もいくつかいじってみた)

スケッチを単にHIGH、LOWを出力するようにして、5V→3.3Vのシフトがうまく行ってるかどうか実験

I2CのPIN ArduinoのPIN 5V側 3.3V側
RST 2 4.91V 3.29V
SCL A5 4.91V 3.29V
SDA A4 0.226V 0.233V

1秒サイクルのLチカはOK



オシロスコープがないので、ソフト・オシロで波形を見てみた(500Hz)

5V側




3.3V側




FFTしたMAX値を比較すると

(-13.95dB) - (-19.71dB) = 5.76dB (= だいたい1.94倍) 
5V / 3.3V = 1.51

なのでちょっとおかしいが、FFTした後じゃなくて単純に波形を比較しないとダメか

めんどくさいし、回路自体は間違ってなさそうとすると2SC1815作戦はちょっとしんどい気がする

追い込むほどの力量はない(^q^;

次善策


  1. Nch MOS FETを仕入れてNXPの仕様書のような回路を作る
  2. 観念して「I2Cバス用双方向電圧レベル変換モジュール」を使う
  3. AVRを3.3V駆動する
  4. 5V駆動のLCDを使う
  5. 動いてるんだからI2CのLCDも5V駆動する(←禁じ手か(^q^;

3.のAVRを3.3V駆動作戦はGNDの電位をずらすときに使うシャントレギュレータが2.5Vなので
仮想GNDからVCCまでが 3.3V - 2.5V = 0.8V しかとれない

ノイズの影響も出てきそうであんまり気が進まない

1.25Vのシャントレギュレータも共立であったが秋月のレベル変換モジュールより高い
(し、0.8Vと1.25Vってたいして違わないし)

2 件のコメント:

  1. USBの信号線は双方向です。データシートを見ると5V駆動時ATTINYのHレベルスレッショルドは2.5V近辺にあるので(http://www.geocities.jp/denzeeen/denzi/tiny2313th.png)USB3.3V信号->5V駆動attinyで信号を受け取ることができているという事のはず。
    あと高校生の頃使った 74LS14ってTTLの便利なチップがあったけど(今あるかな)使いようによっては便利かも。テキトーなトランジスタの三角波みたいなCR発振すら5vレベルのクロックにできた記憶がありますー。

    返信削除
  2. USBのD+、D-は3.3Vでしたか。なるほど

    USB 5V / ATINY2313 3.3Vと勘違いしてました。

    Mega328PのThresholdも確認したら、同じぐらいでした

    ということは信号線は3.3V固定でいいのか

    7414の発信回路はいずれ作ってみようと思って手付かずのままで
    部品箱で眠ってます

    返信削除