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^;
次善策
- Nch MOS FETを仕入れてNXPの仕様書のような回路を作る
- 観念して「I2Cバス用双方向電圧レベル変換モジュール」を使う
- AVRを3.3V駆動する
- 5V駆動のLCDを使う
- 動いてるんだから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ってたいして違わないし)
USBの信号線は双方向です。データシートを見ると5V駆動時ATTINYのHレベルスレッショルドは2.5V近辺にあるので(http://www.geocities.jp/denzeeen/denzi/tiny2313th.png)USB3.3V信号->5V駆動attinyで信号を受け取ることができているという事のはず。
返信削除あと高校生の頃使った 74LS14ってTTLの便利なチップがあったけど(今あるかな)使いようによっては便利かも。テキトーなトランジスタの三角波みたいなCR発振すら5vレベルのクロックにできた記憶がありますー。
USBのD+、D-は3.3Vでしたか。なるほど
返信削除USB 5V / ATINY2313 3.3Vと勘違いしてました。
Mega328PのThresholdも確認したら、同じぐらいでした
ということは信号線は3.3V固定でいいのか
7414の発信回路はいずれ作ってみようと思って手付かずのままで
部品箱で眠ってます