P/ECE研究室〜S1C33分室


* Wed Feb  6 21:10:00 JST 2002 Naoyuki Sawa

今回は、A/D変換器です。

いきなり余談です〜
例によって僕はA/D変換器のプログラムはやったことがなく・・・
いや、一度だけありました。MSXturboRには、単純ななA/D変換器が搭載されていました。
もっとも開発者自ら「あの機能はオマケです」と公言するほどに、本当に単純なものです。
プログラムの手順は、おおよそ次のようなものでした。

プログラムからの問い合わせ A/D変換器からの回答
それは 5×128/256[V] よりも高いですか? 高いか、同じです(1)
それは 5×192/256[V] よりも高いですか? 低いです(0)
それは 5×160/256[V] よりも高いですか? 低いです(0)
それは 5×144/256[V] よりも高いですか? 高いか、同じです(1)
それは 5×152/256[V] よりも高いですか? 高いか、同じです(1)
それは 5×156/256[V] よりも高いですか? 高いか、同じです(1)
それは 5×158/256[V] よりも高いですか? 低いです(0)
それは 5×157/256[V] よりも高いですか? 低いです(0)
じゃあ、5×157/256 = 3.07[V] ですね。
※細部は忘れてしまいましたが、だいたいこんな感じだったと思います。 A/D変換器からの回答は、一回の問い合わせに対して1ビット分しかありませんので、 8ビット精度の結果を得るためには、以上の8回の手続きを行う必要がありました。 当時、MSXturboRのA/D変換器のプログラムを試しながら、 「ああ、A/D変換器というのは結局のところ、二つの電圧の高い低いの判断しかできないんだな」 と思ったのを覚えています。 S1C33のA/D変換器は、1ビットづつ結果を取り出したりする必要はなく、電圧測定完了後に、 結果が格納されているレジスタを読み出すだけで、一度で10ビット全部のデータが得られます。 しかしきっと、電圧測定開始〜終了までの間に、内部では同じような繰り返し処理を行っているんだろうな、 と想像できます。そもそもA/D変換器というのはそういうものなのかも知れませんが、 ハードウェアにまるっきり疎い自分にとって、MSXturboRのA/D変換器はとてもいい勉強になったのでした。 〜長い余談終了。 S1C33のA/D変換器は8つのチャネルを持っていて、電圧測定用に8つの端子が割り当てられています。 ところがそれらの端子は別の用途にも利用可能で、実際、大半がA/D変換器以外に使われてしまっています。
チャネルP/ECEでの用途 A/D変換として使われているか?
0 右ボタン A/D変換ではなく、入力ポートとして使用
1 左ボタン A/D変換ではなく、入力ポートとして使用
2 下ボタン A/D変換ではなく、入力ポートとして使用
3 上ボタン A/D変換ではなく、入力ポートとして使用
4 Bボタン A/D変換ではなく、入力ポートとして使用
5 Aボタン A/D変換ではなく、入力ポートとして使用
6 電池の電圧測定 A/D変換として使用
7 Si-Diの電圧測定 A/D変換として使用
A/D変換器の入力端子として使用されているのは、チャネル6と7に相当する二本だけです。 チャネル6「電池の電圧測定」は、画面の右上の電圧表示ですね。 チャネル7「Si-Diの電圧測定」...また知らない言葉が出てきました。 「Si-Di電圧」。Webで検索してみましたが、見つけられません。 ソースコードを読むと、「Si-Di電圧」も毎回測定してメモリに結果を格納していますが、 格納した値を使っている気配がありません(powerman.c 511行あたり)。 「Si-Di電圧」を測定するには、P00に1を出力しなければいけない(「P/ECEポート解説」より) はずなのですが、P00=0のまま測定しています。わからなくなってきました。 回路図の読める人にも見てもらったのですが、「何に使うのかわからない」との事でした。 さて、上記の表を見ると、6つのボタンがA/D変換用入力端子に接続されています。 そこで今回の実験では、これらの6つのボタンを本来のデジタル入力としてではなく、 アナログ入力と見なして、A/D変換器を使って読んでみることにしました。 ついでに、チャネル6の電池電圧と、チャネル7の謎のSi-Di電圧も測定します。 ソースはこちら
まだP00出力はOFFです。Si-Di電圧はゼロに近いです。
P00出力をON。Si-Di電圧はちょっと上がりましたが、やはりゼロに近いです。
下ボタン(Ch.2)を押してみました。あれ?Ch.3(上ボタン)とCh.4(Bボタン)まで変化しています。
三つ目の画面にちょっと興味深い結果が出ています。 入力電圧の変化したチャネルだけでなく、それに続くいくつかのチャネルまで、結果が変化してしまっているのです。 もし、十字ボタンの構造的な要因で隣のボタンまで電圧が変化しているのであれば、左ボタン(Ch.1)や右ボタン(Ch.0)にも 影響が出るはずです。が、実際には影響が出ていません。 ということは、他のチャネルの値が変化してしまったのは、A/D変換器に要因があると推測できます。 「Ch.2の電圧0.0[V]から、次のCh.3の3.3[V]への変化が急激過ぎて、A/D変換器がついていけないのかな?」 と仮定して、もっとゆっくり確実に変換作業を行ってもらうため、A/D変換器への入力クロックを下げてみました。 先ほどの実験では、P/ECEシステムプログラムと同じ、1.5MHz(24MHz/16)でA/D変換器を動かしていましたが、 試しに最低速の93KHz(24MHz/256)で、同じ測定を行ってみます。
93KHz駆動で、下ボタン(Ch.2)を押してみました。
今度は、他のチャネルに影響が出ていません。どうやら、仮定は正しかったようです。 「S1C33209/221/222 テクニカルマニュアル」(s1c33209_221_222j.pdf)の395ページには、 入力クロックの周波数は、Max.2MHzを推奨します。 と書いてありますが、より正確な測定を行う必要があるなら、できるだけ入力クロックは下げた方がいいようです。 では、もうひとつ実験してみます。A/D変換のスピードを決定するもう一つの要因、サンプリング時間の設定を、 初期値の9クロックから、最短の3クロックに下げると、もっと測定精度が悪くなるはずです。
24MHz駆動・9クロック測定で、下ボタン(Ch.2)を押してみました。
予想通り、Ch.3がCh.2にひっぱられる幅が、より大きくなっています。 ちなみに、「S1C33209/221/222 テクニカルマニュアル」396ページには、サンプリング時間は デフォルト(ST="11"、9クロック)のまま使用してください。 と書かれています。 おそらく、サンプリング時間を短くした場合、精度の悪さが許容範囲を超えてしまうからだと思います。 P/ECEシステムプログラムも、初期値の9クロック設定で、電池電圧を測定しています。 今回は、A/D変換器を取り上げてみました。「Si-Di電圧」が謎なままなのが、心残りです。 方向ボタンとA・Bボタンが、A/D変換入力としても使える端子につながっているのは、面白いと思いました。 少し改造するだけで、アナログスティック&ベラボースイッチ搭載のP/ECEが作れたりするのかも? 残念ながら僕はハードウェアは全くダメなのですが、P/ECE関連サイトを拝見するに、改造も楽しそうですね。 ハードウェアがダメってのは、P/ECEの楽しさのかなりの部分を失っているなあ、と感じた今回の実験でした。 次回は、シリアルインターフェイスを取り上げる予定です。 (続きます...)

nsawa@piece-me.org