前回 はブレッドボードを使って計数型A-D変換器を作ってみました。 充分に理解が進んだことと思います。 今回から MC908QY4A マイコンに内蔵された 10ビット精度の逐次比較型 A-D変換器について説明していきます。 前回作った A-D変換器とはまったく同じ仕組みではありませんが、おおかた似たようなものなのでそれほど難しくないはずです。
マイコンのブロック図 (クリックで拡大)
◆ アナログ・ディジタル・コンバータ
第16回 で入力/出力ポートの説明をして以来、かなり久しぶりの内蔵周辺モジュール解説になります。 第3回 で紹介した QY4A英文データシートでは Analog-to-Digital Converter (ADC10) Module、同じく QC16和文データシートでは アナログ・ディジタル・コンバータ(ADC10)モジュール と書かれているものです。 QY4A の場合は 6チャネル(入力が6本)、QC16 の場合は10チャネル(入力が10本)という違いを除けば、どちらも同じものです。 上図で黄色く塗った部分が該当個所になります。グレーのところは説明済みのところです(ただし CPU に関しては、説明の続きを後のほうで行う予定)。
◆ アナログ・ディジタル・コンバータ に関係する入出力ピン
一つのピンに複数の機能が割り付けられている場合、同時に複数の機能を有効にすると優先順位の高い機能だけがそのピンの機能になります。
高い OSC > (ADC, IRQ, RST) > TIM > KBI > PORT 低い
ここでいう優先順位とは、ピンに関してのみであり、内部の機能について優先順位が付いているわけではありません。たとえば、TCH1機能とAD1機能は同時に使用可能です。ただしピンの機能は AD1 になります。TCH1 機能はマイコン内部で利用することが可能です
◆ アナログ・ディジタル・コンバータ の考え方
内蔵された A-D変換器を使うと、0[V] ~ VDD のアナログ電圧を 10ビットまたは 8ビットのディジタル・データに変換できます。 VDD = 5V、8ビット・モードの場合を例にとって考えてみましょう。 A-D変換器の基準電圧は VDD と同じなので、0V から 5V の範囲がアナログ電圧として取り扱える範囲ということになります。 この範囲つまり下端から上端までのことをフルスケールと呼びます。 一方、ディジタル値としては 2の8乗、すなわち 256段階の表現ができるので、これを均等に振り分けることにすると 5[V] ÷ 256 ≒ 19.53[mV] となります。 この値を 「最小ビット 一つ分の重みに相当する電圧」 という意味で 1LSB と表現します。 なお、専門用語で A-D変換することを 量子化 といい、1LSB のことを 離散値 (りさんち)と呼びます。
A-D変換を行うということは、入力電圧を 1LSB 刻みの物差しで測り、近いところの数字( 8ビットであれば 0x00 から 0xFF のどれか)を読み取ること、という説明もできます。 当たり前のことですが、A-D変換の結果はディジタル値ですから飛び飛びの値しか得られません。 その中間にあたるアナログ値は上下のどちらかに変換されてしまうので、A-D変換には誤差(量子化誤差)が付きものであるということを理解しておいてください。
【補足】 先ほどフルスケールの説明をしましたが、VDD = 5V、8ビット・モードで 0x00 に相当する電圧を 0[V] とすると、0xFF に相当する電圧は 1LSB × 255 = 4.98[V] となって、5V に足りません。 そこで実際のディジタル値によって表現される電圧範囲に着目して 0[V] から 4.98[V] を 実効フルスケール と呼び区別することがあります。 その場合は 4.98[V] ÷ 255 ≒ 19.53[mV] なので、結果的に 1LSB の大きさは同じになります。
ここまでの説明で A-D変換の計算式が次のようになることが理解できます。
離散値 = フルスケール電圧 ÷ (2のN乗) ただし N は量子化ビット数
ディジタル値 = アナログ電圧 ÷ 離散値
具体例を挙げておきましょう。 VDD = 5V、8ビット・モードでアナログ入力電圧が 2.5V のときは次のようになります。
離散値 = 5000[mV] ÷ 256 ≒ 19.53[mV]
ディジタル値 = 2500[mV] ÷ 19.53[mV] ≒ 128 (0x80)
ついでに説明しておきます。 VDD = 3V、8ビット・モードで使っているときは、基準電圧が 3V になります。 このとき 2.5V を入力すると、
離散値 = 3000[mV] ÷ 256 ≒ 11.72[mV]
ディジタル値 = 2500[mV] ÷ 11.72[mV] ≒ 213 (0xD5)
となります。 同じ 2.5V なのに、変換結果がずいぶん異なりますね。 これは極端な例ですが、基準電圧(ここでは電源電圧と同じ)がわずかに変わっても変換結果に影響が出てしまうのです。 A-D変換器の基準電圧をしっかり決めることの大切さが理解できるでしょう。
この A-D変換モジュールは 10ビット・モードに設定して使うことができます。 その場合も考え方はまったく同じです。 2の 10乗 は 1024 であり、VDD = 5V 時の離散値(1LSB)は 4.88[mV]、そしてディジタル値の範囲は 0 (0x000) ~ 1023 (0x3FF) になります。
◆ アナログ・ディジタル・コンバータ に関係する I/O制御レジスタ
アナログ・ディジタル・コンバータに関するレジスタを抜き出すと、次の 三つになります。
・ ADC10 ステータス/ 制御レジスタ(ADSCR)
・ ADC10 データ・レジスタ(ADRH と ADRL)
・ ADC10 クロック・レジスタ(ADCLK)
これらのレジスタについて、下記のブロック図を参照しながら解説していきます。
A-D変換モジュールのブロック図(クリックで拡大)
黄色で示した部分がソフトウェアで読み書きするレジスタ
・ ADHWT(A-D外部ハードウェア・トリガ) は QY4A や QC16 には存在しない。
・ AD0 から ADn は、QY4A の場合 AD0 から AD5 の 6本。
・ 基準電圧 VREFH は VDD に内部接続済み。 VREFL は VSS に内部接続済み。
・ SAR(successive approximation register)コンバータは逐次比較型変換器のこと。
・ バス・クロックは CPUコアに与えられるクロックと同一(3.2MHz など)。
・ 代替クロック源はバス・クロックの 4倍の周波数のクロック(12.8MHz など)。
ADC10ステータス/ 制御レジスタ(ADSCR)
このレジスタへ書き込みを行うと、変換が開始されます。 もし変換中に書き込んだときは変換が中断され、新たな変換が開始されます (ADCH4-ADCH0 の全ビットが 1のときを除く)。
・ COCO 変換完了ビット Conversion Complete Bit
COCO は、変換が完了するたびに 1 になる読み出し専用ビットです。 書き込みを行っても効果はありません(ただし、このレジスタへ書き込むことになるので新しく変換が開始される)。 このビットは ADC10ステータス/ 制御レジスタに書き込みを行うか、ADC10下位データ・レジスタを読み出すことによって 0 になります。
1 = 変換完了
0 = 変換完了ではない
・ AIEN ADC10割り込みイネーブル・ビット ADC10 Interrupt Enable Bit
このビットが 1 にされていれば、変換が完了するとADC10割り込み信号が発生します。 割り込みそのものについてはもっと後のほうで説明するので、ここではどの信号とどの信号によってADC10割り込み信号が発生するかを見ておいてください。 ブロック図中の同じ番号同士は接続されています。 ADC10割り込み信号は、データ・レジスタが読み出されるか ADC10ステータス/ 制御レジスタに書き込みを行うことによって 0 になります。
1 = ADC10 割り込み許可
0 = ADC10 割り込み禁止
・ ADCO ADC10連続変換ビット ADC10 Continuous Conversion Bit
このビットが 1 にされていれば、選択したチャネルの A-D変換を連続して実行します(連続変換モード)。 データ・レジスタは変換結果が読み出されたかどうかに関わらず、変換完了するたびに上書きされます。 ただし ADCH4~ADCH0 の全ビットが1 のときは変換が行われません。
次のいずれかによって連続変換モードが終了します。
- マイコンがリセットされる
- マイコンがストップ・モードに移行する(ACLKEN = 0 の場合)
- ADCLK に書き込みを行う
- ADSCR に書き込みを行う(ADCO = 1 のときは新たに連続変換を開始)
ストップ・モードへの移行によって連続変換を停止した場合、ADSCR への書き込みによってのみ連続変換を再起動できます。
このビットが 0 にされていれば、ADSCR への書き込みを行うたびに選択したチャネルの A-D変換を一回実行します(単独変換モード)。 ただし ADCH4~ADCH0 の全ビットが1 のときは変換が行われません。
1 = ADSCR への書き込み後に連続変換を実行
0 = ADSCR への書き込み後に一回の変換を実行
・ ADCH4~ADCH0 チャネル選択ビット Channel Select Bits
ブロック図には ADCH とだけ書いてありますが、実際はレジスタ中にある ADCH4~ADCH0 の 5ビットの領域です。
A-D変換器は一つしかないので、同時に複数のチャネルを処理することはできません。
下表に従ってチャネル選択ビットを設定することで、入力チャネルを一つ選択します。
ADn の番号と汎用ポートの番号は同じ番号同士で対応していないので、上の入出力ピンの図をよく確認してください。
チャネル選択ビットの全ビットを1 にすると、A-D変換器はオフ(低電力状態)になります。この機能により A-D変換器を明示的に停止させて、入力チャネルと ADC10 モジュールを切り離すことができます。
連続変換モードを終了させるとき、ADCH を変えずに ADCO = 0 とすると単独変換を1回実行しますが、上記の方法で連続変換を終了させると余分な単独変換の実行を避けることができます。
単独変換モードを使用するとき、A-D変換器を低電力状態に移行させるためにチャネル選択ビットの全ビットを1 にする必要はありません。モジュールは、変換が完了すると自動的に低電力状態になります。
ADC10上位データ・レジスタ(ADRH)
ADC10下位データ・レジスタ(ADRL)
ブロック図には 「データ・レジスタ(ADRH:ADRL)」 と書いてありますが、実際は ADRH と ADRL の二つのレジスタで構成されています。
この二つのレジスタには A-D変換の結果が格納されます。 これらは読み出し専用のレジスタであり、書き込みを行っても効果がありません。
CodeWarrior の C言語のヘッダでは、この 二つのレジスタを合わせた2バイト・サイズのレジスタを ADR として定義しています。 ADR を読み出すと ADRH, ADRL の順に自動的に読み出しを行ってくれるので、下記の順番の説明は気にしなくてもよくなります(橙色の強調文字は注意が必要)。
ただし 8ビット・モードでは ADR を使わず、ADRL と記述してください(シミュレータに対応させるため)。
10ビット・モードのとき、ADRH に変換結果の上位 2ビットが格納され、ADRL に下位 8ビットが格納されます。 ADRH を読み出すと、ADRL を読み出すまで変換結果の更新が行われなくなります(ブロック機構)。 10ビット・モードで ADRH の読み出しを行った後 ADRL の読み出しをしなかった場合、次の変換が完了しても結果が更新されず、新しい結果は捨てられてしまいます。 これを 「データ転送がブロックされた」 と言います。ブロックが行われた場合は、COCO もセットされません。 そして ADCO の設定に関わらず強制的に新しい変換を開始します。 もしも単独変換モードで変換開始した直後に ADRH だけを読み出すと、ブロック機構によって変換完了時に COCO がセットされず、また新しい変換が開始されてしまいます。 そうしないためには、単独変換モードでは変換が完了するのを待ってから ADRH, ADRL の順番に読み出しを行う必要があります。
8ビット・モードのとき、ADRL に変換結果の 8ビットが格納されます。 ADRH は何も機能をもたず、ADRL とも結合されません。 8ビット・モードのとき ADRH を読み出すと 0x00 になります。
(続く)
『参考文献』
「A/D・D/A変換回路入門 第2版」 (日刊工業新聞社) 相良岩男 著
「試しながら学ぶHC08マイコン入門」 (CQ出版)
第1章 マイコン電子工作を始めよう
第10章 統合開発環境CodeWarriorを使ってみる
Appendix F KMC908QY4Aユーザ・モード・モニタ入りマイコンの知識
筆者のホームページ 『マイコン工作の実験室』
組み込みエンジニア KAWANO
