2014年9月29日月曜日

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

tozさんにHIDaspxのUSB(3.3V)↔AVR(5V)について教えてもらった

この間は勘違いして(USB)5V↔AVR(3.3V)でツェナーで降圧しているものだと思って
よくわからなくなっていた

どうりでRの入れ方が逆だと思った

HIDaspxではAVRの入力スレッショルドが2.5V前後にあるので
5V駆動でも3.3V系の信号が受け取れることを利用して
信号線は3.3Vで固定しているようだ

ATMega328PのDATASHEETを読むとこれとは別にI2Cの特性というのがあった

29.7 Two-wire Serial Interface Characteristics
VIH | Input High-voltage | Min. | 0.7Vcc

5[V] × 0.7 = 3.5[V]

なのでちょっと怪しいが、5Vでも動いているのでとりあえず実験

LEDでレベルシフト


ツェナーの手持ちがないのでLEDで基準電圧を作ることにした

手持ちのLEDのだと

赤色LED×2 1.8[V]×2=3.6[V]
青色LED   3.3[V]

が適当そうなので、LTSpiceでシミュレーション

5V→3.3V


3.3V→5V



電流制限抵抗がないとLEDが飛ぶはずなので、330ΩのR3とR6を入れた

ツェナーよりちょっとややこしいが、シミュレーションはまずまずの結果

青色LEDと赤色LED×2でブレッドボードで試作





5V側をHIGHにして、3.3V側の値を測定した

赤色LED×2 3.49V
青色LED 3.00V
+5V電源 4.92V
+3.3V電源          3.30V

Arduinoで500Hz(というかdelay(1)の繰り返し)のHIGH,LOWを出力するスケッチを作って
ソフト・オシロで波形を測定した

赤色LED×2



青色LED



ソフト・オシロじゃ矩形波の形はまともに測れないのは今までの経験からわかったので
波形の崩れは無視する

で、LCDをつないでみた





やっぱ、だめだ

5V駆動ならちゃんと表示されるので、謎は深まるばかり…

もう観念してI2CのレベルシフトICを使うかなとWebで物色していたら
共立さんでヒントを発見

1bit双方向・バッファタイプレベルシフタIC TXB0101DBVR(http://eleshop.jp/shop/g/gB35411/

→I2C等のオープンドレインアプリケーションには使用できません。

1bit双方向・FETタイプレベルシフタIC TXS0101DBVR(http://eleshop.jp/shop/g/gB35415/

→FETタイプはI2C等のオープンドレインアプリケーションに最適。

オープンドレインというのは名前は聞いたことがあるが、ロジック回路を実作したことがないのでよくわからんが
多分そういうことだろう

中の図を見てもダイオードでのレベルシフトとMOS FETでのレベルシフトだ

疲れたので、これ以上I2Cのレベルシフトについて調べるのはまたいずれ

5Vで統一作戦


作るつもりの実験用両電源には、あんまりイチかバチかのものは使いたくないので、
今回は諦めて5Vで統一することにする。

よく考えれば
AVR用の5VとLCD用の3.3Vの2つ三端子レギュレータを用意するのもどうかと思うし

電源なのに中も電源ばっかりっていう

選択肢は2つ


  1. 3.3VのLCDを無理やり5Vで使う
  2. HDなんちゃら互換の5VのLCDを使う


2の課題はアルミ筐体にでかい角穴がうまく開けられるかどうかだ

空き缶とか百均でなんか仕入れてきて練習するかね

興味の矛先(万歩計液晶)

こんな無骨で、ソリッドで、コンパクトで、最低限度のギリギリの機能しか持たない液晶はないので、なんとかモノにしようと、こんなパターンの基板を作りました。(笑)
 I/Oが12本あれば…ってことはTiny2313でできるってことです。


コモンラインが何本あるかかな。
液晶は7セグメントが5文字分。つまり35箇所のスイッチングなわけです。
12本の信号なのですがどう割り振られているやら

2コモンですと最低18本の信号が要。
ステートコモンが3本で信号線9?3x9=27じゃ計算にあわないなー。


2014年9月28日日曜日

tinyぴゅんぴゅん。色々ボロボロ。


いやーつぶさにみてくとボロボロでしたね。そもそもクロック8分周してたあたりから…
紆余曲折はおいておいて、こんな状態です。


http://www.geocities.jp/denzeeen/denzi/sidTinyV2.txt
ソースはこちら。
まるで違うモノに。

ボリューム値は05-253でとれますので(電流制限抵抗の分圧で微妙になっている)
05-127が正弦波
128-250がノコギリ波
それ以上がカンカンです。

カンカンは似たようなことをやってるプログラムを見つけて、そこの波形計算ルーチンを仕込んでみました。

○問題はまずAD変換のオーバヘッド。
値が帰ってくるまでに時間がかかり、取得するとこで音が途切れてました。
ループの中で、音のジャマをしないようにAD変換をやるように変更しました。
測ってないけど、ようやくちゃんとしたSin波が出てそうです。

○gcc-avrですが多ビットの乗算除算を行うとガッと容量が増加します。
極力シフト演算がよさげかな。
まだryoさんのみたく、楽しげな音が出ておりません。
ちとそこのあたりを遊んでみたく。

○気がついたのだが、こいつのベースになってるボリュームアンプが絶滅。
昔は横浜市立中央図書館近くの100円ローソンですら見かけたものだが。
まだストックは5つくらいはあるのだけど。
代用になりそうなモノを見繕ってますがヘッドホン端子がついているようなのはなかなか。(昔は100円AMラジオなんかもあったんですけどね。)

tinyぴゅんぴゅん。とりあえず音が出た。


いろいろいい加減ですが


とりあえず、音は出てくれてます。
tiny13 内蔵4.8Mhz 最初全く音が出ずに謎でしたが
ループをいじったり、 64分周したらやっとこさ出てきました。
なんかPwmが速すぎたみたい。

端子からヘッドホン介して音を出してます。
映像上下逆は許せ。とりなおすのが面倒(笑)


波形を測定する手段がないので目的通りになっているかどうかは明確ではありませんが。
ソースコードはこんなにアバウトです。
http://www.geocities.jp/denzeeen/denzi/sndTiny.txt

ボリュームをいじると波形が選択できるというのを狙ってます。

ちょっと追い込むか。

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ってたいして違わないし)

2014年9月25日木曜日

まだしつこくSinテーブルやってたり。

なかなかに家で作業できないのでSinテーブルの追及をまだやってたりします。
より小さく、高精度に…的な。ほんとキリがなくて
理想のSinテーブルを求めた挙句、煮詰まって変なアプリ作りました。

http://www.geocities.jp/denzeeen/denzi/sinsvg.zip

元はmac上でビルドしていますがgccをWinGWでビルドしたexeです。

★使い方はちと説明に困るとこもあるんですがたとえば

1,円周を1024に分割したSinテーブルを作りたい。
2,粗引きテーブルは16おきに
3,テーブルの精度は8bitで

としたい場合

>sinsvg 1024 16 8

とします。

※現在のところ第3パラメータは8か16のみの指定です。

そーするとこいつはprintfでこんなソースコード(1024_16_8.c)を吐きます。

http://www.geocities.jp/denzeeen/denzi/1024_16_8.txt

これは8bit長の円周1024分割Sinルーチンを含んだソースです。Deg90度で256、180度で512、360度で1024です。
ルーチンはいろんなとこにコピペして使えます。

テーブルは下記の49バイトとなりました。
なんだ最後のcosPitchは、先頭と末尾以外255って(笑)

unsigned char sinTable2pai[17] = {0,12,24,37,48,60,71,81,90,98,106,112,118,122,125,127,127};
unsigned char sinPitchTable[16] = {0,1,3,4,6,7,9,10,12,14,15,17,18,20,21,23};
unsigned char cosPitchTable[16] = {0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254};

 
更にこの1024_16_8.cをgccなりVisualStudioなりでビルドして実行すると
メインルーチンがこのテーブルから出すSin値を使って、こんな↓図を出すhtmlを吐きます
svgって楽ね。html5の恩恵を初めて受けた気がする。

http://www.geocities.jp/denzeeen/denzi/1024_16_8.html



この図が上記49バイトで求められるSinテーブルの全体像となります。

でも…いろいろな条件で比較してようやく納得した。
確かに精度上げればジャギが消えて本当波が綺麗になめらかーになるけど↓
http://www.geocities.jp/denzeeen/denzi/1024_32_16.html





「だいたいでいいがね、どーせPWM8bitだし、ノイズ載るし。」(名古屋弁)
http://www.geocities.jp/denzeeen/denzi/256_8_8.txt




http://www.geocities.jp/denzeeen/denzi/256_8_8.html

思い切り最小構成にて、このSinカーブを出すための「2π=256」のテーブルは
以下の25バイトです。tiny13でも余裕。
(ルーチン修正すると先頭の0棄てていけるから22バイト)

unsigned char sinTable2pai[9] = {0,24,48,71,90,106,118,125,127};
unsigned char sinPitchTable[8] = {0,6,12,18,25,31,37,43};
unsigned char cosPitchTable[8] = {0,255,255,255,254,254,253,252};

2014年9月24日水曜日

両電源の電流電圧計 電位をずらして三端子レギュレータを入れてみる

AVRの駆動用に5Vの三端子レギュレータを試してみた

三端子レギュレータの単体テスト


三端子レギュレータは何回か使ったことがあるが、今回使うロードロップタイプは初めてなので
またまた単体でテスト

TLV1117というやつで、SOTだが2.30mmピッチなのでユニバーサル基板にも実装可能
ということでこれにした

が、さすがにブレッドボードにさせない(^q^;

他のIC用に買っておいた28Pinの変換基板があったのでちょっともったいないけど
これを使った



この間、I2CのLCDのキットで初めてSOTのはんだ付けをしたが
ブリッジしまくって痛い目にあったので
いつも使っているのより1サイズ小さいハンダゴテの小手先(ハッコーの2Cというタイプ)と
フラックスを仕入れて使ってみた

PINが1コとばしなので楽なはずだが、やっぱりあんまり綺麗には仕上がらなかった。

使いたくてもDIPじゃ出てない素子も結構あるので、SOTのハンダ付けも慣れるしかないなあ

後から考えたら普通のユニバーサル基板の切れ端にハンダ付けすればよかったかな

まあいいや(^q^;

テスト回路


TLV1117のDATA SHEETのアプリケーション・ノートにしたがって
IN側に10uF、OUT側に100uFの電解コンデンサを入れた

三端子レギュレータの作例ではよく0.1uFの積セラを入れてあるんで
実装するときはこいつにもおまじないで並列で入れておくか

220Ωの負荷で
負荷のRの両端の電圧 4.98V
レギュレーターのINに流れ込む電流 27.5mA
となった。負荷に流れてる電流は
4.98[V] / 220[Ω] = 大体22.6[mA]

100Ωの負荷にすると9V電池の出力が安定しなくなったので
単3×8の電池電源(これもヘタっていて9Vぐらいしか出ない)で実験

負荷のRの両端の電圧 5.00V
レギュレーターのINに流れ込む電流 55.8mA

となった。同じく

5.00[V] / 100[Ω] = だいたい50[mA]

なので、(めんどくさくてDATASHEETはよく読んでないが)こんなもんで良しとしておく

GNDの電位をずらしてテスト


大体5V出るようなので、GNDの電位をシフトした回路とつないだ





9V電池の容量が足りないので負荷抵抗1kΩで実験

負荷のRの両端の電圧 4.96V
レギュレーターのINに流れ込む電流 9.80mA

この時、負電源の電圧が-7.02V、正電源の電圧が5.84Vだった。

可変レギュレーターのキットを組んでからじゃないと、これ以上のテストはムリっぽい

GNDの電位のずらし方の改良


前回(http://dad8893.blogspot.jp/2014/09/blog-post_23.html)のシミュレーションでは
GNDの電位をマイナス側に引っ張る電源を、可変レギュレーターの負側からとっていたが
ここは別にレギュレーターを通す必要がなかった。


GNDからシャントレギュレーターの間の電位差は固定なので
回路図の(A)は大もとの負電源のマイナス側から取ってくればいい

なので、大もとの負電源の電圧が2.5V以上あれば
可変後の電圧が小さくても、シミュレーションで出ていた2.5V問題は起こらない(はず)

また、TL431のデーターシートを少し読んでみたら、出力インピーダンスは0.2Ωだったので
GNDのインピーダンスはほとんどR9の値になる(はず)

なんかスッキリした(^q^

実用的な改良点はまだありそうだが、これで行けそうな気がしてきた

2014年9月23日火曜日

Sinテーブルを極限まで(?)小さくする。

なんとなくtiny13でどーにかしようとしているドM野郎の冨塚です。

要は「マルツtiny85だと秋月tiny13が4つ買える。」ってことです。
(メモリは8倍なので得なのだけど)

全然電子工作エリアではないのですが
 如何にゼニをかけないかという点で
  セコセコと最小構成で遊びたいわけです。

○三角関数系でいかにメモリを小さくするかで色々考えてたら思い出しました。

以下のネタは、1980年代の8bitパソコンで3次元ワイヤーフレームアニメーションをやるため、いかに小さなメモリで三角関数を計算するか考えてマシン語で組んでたのがルーツです。
(なんせFM-7のサブシステム共有メモリは128バイトしかなかったのです、RGBの一枚を捨てて、VRAM上でプログラムを走らせてました。)

☆テーブルは60バイトでなんとかなっちまう。
 60バイトってのが重要で、tiny13のEEPROMエリアが64バイト。
 つまりフラッシュメモリの1kbyteをプログラム領域としてフルに使用できるのね。

☆0度から360度の1度毎のdegで精度はほぼ16bitです。

○ 下準備
1、0度から90度までのSin値を32768倍したものを10度毎に
  20バイトのメモリ上に置きます。
  (なぜこいつだけ32768にするのかは後述)

2、0度から9度までのSin値を65536倍したものを1度毎に
  20バイトのメモリ上に置きます

3、0度から9度までのCos値を65536倍したものを1度毎に
  20バイトのメモリ上に置きます

C言語的に書くとこんなね。数値はホンマにつかえます。

uint16_t sin90[10] = { 0,5690,11207,16383,21062,25101,28377,30791,32270,32768};
uint16_t sin10[10] = { 0,1143,2287,3429,4571,5711,6850,7986,9120,10252};
uint16_t cos10[10] = { 0,65526,65496,65446,65376,65286,65176,65047,64898,64729};


 このunsigned16bitの30配列だけで0-360度の三角関数をなんとかします。
まずSin値を求めたい角度の1の位を捨ててφとし、1の位をθとします。

4、先ずSinφとCosφを求めます。
○10度毎のSinφテーブルは90度までしかないのですが
100-180度はSin(180-φ) 190-270度は-Sin(φ-180) 280-350度は-Sin(360-φ)
で求めます。

○10度毎のCosφは上記に90度足してあげれば求まります。

5、次に1の位のSinθとCosθを求めます。
これはそれぞれ0度から9度までしかないので、テーブルを参照すればOk

6、この公式を使います。
     Sin(φ+θ) = Sinφ×Cosθ+Cosφ×Sinθ
 これで0度から360度のSin値が求まるわけです。
 
☆なぜ 10度毎のSinφの値が32768倍なのか。
 つまるところ整数値なので
 (Sinφ×65536)×(Cosθ×65536)+(Cosφ×65536)×(Sinθ×65536) / 65536;
   でいいのですが、これやっちゃうと計算中に32ビットで桁溢れします。
 まあlong64でやればいいんですけど、8bitCPUで64ビット演算なんかあんまりしたくないしバイナリコードがでかくなったら本末転倒。
 精度はオチるがSinφのテーブルは32768倍にして
 (Sinφ×32768)×(Cosθ×65536)+(Cosφ×32768)×(Sinθ×65536) / 32768;
 とやることでint32で計算できるというわけです。

2π=360でなく2π=256でやるなら
上位5bit(16バイト)下位3bit(32バイト)計48バイトでいけるか?

サンプルはgccでコンパイルできる普通のcのソースです。
※tiny13用ではありません。

#include <stdio.h>
#include <math.h>
#define PI 3.141592

unsigned short  sin90[10] = {  0, 5690, 11207, 16383, 21062, 25101, 28377, 30791, 32270, 32768};
unsigned short  sin10[10] = { 0,1143,2287,3429,4571,5711,6850,7986,9120,10252};
unsigned short  cos10[10] = { 0,65526,65496,65446,65376,65286,65176,65047,64898,64729};

int sin36(int d ) {
    d = d % 36;
    if ( d <= 9 ) return sin90[d];
    if ( d <= 18 ) return sin90[18-d];
    if ( d <= 27 ) return -sin90[d-18];
    if ( d <= 36 ) return -sin90[36-d];
}

int cos36(int d) {
    return sin36(d+9);
}

int sin16(int d) {
    int d36,d10,value ;
    int s36,s010,c36,c010;
    d = d % 360;
    d10 = d % 10;
    d36 = ( d - d10 ) / 10 ;
    s36 = sin36(d36) ;
    if ( d10 == 0 ) return s36*2;
    c36 = cos36(d36) ;
    s010 = (int)sin10[d10] ;
    c010 = (int)cos10[d10] ;
    value = (s36 * c010 + c36 * s010) /32768 ;
    return (int) value ;
}

int cos16(int d) {
    return sin16(d+90);
}

int main(void)
{
    int d , s16 , c16;
    double deg , rad , rsin , tsin, rcos ,tcos;
    double dsin ,dcos,dmaxs,dmaxc ;
   
    /*どのくらいの精度が出るのか、math.hと比較*/
    dmaxs = dmaxc = 0.0;
    for ( d = 0 ; d < 360 ; d+=1 ) {
        deg = (double) d;
          rad = deg * PI / 180.0;
          rsin = sin(rad);
        s16 = sin16(d) ;
        tsin = (double)s16 / 65536.0 ;
          rcos = cos(rad);
        c16 = cos16(d) ;
        tcos = (double)c16 / 65536.0 ;
        dsin = rsin - tsin ;
        if ( dsin < 0 ) dsin = -dsin ;
        if ( dmaxs < dsin ) dmaxs = dsin ;
        dcos = rcos - tcos ;
        if ( dcos < 0 ) dcos = -dcos ;
        if ( dmaxc < dcos ) dmaxc = dcos ;
        printf("sin(%.3d)  math.h[%1.6f]table[%1.6f]Gosa[%1.6f] cos(%.3d) math.h[%1.6f]table[%1.6f]Gosa[%1.6f]\n"

        ,d,rsin,tsin,dsin,d,rcos,tcos,dcos);
    }
    printf("max Gosa sin:%1.6f  cos:%1.6f\n",dmaxs,dmaxc);
      return 0;
}


2014年9月21日日曜日

両電源の電流電圧計 負電源の測定

AVRのADCはそのままでは負電源の測定ができない(http://dad8893.blogspot.jp/2014/09/blog-post_7.html)ということで小細工することにした

OPAMPの反転1倍アンプで正負を反転


せっかく両電源の可変レギュレーターを作るので、OPAMPで反転してやればいいやん
と、単純に考えてシミュレーションしてみた



回路図のV1が正電源、V2が負電源だ

正負ともRで1/4に分圧する

測定用の負電圧(Measure-)をU1の反転1倍アンプでGNDを境にプラス側に反転させている

DC Sweepで、V1、V2共に0~15Vまで1V刻みでシミュレーションした

明らかにおかしい

まず、測定用の負電圧(グラフの赤色)が変動している

1/4に分圧しているので-10Vで-2.5Vにならないといけないはず

原因は明らかで

反転1倍アンプの入力インピーダンスが低すぎて、分圧用のRと干渉している

R3が
(R5 + R7) // R3
になって、分圧比がおかしくなっているんだと思う

もう一つ、反転した電圧(グラフの緑色)が、1V(や2V)で頭打ちになっている

これは正電源の分圧前が1Vで、負電源が-4V以下になった時に起こる

例えば-8Vを1/4にして-2V、反転させて+2Vだぜ~と言ってみてもプラス側の電源が+1Vしかなかったら+1Vしか出しようがない

あたりまえだ

安定化する前ならエネループ20本で±12Vぐらいとれるが
安定化しないで使うのも気色悪い

トランスで商用電源を使う前提だとなおさらだ

深追いすると深みにハマりそうなのでこの問題はとりあえず目をつぶっておく

前途多難の予感。


単純に入力インピーダンスを上げてみる


FET入力のOPAMPならMΩレベルのRを使っているのを見たことがあるので
反転アンプのRの値を増やしてみた



赤色のグラフはまあまあ許容範囲におさまったか

手計算しても、10kΩが9.93kΩになって誤差0.7%程度だ

なので、シミュレーションで使っている理想OPAMP(Universal Opamp2)を実際使う予定のTL072に差し替えてシミュレーションしたが

LTSpiceのシミュレーションが終わらない

過渡解析ならパラメータいじって計算時間を減らせるみたいだが
DC SWEEPはよくわからん

他のOPAMPならどうかな~と考えていたら

OPAMPには動作電圧っていうものがあること思い出した

DATA SHEET調べてみたらTL072は±4V~ (^q^;

-4V以下の電圧は反転出来ない

手持ちのOPAMPだとLM358が±1.5V~なので、これでブレッドボードで試作




※回路図のMeasure+をMeas+、Measure-をMeas-、NegMeasure-をNegM-としています(以下同)

正電源 4.03V
負電源 -4.04V
Meas+ 1.006V
Meas- 1.000V
NegM- 0.986V (誤差1.6%)

正電源 1.533V
負電源 -1.518V
Meas+ 0.383V
Meas- 0.376V
NegM- 192.2mV (←もうダメです)

正電源 1.99V
負電源 -2.01V
Meas+ 0.498V
Meas- -0.496V
NegM- 0.490V (誤差1.2%)

ボルテージ・フォロワーを入れてみる


回路を分離するならボルテージ・フォロワーだろということでこちらでも実験



緑色のグラフは目をつぶって、赤のグラフはまあまあOK
正電源 3.98V
負電源 -4.02V
Meas+ 0.996V
Meas- -1.002V
NegM- 1.014V (誤差1.1%)

正電源 1.495V
負電源 -1.522V
Meas+ 0.373V
Meas- -0.379V
NegM- 144.2mV (^q^;

正電源 1.98V
負電源 -2.02V
Meas+ 0.496V
Meas- -0.503V
NegM- 0.509V (誤差1.1%)
反転アンプのRの誤差が5%なのでどちらも許容範囲だが
部品点数が増えるのを我慢すればボルテージ・フォロワーの方がよさそうだ

反転アンプの入力インピーダンスを上げる方法としては
調べてみたら他にもT型帰還回路というのもあるようだ

GNDの電位をずらす


師匠(toz氏)にアドバイスいただいた方法だ
測定する電位を、AVRのGND - AREFに納めればいいので
AVRのGNDを測定用のGNDより負側にシフトしてやればいい


可変レギュレーターを通した後の電位として信頼できるのはGNDだけなので
GNDからシャントレギュレータで-2.5Vの電位差を作った

TL431を使う予定だが、LTSpiceに部品としてなかったのでLT1009で代用

V3の5Vの電圧源は5Vの三端子レギュレータのつもりだ

DC Sweepしてみたが、グラフはスッキリしている

±2.5Vまではあやしいが、並行しているので大丈夫かも

頭がが回らなくてどういう結果になるかイメージ出来ないのでブレッドボードで実験することにした

まず、シャントレギュレータという部品を初めて使うので単体で



2.54Vなので誤差1.6%だ

アノードとかカソードとか言われてもどっちがプラスかマイナスかちょっと考えないとわからない

しかもツェナみたいに普通のダイオードとは逆に使う

さらにRefという端子もあって、結構混乱した。

Refに与える電圧で基準電圧を可変出来るみたいだが
今回はパスして初志貫徹でデフォの2.5Vで使うことにする

なので、AVRは5V駆動すれば2.5Vのシャントレギュレータでちょうど半分

あれこれ考えなくてもよさそうだ

I2CのLCDが3.3Vなのでこっちは後でちゃんと考えよう




オペアンプで反転作戦と較べてあからさまに部品数が少ない

※シャントレギュレータで負側にシフトしたGNDをV-GNDとしています

正電源 4.04V
負電源 -4.08V
V-GND -2.54V
Meas+ 1.009V
Meas- -1.017V
V-GND - Meas+ 3.55V (1.01V) ←()内はV-GNDを引き算した値
V-GND - Meas- 1.526V (-1.041V)

正電源 1.511V
負電源 -1.525V
V-GND -1.516V
Meas+ 0.377V
Meas- -0.382V
V-GND - Meas+ 1.90V (0.384V)
V-GND - Meas- 1.140V (-0.376V)

予定している共立の可変レギュレーターのキット(http://eleshop.jp/shop/g/gD5E413/)の仕様が
±1.25Vからなので、意地悪テストもしてみた

正電源 1.265V
負電源 00.0mV
V-GND 00.0mV
Meas+ 0.316V
Meas- 00.0mV
V-GND - Meas+ 0.316V (0.316V)
V-GND - Meas- 00.0mV (00.0mV)

正電源 00.0mA
負電源 -1.258V
V-GND -1.258V
Meas+ 00.0mV
Meas- -0.314V
V-GND - Meas+ 1.255V (-3mV)
V-GND - Meas- 0.941V (-0.317V)

単純な足し算引き算の世界だし、結果もほぼ完璧に近い

シャントレギュレータでGNDの電位を作り出しているのでインピーダンスが気になるが
多分R9の抵抗値で加減できそうだ

TL431は100mAまで流せるし
このGNDで駆動するのはAVRとLCDだけなので
注意するのはLCDのバックライトぐらいだろう

電位をずらす作戦でいくことにして、3端子レギュレーターを含めてもうちょっと実験してみる

こんな激安実験パッケージ如何すか?


セリアや100円ローソンで売ってる108円アンプの基板を眺めてたら

…これ、基板、そのまま使うの良くねーか?っとおもいついたので
attiny13を駆動させる実験パッケージにしてみました。

 使ってるのは以下のモノです。
 1、セリアオーディオアンプ 108円
 2、ダイソー万歩計 108円
 3、ATtiny13 54円
 4、8pinICソケット 20円
  5、配線材少々

 300円弱のパッケージですね。

○108円アンプの加工。

単4が2本で3Vがとれ、スイッチボリュームがあり
入力用オーディオプラグケーブル、出力オーディオジャックがついております。




裏を開くとこんなです。
ハンダづけも微妙にアレですが、問題なくアンプとして駆動しております。
なぜかGNDに赤い配線という違和感。



電池の配線と、オーディオプラグ(後で使います)の配線をはずして基板だけ取り出します。
よくこれだけの部品を使いながら100円で売れますね。


こっから以下の部品を除去します。部品箱行きです。
 オペアンプ
 1Ω抵抗
  1kΩ抵抗(後で使います)
 10uF電解コンデンサ
 103セラミックコンデンサ
 104セラミックコンデンサ(1Ωの抵抗の近く)

取り外しにはハンダ吸い取り器を使いました。
自分は学生時代から部品とりはこれでやってます。
上手に使わないと基板のパターンを痛めますが。

基板上に残るのは
 スイッチボリューム
 220uF電解コンデンサ
 104セラミックコンデンサ(ボリュームの近く)
  オーディオジャック
の4部品です。


 オペアンプのついてたとこに
 ICソケットをつけ、
 取り外した1kΩの抵抗を、写真のようにナナメにつけます。



  さすがに思いつきのままには行かず、基板加工要でした。
  4箇所パターンカットします。 
 1、電源からICの2番ピン(OPアンプへの電源供給)パターン
 2、ICの6番ピン根元
 3、ICの3番ピンとオーディオジャックGNDを接続するパターン
 4、ICの1番ピンとオーディオジャックの上端子を接続するパターン    


  更に3箇所ジャンパします。
  1、GNDからオーディオジャックのGND端子
 2、VCCからICの8番ピンへ電源供給。
 3、ICの6番ピン根元からオーディオジャックの出力へ外部Out



 前回の「tiniy13デバッグ」とほぼ同じプログラムをtiny13に書き込みソケットにさします。
 (パルス出力をPB1に、ADコンバータ入力をADC2に変更、実は他にもいじったけど)
 



回路構成です。シンプルです。
IOポートはまだ3本空いています。センサやスイッチやLEDがつけられます。
PB0からボリュームへの電力供給してますがVccからにすれば
もう一本ポートがあけられます。(電池の消費は大になりますが)





○万歩計の加工

 取り外したオーディオプラグを、ダイソー万歩計内部のRESETスイッチに
 写真のように接続します。
 RESETスイッチの右側にはGND、左側に信号がくるように。
 また万歩計内の赤配線もRESETスイッチ左側に接続します。



  オーディオプラグをショートさせるとカウントアップされることをチェック。




  で、ふたつをつなぎます。当然、前のと同じ動きをします。
  何がいいかって、乾電池とスイッチですがな(笑)
 miso mosi reset sck gndを外に出してプログラム書き換えたいな。

  



○このパッケージの枠でなんか作りたいなと。


★ちなみにオーディオ出力に無理矢理PB1を使用したのはPB1がtiny13のPWM出力ゆえ。
 上手く使えばボリューム値=>tiny13で加工した音声信号がヘッドホンに出せるかもなわけです。

 可変要素は1つだけだが、Tinyぴこぴこが作れるか?



#include <avr/io.h>
#include <util/delay.h>

#define cbi(addr,bit)     addr &= ~(1<<bit)
#define sbi(addr,bit)     addr |=  (1<<bit)


void delayms(int ms) {
    int n;
    for(n = 0 ; n<ms ; n++)
        _delay_ms(1);
}

void pulseOut(int ms,int wait) {
    cbi(PORTB,1);
    //指定ミリ秒間出力0を維持
    delayms(ms);
    sbi(PORTB,1);
    delayms(wait);
}

//指定チャネルからADC値を8ビット取得
uint8_t getADC(uint8_t ch)
{
    ADCSRA |= _BV(ADEN);
    ADCSRA |= _BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0);
    sbi(ADMUX,ADLAR);//上位8bit
    ADMUX |= ch;//ADCchセット
    sbi(ADCSRA,ADIF);
    sbi(ADCSRA,ADSC);
    loop_until_bit_is_set(ADCSRA,ADIF);
    return ADCH;
}


int main(void)
{
    int rstwait = 400;//resetパルス幅
    int clkwidth = 2;//Sigパルス幅
    int clkwait = 10;//パルスの待ち時間
    uint8_t outvalue = 0;//万歩計への出力数値
    uint8_t innervalue = 0 ;

    int timepassed = 0 ;//だいたいの時間経過
    int timeth = 60 ;//強制resetをかける経過時間
   
    //AD変換可能なポートを入力に設定
    DDRB = ~0b00111100;
    PORTB = 0b00111100;
   
    //ポートB0(pin5)を出力に設定
    sbi(DDRB,0);
    cbi(PORTB,0);
    //ポートB1(pin6)を出力に設定
    sbi(DDRB,1);
    //万歩計に0.5秒間0を入れて初期リセット
    pulseOut(rstwait,clkwait);
    innervalue = 0 ;
   
    //メインループ
    while(1){
        //①ADC1(pin7)より電圧のAD変換値を取得。
        sbi(PORTB,0);//抵抗に電圧を与える
        _delay_ms(5);//安定するまでちょっと待つ
        outvalue = getADC(1);
        cbi(PORTB,0);

       
        if ( outvalue > innervalue ) {
            //②現在保持している値よりADC2の値が大きければ
            //1パルス入れカウントアップ
            pulseOut(clkwidth,clkwait);
            innervalue++ ;
        } else if (  outvalue < innervalue  || timepassed > timeth ) {
            //③逆に小さければ、万歩計をリセット。

            //時間経過で液晶がOffになるので適当にリセット入れる
            pulseOut(rstwait,clkwait);
            innervalue = 0 ;
            timepassed = 0 ;
        } else {
            //変化がない場合は0.1秒待つ
            _delay_ms(100);
            timepassed ++;
        }
    }
    return 0;
}




2014年9月19日金曜日

Mixerの電源ACアダプタ計画 運用テスト中

ユニバーサル基板をカットして部品を実装した


220Ωと150Ωの抵抗をつないでテスト

4.5V / 220Ω = だいたい20mA
4.5V / 150Ω = だいたい30mA

正負の電圧誤差は1%以内だった

最初、分圧前のプラス・マイナスを間違えて接続してしまって
TLE2426がかなり発熱した

長時間、間違えたままだと、たぶんぶっ壊れるだろう

普通につないでも負荷用の抵抗が結構発熱していたので、TLE2426が生きてただけでもありがたい


大丈夫そうになったので仮想グランド基板を電池と差し替えてテスト


これはすんなりいった

ユニバーサル基板から配線を直出しすると後の修正が大変なので
ピンヘッダに取り替えつつ

「(多分間違ってそうな)実体配線図」



を元にコネクタ類を配線。

ACアダプタをつないでドキドキしながらスイッチ・オン

ちゃんと、電源チェック用のLEDもついたし音もでた!ラッキ~(^q^/

じゃあ、今まで使ってた電池に切り替えてと…

ん?LEDつかない?

え?音がでない?

なんかくさい

やべえ(^q^;

DCプラグ引っこ抜くわwwww

電池も熱いしwwww

さわれないぐらい熱いわコレwwww

必死でその場にあったドライバーを使ってなんとか電池を外した。

電池ボックスは熱で一部トロけていた




改めて(あやしい)実体配線図を見ながら確認してみると
実体配線図ではなくて、現実の配線を間違っていた

3回路2接点のトグルスイッチは9Pで見た目はこうなっている



縦横間違えて配線してしまっていた

スイッチを切り替えた瞬間、電池が短絡(^q^;

たとえ電池と言えども気を許してはいけないことを悟りました。

回路とエネループとスイッチは無事だったのは不幸中の幸いだった

今回はじめて台湾製じゃなくてミヤマのトグルスイッチを使ってみたが
ハンダ付けもしやすいし、信頼性の面でもプラス加点しておく

OPAMPを壊れてもいい(自分の中ではリファレンスOPAMPになりつつある)
TL072とNJM4556Aに差し替えて実験



消費電流は

ACアダプタ
  DC: だいたい21mA
  AC: だいたい0.18mA (入力する音声によって0.23mAぐらいにもなった)

エネループ
  正電源 だいたい20mA
  負電源 だいたい20mA

電流値は正電源→GND + GND→負電源 ではなくて、正電源→(GND)→負電源 と考えるとこうなるのか

ACアダプタの方が電圧が若干高いのでこんなもんか


部品を所定の位置におさめて運用テスト中



しばらくは、不在時や寝てる時は電源切るようにしないと危ないと思う

ACアダプタと電池電源の時のノイズや歪率の計測はそのうち

↓回路図等資料はこちらで公開しています
https://github.com/ryood/Mixer