2008年01月07日

USB910A rev2 の 差動入力ADC 機能の評価

USB910A rev2 の構想の続き

USB910A rev2 を作ってみた。ノイズ対策をしたつもりだったので、微小電圧を測定してみた。

33 mV を測定してみる

3.3V の VCC を 10KΩと 100Ωで分圧し 33mV にして 220 uF ほどのコンデンサで安定化しておく。

これを 差動入力の機能で測定するとどうなるか?

これがその結果




AIN1/AIN2 , AIN5/AIN6 と名前を付けた 2組の 差動入力で、どのような値になるか見たもの。BIN は、両極動作。0 のところの線は、通常モードで、逆電圧を測定したときの値。

± 50mV しか測定できないのだが、ノイズがすごい。

拡大したのが、これ



34 mV 弱が中央値のように見えるが、± 3mV ぐらいぶれている。3 回測定して、真ん中の値を選ぶようにしているのだが、それぐらいでは全然だめらしい。

データシートを良く見たら、ADC と共用のピンを出力にする場合は、ADC の測定中は ON/OFF するなと書いてある。なるほどその通りだろう。しかし、ATtiny861 は ADC のピン数が多く どれかを USB の信号線に割り当てなければならない。USB は 1ms 毎にフレームが来るので ON/OFF しないこともできない。

困ってしまったのだが、64 回!測定して平均を取ってみたら次のようになった。



なんか良いかんじだ。拡大してみると ...



こんなふうになった。値が 2 組に分かれているのがわかる。上が 通常モード、下が BIN モード。PIN によらず 1mV 弱の差があるようだ。ノイズは ± 0.5mV にだいたい入るようになった。

64回も測定するのにどれぐらい時間がかかるか計算してみる。ADC クロックは 12MHz/64 = 187kHz 。1回に 13 クロックかかるのを 64回行っているので、225 Hz 。テスター機能と割り切れば使えないことはないだろう。

0V を測定してみる

では、0V を測定したらどうなるのか。一般にオペアンプによる差動入力は 同相入力の問題があって、0V 付近や VCC 付近は最も厳しい条件になる。ほんとうに rail-to-rail でないと正しい測定値は得られない。
参考:電子回路の豆知識



なんだか幅がある。拡大すると ..



明らかに 2 つに分かれる。BIN モードでは全部 - 0.5mV ぐらい。通常モードでは、(逆電圧でも) + 0.5mV ぐらいになった。

これでも結構すばらしいのではないか。自分でオペアンプを使って組んでもこういうふうにはなかなかできない...と思う。

ちなみに、VCC 付近も 大丈夫なはず。( 電流計機能として確認)

0V を測定してみる 2

最小のレンジでは、微妙にオフセットがあることがわかった。他のレンジではどうなるのだろう?

サポートしているレンジ全部調べてみた。







レンジが大きいほどオフセットの差が大きい。最大 3300mV の場合、その差は、40mV ほどになった。でも、レンジが 66 倍違うから精度に見合った誤差ということになる。

そして、PIN に関係なく、通常モードと BIN モードに差があるのは、どのレンジでも同じ。

こういう傾向があるとわかれば、多少精度を上げられるかも知れない。


33 mV を測定してみる 2

ついでなので、33mV がどうなるかも調べてみた。







ちょっと予想と違う。3300mV と 1650mV のレンジの特性をどのように解釈したらよいのだろう。
posted by すz at 22:43| Comment(0) | TrackBack(0) | USB910A

2007年12月26日

USB910A rev2 の構想

最初に USB910A をつくってから、ADC の特性を調べたりして、実際に使ってきて、だいぶ知識が増えた。使って来て不満な点もいくつか出ている。そろそろ 改良した rev2 を作ろうと思う。

1) 基板レイアウト



これが最初のレイアウトなのだが、まずケースのフタが付けられない。ターゲット基板と接続する使い方を想定したので、フタが付けられなくても良いといえば良いのだが、保管したり、持ち運ぶときのために、フタがあったほうが良い。rev2 では、コネクタを縦方向につけようと思う。

次に、接続用に ピンフレームを使っている。これはテスト用のボード側で安いピンヘッダーを使うことを考えたのでそうしたのだが、ISP コネクタ(自分配列)を別に付けることになってしまった。
rev2 では、ピンヘッダーを使い、ISPコネクタ と共用することにする。(出力と RESET は、スライドスイッチで切り替える)

そして、ピンヘッダーを ブレッドボードEIC-801に指せるようにする。そのためには、部品が ブレッドボードと干渉しないようにする必要がある。具体的には、USB コネクタや ATtiny861 を片側に寄せてピンヘッダー側には(抵抗とか)背の低い部品しか置かない。

ブレットボードには、部品面を下にして挿す。EIC-801 で干渉しないことだけ確認してレイアウトを決める。EIC-801 より幅があるブレッドボードには挿せなくともやむを得ないと割り切る。現物を持っていないし、第一これ以上デッドスペースを増やすのは無理だと思う。

2)電源周り

USB910Aはもともと簡易テスターとして使えることを主目的として作った。が、相対精度はともかく絶対精度が悪く使うたびにキャリブレーションしたりして使い勝手がわるい。そのうえ、ノイズが結構のっている。

たとえば、これ ↓



バッテリーの放電特性を調べたときのものだが、グラフにしてみると、全体の形は、ちゃんと曲線になるが、こまかく見るとギザギザである。

拡大したのが↓


ぶれの幅が 50mVぐらいあるようだ。10K と 1.5K で分圧しているので、USB910A 自体のぶれは 6-7 mV 。

これをどうにかしたい。

まず 5V は切り捨てる。そして 3.3V 用に 精度の良いレギュレータを使うことにする。デジキーでしか入手できないかも知れないが MCP1700-3302 Eは、精度 0.4 % 250mA でしかも 25個 980円とかなり安い。rev2ではこれを使おうと思う。データシートを見ていると温度特性も良いようだ。

その上で、AVCC には、LC フィルタを入れる。インダクタは、いつもの LAL02NA (47uH)を使い、コンデンサは10uF を使うつもり。

AREF には、選別した同じ抵抗値の抵抗 2 個で分圧した 1/2 AVCC (1.65V) にしようと思う。同じ抵抗値を選ぶだけなら、あまり信頼できないテスターでもなんとかなるはず。

同じ抵抗値のものを選別する場合 5-6本から選別すればよいだろう。場合によっては 10本必要かも知れない。注意点は抵抗を手で持たないこと。温度変化で抵抗値が変わる。

ちなみに、テスターは、秋月で売っている P-16がお勧め。絶対精度はわからないが、再現性が良いので、自分の基準測定器にしている。
これで、MCP1700-3302E の電圧を測定したら、3.305V だった。何度計っても同じ値。AREF の電圧は、1.653V になった。


(回路図掲載予定)

これに伴いピン配置が変わるし、内蔵基準電圧も使えなくなる。ファームウェアソフトも変更しないといけない。

3) 入出力ピンの定義

アナログ入力に 33KΩを付けただけにしていた。これだと入力にしか使えない。それは良いとしても入力専用ならコンデンサを付けるなどノイズ対策をすべきだろう。

クロックが 12MHz なので、ADC クロックは、1/64 の 187.5 kHz にしている。連続してADCを動かす場合は、13 クロックかかるので、14.4 ksps ということになる。 1 / 2 -- 7.2 kHz 以上の周波数が入力されないように 33KΩの本体側に 0.01 uF を入れたらよいのではないか? これだと cutoff 周波数は 0.5 kHzぐらいになる。

ファームウェアの整備

rev2 を作るのにあわせて、AVR-CDC のバージョンをあげようと思う。いったんバージョンアップしたのだが、Linux でうまく動かないので面倒になって元に戻してしまった経緯がある。だいぶ USB について勉強したので、今度は大丈夫だろう。

そうした上で、AVR-CDC にちょっとした改造を入れようと思う。COM デバイスを open すると、Linux でも Windows でも SET_CONTROL_LINE_STATE が 来る。そのときにデバイスを初期化しないと、正常に通信できない場合が出てくる。この処理ができるように改造したい。

あと USB910 ではなくなってしまうが、libusb のみ使うファームウェアも作ってみたい。

ホスト側ソフトの整備

いままでは、ちょっと作って使っていたが、使い方が決まっているものは、ホスト側のプログラムを整備しておこうと思う。
posted by すz at 19:44| Comment(0) | TrackBack(0) | USB910A

2007年03月16日

クロック周波数と消費電流の測定

いくつかのテストも兼ねて、ATtiny44 と ATtiny861 のクロック周波数と消費電流の関係について測定してみました。このテストでは、OSCCAL を変更してRC発振器の周波数を変更するだけでなく、CPU クロックのプリスケーラ(CLKPR)も変更しています。

これは、ATtiny44 の周波数と消費電流の関係。USB910Aの電流計の値が振れるので、どれぐらい振れるか見るために1つのOSCALの値について3回測定して全部プロットしています。8MHzで電源電圧が 3.3V→5V になるとだいたい2.5 倍。消費電力なら4倍も違う感じです。それだけでなく、5V のときは周波数を落としてもあまり消費電流が減らない。

こちらは、ATtiny861です。全体的に消費電流が増えているものの似たような傾向です。データシートに書いてある特性と大分ちがいます。ADC や内部基準電圧を Enable にしているので、その影響が大きいのかもしれません。
それはともかく、なにをテストしたかったかというと、1つは I2Cスレーブが CLK/2 の周波数までちゃんと動くのかという点。USB910のI2Cマスタは、I2C ROM の 3.3Vの特性に合わせて 400kHz ぐらいのクロックにしていますので、1MHz 以上なら動く予定でした。実際 1Mz にしても大丈夫なようです。このテストとは別に 3000 回ほどアクセスしてみましたが、ノーエラーでした。ちなみに さらにクロックをさらに落として 0.5Mhz にすると、90%ぐらいはちゃんと通信できるものの、残りの10%ぐらいはダメでした。
もうひとつは電流計のテスト。 付加回路がまったくない ATtiny44 の方を見ることにすると、最小と最大の差がだいたい 0.5 mA ぐらい。フルスケール 80mAですが、ノイズ対策をきっちりやっているわけでもないので、こんなものなのかも知れません。(ちなみに、この測定データはキャリブレーションしていないものです。5V のときは 5%ぐらい高めの値になっているはず。)

電流計の機能をとりあえず作ってみたものの、VCC付近の微小な電圧差をちゃんと測れるのかどうかというのが不安でした。こういうのを測定するには(普通は)rail-to-rail のオペアンプが必要になります。そういうオペアンプは(自作レベルでは)高かったり入手が難しかったりします。それだけでなく、配線も面倒。けっこう信頼できそうなので安心しました。


追記 ATtiny45v の消費電流



ついでなので、ATtiny45v の消費電流もとって見ました。8MHz では、ATtiny44 よりわずかに消費電流が大きいという結果でした。それはともかく、5V でもクロックを落とすと消費電流が落ちていきます。こいつはデータシートに載っているのと同じような特性でした。

追記 ATtiny26L の消費電流



ATtiny26L の消費電流もとって見ました。こっちもデータシートに載っているのと同じような特性でした。

追記 ATtiny26L の消費電流(USB910の typeA と typeBの差)



こちらは、同じ測定を typeA と typeB でして値がどれだけ違うかのテスト。typeB は周波数は測定できないので、typeA の測定と同じ周波数だと仮定しています。これみると値がずれていて typeB で使っている ATtiny44 のオフセットが -1mV ぐらいあるような感じ。これってオフセット校正ってのをやれば校正できるのかなぁ?
posted by すz at 23:32| Comment(0) | TrackBack(0) | USB910A

2007年03月15日

DCモータの回転数検出(1)

いんちきオシロで書いたように、100us 間隔の PWM を 201usでサンプリングすると波形が見えてきました。200us でサンプリングするとどうなるか ... というと波形の同じところを見ることになります。波形をよーく見ると、山にあたる部分が右さがりになっています。ここが回転数によって微妙に違ってくるはずです。



これがそのグラフ。duty 比をあげると回転数も上がりますが、回転数に比例してギザギザが増えているように見えます。でも本当なんでしょうか? このグラフの横軸はサンプリングで、200 us 間隔(5kHz)です。duty 35% をみるとなんとなく、山が24個ほどあるように見えます。1 回転について 2 つ山があるとすると、5000 Hz * 24/200/2 * 60 = 18000 rpm になってしまいます。(もちろんそんな高回転では回っていません) 。モータの代わりに抵抗にしてみると一定の値になるので無関係ではなさそうですが、ひょっとしたら別のノイズかも知れない(電源とか)。回転数に比例していたとして、この波形から周波数に変換できるのか?というのも問題。duty 35%の場合、最小値と最大値の幅が狭いので、なかなかうまくいかなさそうです。だいたいの回転数がわかっている常態なら、デジタル処理でBPF をかければ、追従できるだろうなんて安易に考えていました。
実は実際に回転数を制御したいモータがあります。電動ドライバーをばらして出てきた 3.6V 仕様の 380サイズのモータ。なにに使っているかはいずれ日記に書くつもりですが、とりあえず秘密。実験とはかなり違うものなので、ターゲットのモータで試したほうが起電力が大きくて良さそうに思えてきました。
posted by すz at 20:40| Comment(0) | TrackBack(0) | USB910A

2007年03月14日

いんちきオシロ

波形をキャプチャーするものを作っていたのですが、とりあえず波形らしきものを取ることに成功しました。



これは、次の回路で 10kHz の PWMで トランジスタをスイッチングして、コレクタの電圧を測定したもの。Tiny44 の ADC で取ったデータを I2C ROM (AT24C256)に書き込んでおいて、後でホストに吸い上げてグラフ化しています。サンプリング間隔は、201 us (5KHz) で、1us づつずらして採取することで、100 点のデータを得て波形にしています。
なにがいんちきかというと..同期部分で、PWMもサンプリングも同一クロックなので、単に計算するだけできっちり合わせられているところです。汎用にするには、いろいろ面倒なことをしなければならないかも知れません。あと波形も実際とはだいぶ違うはずです。



波形については後にして、回路の説明。これは、前に書いた昇圧回路をベースに小型の振動モータを回す回路にしています。電源電圧は、3.3V 。モータは秋月でかつて売っていたもの。先についていたおもりははずしています。(ライターで10秒ほどあぶれば、ラジオベンチで引っこ抜けました。)ADC は、モータの起電力を読み取ろうと思ってつけています。ここでは書いていませんが、I2C ROM を ATtiny44 のあまったポートにつけています。あと(特に必要ではないのですが) 2.5V の基準電圧を VREF に入れています。

波形について



これは、モータのかわりに 150Ωの抵抗を入れたとき採取した波形。
本当はそれなりに綺麗な方形波のはずですが、RC LPF に充放電している典型的な波形にしか見えない結果になっています。 4.8kHzぐらいのcut-off周波数になっているので、波形を見るのが目的ならば、1000p かもう少し小さめが良いのではないかと思います。ただし、あんまり小さくすると ADC の Sample and Hold がうまく働かなくなってしまいます。

プログラムについて

プログラムは、やっつけで作ったものなので、基本的にたいしたものではありません。USB910のソースに添付した i2cスレーブドライバと USB910で使っている i2c マスタをベースにして、I2C ROM にキャプチャーするところと、HOST から I2C ROM の内容を読み出す機能をつけただけという感じです。後で整理して公開しようと思いますが、基本的にASISです期待しないでください。

ちなみに I2C ROMには、64B のバッファを使って、最大で 5.8KB/sec ぐらいでオーバーフローすることなく書き込みできました。日記で大失敗と書きましたが、役に立たないほどのことはなくてよかった。
usb910-0.2に添付しました。(ディレクトリ capt 以下) ドキュメントがほとんどないですが、とりあえず。


最後に

もともと、DCモータの回転数を読み取って制御するものを作ろうとしたのですが、そちらのほうはなんだかうまくいっていません。計画では、PWM の OFF の期間に電圧を読みとれば、回転によるむらが見えると思ったのですが...ノイズにしか見えていません...モータが小さすぎるのか 。もうすこし試行錯誤してみて、成果があれば、載せたいと思います。
posted by すz at 18:10| Comment(57) | TrackBack(0) | USB910A

2007年03月09日

昇圧型DC/DCコンバータの特性を調べる

昇圧型 DC/DC コンバータの原理はわかるけれども、どんなコイルで周波数をどれぐらいにして、duty 比率をどうするのが良いのかというのはなんか難しくて、サッパリわかりません。USB910を作ってやってみたかったことのひとつは、それを調べてみること。簡単な回路を作ってPWM周波数とduty比と負荷を変えるとどれぐらの出力になるかを調べてみることにしました。

回路図


作った回路はこんなやつ。はなから大電流を流すことや効率は無視してチープなものにしました。コイルは 秋月で 10個100円の LAL02 (47uH) こいつは 5.3Ωで最大 70mA が定格。スイッチングには、2SC1815GR を使うことにしました。また、整流用のダイオードも 普通はショットキーバリアダイオードを使いますが、今回は 秋月で 50個100円の 1N4148にしています。入力側のコンデンサは最初 1.5uF でいいかと思ってつけたのですが、電流測定でのノイズがひどいようなので、22uF の積層セラミックを追加しました。(あんまり関係なかったかも知れません。でも 10uF ぐらいは必要そうです。) 出力側は、テストで、電圧が上がりすぎるおそれがあるので、50V 耐圧の 4.7uF 電解コンデンサにしています。( やってみたらそんなに電圧を上げられなかったので、16V 耐圧の積層セラミックでも問題なさそう。) トランジスタのベースの電流制限抵抗は 4.7K にしてみました。hFE が 100 あれば 100mA ぐらい電流を流せるはず。それは良いとして、turn-off の特性が悪そうなので、後で ダイオード(D2)を追加しています。
この回路の負荷ですが、まず電圧測定用に 10KΩ+2.2KΩをつけています。2.56基準電圧で 14.2 V まで測定できる計算。それに加えて 出力 On/Off の PNP トランジスタと On 時の出力側に 10K Ωのプルダウン抵抗があります。合計すると 出力 On のとき 4.0 KΩぐらいの負荷になります(load1)。On/Off 以外に抵抗を直接させるようにしていて、そこに 1kΩを入れると 0.93KΩの負荷でこれを load2 としました。

測定1 250KHz の PWM で duty 比を変えていき、入力電流と出力電圧を採取する。(D2 あり/なし)


D2 なしの場合、duty比を 20%以上にしてもほどんど電圧が上がらない結果になりました。あまりに早く飽和してしまうので、turn-off の問題だと思い、ダイオードを入れてみたら、40%ぐらいまでは電圧が上がっていくようになりました。

測定2 PWMの周波数を 500KHz にしてみる。

duty 比 40% までしか電圧があがらないのなら周波数をあげればよくなるのではないかと思い 2 倍の周波数にしてみました。そうしたら 65%ぐらいまで電圧がリニアに上がるようになりました。この特性ならば、うまくフィードバックできそうです。
そういえば秋月の1.5V電池☆白色LED投光キットがこれぐらいのバランスですね。D2相当のダイオードが入っていないので、入れてみるとより明るくなるかも知れません。

入力電流を調べてみる

いままでの測定の duty比と入力電流の関係です。これをみるといろいろ気になることがあります。まず、duty 0% 相当(スイッチングはしている)のときなんでこんなに電流が流れているのか? 500KHZにしてもそれほど電流は増えていないので、スイッチングのロスは相対的に小さそうです。また、負荷抵抗の分もload2 で 4mA ぐらいなので、あまり大きくありません。そうなると、コントローラに使った tiny861 がこんなに電流を食っていることになります。でもCPUをまわしているだけなら、こんなに食わないはず。それはおいおい調べるとして、次に電流値の振れ、500KHz はあまり振れていないのに、250KHz はかなりひどい。500KHz でなだらかな曲線になっているので、ADC そのものの問題ではなさそうです。電流測定では、1Ωの抵抗の電圧を測定していますが、10uFをパラに入れて cutoff 16KHz の LPFにしています。スイッチングノイズの影響がこんなにあるのか?というのも疑問。ひょっとしたら供給側のレギュレータとの相性なのかも。あと、duty 比と 電流の関係がリニアすぎる。もっと二次曲線的だと思っていたので予想外でした。トランジスタがしょぼいのが原因なのかも知れませんね。

効率を調べてみる

それぞれの測定と効率はどのような関係なのか グラフにしてみました。絶対値としての効率は気にしないつもりでしたが、最大で35%といかにも悪いですね。それはともかく、ダイオードは入れたほうが良いというのが一目りょうぜんです。250KHzでは、duty比 30%ぐらいがもっとも良いですが、効率が良い部分の幅が狭い。500KHz では、duty比率 30%ぐらいから65%ぐらいまでで効率がよくなっています。250KHz では 周波数が低すぎるようです。

まとめ
これで、なんとなく感じがつかめたような気がします。今回は小電流で12Vぐらいまであげるのを目標にしましたが、だいぶ判ってきたので、もう少し電流を流せるタイプを作って調べてみようと思います。まぁいつになるかわかりませんが。

次回

12V を作ることができたので、高電圧プログラミングの実験をしようかと思います。
posted by すz at 20:08| Comment(178) | TrackBack(0) | USB910A

2007年03月07日

基準電圧のキャリブレーション

温度計 - 特にATtiny44 はひどいものでした。これが ADC 一般の性質だとたいへん困りそうです。どんなものなのか調べてみることにしました。基準電圧を調べるには、別の基準電圧が必要です。いろいろ検討しましたが、TL431 で作り USB910A に組み込んでしまうことにしました。



USB910A の回路図からの抜粋ですが、こんな感じです。TL431 で、2.495V の基準電圧を作り、それを 1/3 に分圧した測定対象用の 0.83V も作ります。データシートを見ると、かなりの容量を入れないと unstable になるので、10uF のチップ積層セラミックコンデンサを入れることにしました。ただ電解コンデンサを前提にしていると思われるので、ひょっとしたら 2uF 前後でも問題ないかもしれません。これらの基準電圧を ATtiny44/861 の AREF と ADC のどれかにつなぐことにしました。
愛用のテスタで電圧を測定したところ、それぞれo 2.488V, 0.826V になりました。 TL431 は温度補償されているので、安定してこの電圧になることになります。実際なんどもテスタで測定しましたが、常に同じ電圧でした。
この基準電圧と、内蔵基準電圧を使って、0.83V を測定してみます。電源電圧が影響するようなので、3.3V と 5.0V でそれぞれ 100回測定をしてどれぐらい安定しているか見てみることにします。

測定1 - ATtiny44#1

1.1V 内蔵基準電圧で5Vの場合、1.05V とぜんぜん違う値になりました。3.3V のときもかなり高めです。外部基準電圧を使う場合は、実際の値にかなり近いので、ADCそのものの問題ではなく、基準電圧に問題があるようです。温度計のひどさも、基準電圧が第一の原因のように思えます。外部基準電圧を使ったときでも電源電圧の影響は確実にあります。精度がほしいときは、電源電圧によって校正値を変える必要がありそうです。
さて、この#1という個体はそもそもダメダメなのかも知れません。#2でも同じデストをしてみることにします。

測定2 - ATtiny44#2

#2でも同じような傾向でした。ちなみに、ATtiny45 も同じ傾向でした。これらのチップでは、あんまり基準電圧は当てにできそうにありません。温度補償されているかどうかも判らないので、温度差で値が変わるかどうか調べてみる必要がありそうです。温度は自由にならないので、また別の機会に調べてみることにします。

測定3 - ATtiny861#3

いまでの測定では、こいつはかなり良いかんじでした。おそらくATtiny44,45などよりも精度が良いと期待できますが、実際はどうでしょう?
1.1V,2.56V 内蔵基準電圧の両方で、高めの値になりました。そして、電源電圧 3.3V と 5V の差は、2% ぐらい。校正しなくとも 5% ぐらいの誤差に入ってきています。電源電圧を調べなくとも±1% ぐらいに校正できそうです。外部基準電圧を使えば精度は高くなりますが、それでも電源電圧の影響を受けています。精度が必要ならば、電源電圧を 3.3Vにしたほうがよさそうです。
それにしてもTiny44,45 などとはぜんぜん違いますね。Atmel も気合が入っているのでしょうか。

測定4 - ATtiny26L#1

ついでに、手持ちのATtiny26L も調べてみることにしました。
2.56V内蔵基準電圧は、-10%とかなりひどいように見えます。...が、よくみると電源電圧の影響をほとんど受けていません。校正さえしてやればかなり信頼できそうです。外部の場合もわりと良いです。

次回

だいたい ADC の傾向がつかめてきました。でも、シングルエンドのケースだけです。次は、USB910A の電流計を使って、ATtiny861 のディファレンシャル+ゲインつきの特性を調べてみたいと思います。
posted by すz at 01:11| Comment(118) | TrackBack(0) | USB910A

内部温度計のキャリブレーション

ATtiny45,ATtiny44,ATtiny861などは、内部に温度計を持っています。データシートでは、読み取った値が1違えばだいたい1℃の違いになるのであまり役にたつものではなさそうです。その上、誤差は10℃ぐらいあるとも書かれています。さて、実際どんなものなのでしょう。

さまざまな温度で測定する前に、電源電圧 3.3V と 5V でどれぐらい影響を受けるのか調べてみます。

測定1 - ATtiny44#1の温度値の測定 (室温 28.2℃)


電源電圧 3.3V と 5Vで それぞれ100回温度計をよみとりました。それぞれで値の変動は少ないのですが、そもそも 3.3V と 5V でぜんぜん値が違います。20%ほども違う結果になりました。5V の方は USB の電源そのものなので、変動が大きいはずで、それが結果にも出てきて温度計の値も若干変動があるようです。こんなに電源電圧の影響を受けるのでは、温度計として使うのに相当な不安があります。

測定2 - ATtiny44#1のOSCCAL と 温度値の関係


前回の RC発振器の測定のときに同時に 温度計の値もログしていたので、グラフにしてみました。そうしたら、なんとびっくり。驚いたことに、OSCCAL の値と連動して温度計の値が変わるではありませんか。周波数と連動していそうな感じですが、よくよく見るとそうでもありません。いろんなものに影響を受けているようです。何回かやってみましたが同じ傾向があります。他のものもそうなのか?気になって調べてみましたが、#2の方は、OSCCAL にはほとんど影響を受けていませんでした。どうも、この個体だけがおかしいようです。

測定3 - ATtiny861#3の温度値の測定 (室温 27.2℃)


ATtiny861 を調べてみました。ATtiny44 とは違って、電源電圧の影響は確実にあるものの値の差は小さく 2 ぐらいでした。でも 2 とはいっても 2℃の誤差ということなので、電源電圧を決めてキャリブレーションしておかないと使い物にならない感じですね。面倒なことをしてもあまり当てにできないので、温度計はないものと思うことにしました。

ちなみに、ATtiny45 も ATtiny44 と同じ傾向があります。比較的まともなのは
ATtiny861 だけでした。

次回

温度計があてにならないことは判りました。がそれだけでしょうか?ADC そのものか 内蔵基準電圧があてにならないと困ります。次回は、これらについて調べてみることにします。
posted by すz at 00:07| Comment(0) | TrackBack(0) | USB910A

2007年03月06日

RC発振器のキャリブレーション

AVRには、RC発振器の周波数をプログラムから変更できる OSCCAL というレジスタがあります。この値を変更したら周波数がどのように変わるのか?ということについて調べてみました。

測定1 - ATtiny861 で温度と電源電圧を変化させて、発振周波数を調べる。


電源電圧が3.3Vから5.0V になると、周波数は1%ほどあがるようです。これは温度が12℃変わったときの変化より2倍も大きい。初期値は、3Vにあわせてあるようなので、5V で使うときは気にしておいたほうが良いかも知れません。

測定2 - ATtiny44 2つの発振周波数を調べる


手持ちのATtiny44 に#1と#2の名前をつけて区別できるようにしています。同時に買ったのでロットはたぶん同じはず。さて、この2つの特性はどのように違うのか?傾向は同じですが、OSCCALの値と周波数の関係はだいぶ違うようです。特に#1のほうは、電圧差の影響が大きく3%ほども違いました。これぐらい違うとシリアル通信とかクロックの誤差にシビアなものを使うときにキャリブレーションすることを考えたほうがよさそうです。この結果をみてもそうですが、なんだか ATtiny44 はかなりチープな作りのような印象があります。

測定3 - ATtiny26L を調べてみる。


ATtiny26Lは、128 を境にして2つのパラメータがあるのではなくてパラメータは1つだけです。で値をどんどん大きくしていくとあるところを境にして周波数が下がりだしました。ひょっとして他のもこういう傾向があるのかも知れません。気になってきました。

測定4 - ATtiny861 を調べてみる。


こいつにもありました。周波数が下がるポイントが。しかも 3.3V と 5.0V では下がりだす周波数にだいぶずれがあります。
(注意)これは先の測定と違うチップを使いました。#3としています。

測定5 - ATtiny44 を調べてみる。


#1をつかって見ましたが、だいぶ後の方にずれています。5V のときは、240でも下りだしていません。

どのようにこの測定をしたのか

クロックに比例した周波数を出力するのは簡単です。PWM を使えばよいわけです。一連の測定では、1/4 の周波数を出力するようにしています。OSCCAL の値を変更するのも簡単で通信すればよいわけです。ただし、シリアルではボーレートも変わってしまうので相当難しいかもしれません。I2C での通信では周波数は関係ないのでまったく気にせずに通信できました。さて、周波数をよみとるのは、周波数カウンタがあればできます。しかし、これぐらいの量の測定をするのにはスクリプトなどで自動化できないとやってられません。USB910A では、通信も周波数カウンタ機能もコマンドが違うだけなので、特に面倒なく測定ができました。

次回

RC発振器のキャリブレーションという主題は興味深いものの実際にはあまり役には立たないかも知れません。つぎもあまり役にたちそうにないのですが、内蔵温度計の測定をしてみます。
posted by すz at 23:17| Comment(0) | TrackBack(0) | USB910A

2007年02月28日

USB910A の回路図

USB910A の回路図を以下に示します。この回路図は最初の試作のもので、rev1 です。改良したい点がいくつか出てきているので、rev2 を作る予定。

USB910B よりは複雑ですが、いくつかの部品を1:1でつないだだけという感じでビギナーでも作れるレベルだと思います。ちなみにISPコネクタ配列はオリジナルです。一列 5pin にしたいので、あえて Atmel 標準を採用していません。




電源回路については、下に示すように 3.3V のレギュレータを使いスイッチで 5V と 3.3V を切替えるようにしてください。また、入手が難しいかも知れませんが、3.6V のツエナーダイオードが必要です。


注意) この回路は、USB の規格からだいぶ外れています。ほとんどでハブで認識できると思いますが、ひょっとすると認識できないハブがあるかも知れません。

おやくそく)この回路図は無保証です。この通り作っても動作することを保証するものではありません。自己責任 でお願いします。高価なPC を壊してしまう可能性もあります。リスクを減らすために電源付きの外付けハブを通して使用することをお勧めします。

プログラムについて

公開準備中です。一部に GPL のソフトを利用していますので ライセンスはGPLになります。なお、Linux 2.4.30 (+ uisp) でしか動作確認をしていません。Windows その他で使えるはずですが、ひょっとしたら動作、しないかも知れません。
posted by すz at 23:57| Comment(0) | TrackBack(0) | USB910A

USB910A とは

AVR の自作書き込み器です。

USB シリアルとして接続できる avr910 互換プロトコルの ISPプログラマで、拡張機能として、I2C マスタ通信機能+αを組み込んであります。

I2C デバイス用プログラムも作成していますので、ホストで プログラミングすることで、ISP を接続したまま各種のデバッグができます。

さらに、USB 接続なので、電源も供給でき、電流測定もできます。それだけではなく、AVR 製作に便利なように 周波数カウンタ、クロック出力、4ch の 電圧測定 ( そのうち 3ch は任意の ch 間の 電圧差の測定も可能)の機能を組み込んでいます。ついでに、チップ内蔵の温度計を読み取ることもできます。

これだけの機能を 20pin の ATtiny861 だけで実現しています。回路も簡単なので、作成も容易です。

問題はまだ ATtiny861 の入手先が限られるということ。

このカテゴリでは、USB910A の機能を使った AVR の実験や電子工作の紹介をしたいと思います。
posted by すz at 18:55| Comment(0) | TrackBack(0) | USB910A