目次

A/D変換処理

 A/D変換に関係するピンアサインは、以下。



 ピンアサインを決めたならば、CONFIGRATIONに移ります。

 A/D変換に関係するSFRを探すと、以下。



 A/D変換器を利用する場合、次の5種のレジスタを扱うと
 データシートに記載がありました。

 制御レジスタで、変換開始、入力ピン選択、単発か連続
 さらに割込みやクロックの周波数を指定。
 詳細は、後で見ていきます。

 単発のA/D変換は、AD0CR、AD0GDR、AD0INTENの3レジスタで
 処理が完結するようになっています。

 A/D変換には、変換クロックが必要なので、それに関連する
 SFRについても見ておかないといけないでしょう。

 システム関係のクロックは、エントリーアドレスを探して
 そこから探っていきます。



 アドレスは、$40048000 がエントリーで、クロック関係は
  $40048080 となります。
 このレジスタの該当ビットをセットして、A/D変換に使う
 クロックを供給。



 クロックを供給しても、A/D変換器モジュールに電源を供給
 しなければ動作しないので、動かすかどうかを指定します。



 さらに、使いたいピンをA/D変換器で利用できるように設定
 しなければなりません。
 ポート1の0ビット目をA/D変換器の入力として利用するなら
 このピンに関係するconfigrationを、レジスタにパラメータを
 設定して、指定します。



 初期化のForthコードは、以下とすればよいでしょう。

\ SFR
$40048080 constant SYSAHBCLKCTRL
$40048238 constant PDRUNCFG      \ Power-down configuration register
$40044078 constant IOCON_PIO1_0

\ Enable Clock for ADC
1 13 lshift SYSAHBCLKCTRL bis!

\ Clear Power-down for ADC
1  4 lshift PDRUNCFG bic!
           
\ Select Analog input mode for P1.0
$42 IOCON_PIO1_0 !  

 制御レジスタに対してのパラメータ設定をしなければ
 ならないので、データシートから必要な情報を拾って
 おきます。



 A/D変換器を、どのピンに接続するのかをSELで指定。

 0から7まで、8チャネル分あるので、該当する
 チャネルを1にすると、そのピンからのアナログ
 電圧値を入力します。

 変数を利用したForthコードにすると、以下。

\ clear
0 variable TMP

\ select channel #1
1 1 lshift TMP @ or TMP !

 A/D変換器に使うクロックは、4.5MHz以下としなければ
 ならないので、PCLK/(CLKDIV+1)で計算します。

 PCLKは、A/D変換器への供給クロックです。
 デフォルトだと12MHzになっていますが、PLLを
 操作して48MHzにしている場合とで、CLKDIVに
 設定する値を変えます。

 12MHzでは、CLKDIVに3を設定すると、12MHz/(3+1)=4MHz
 48MHzでは、CLKDIVに11を設定すると、48MHz/(11+1)=4MHz

 48MHzで動かしているとして、次のように変数に情報を指定。

\ 11 -> CLKDIV
TMP @ 11 8 lshift or TMP !

 BURSTは、連続してA/D変換をしてレジスタに結果を保存する
 ときに使います。ここでは、ワードで1回指定するごとに
 データを入力する方式を採用。

 Forthコードは、以下。

\ 0 -> BURST bit
TMP @ 0 16 lshift or TMP !

 CLKSは、A/D変換の結果の精度を何ビットにするかを
 決定します。10ビットから3ビットまでの選択が可能
 ですが、値を大きくするとビット数が減るので、分周
 していると考えればよいでしょう。

 デフォルトの10ビットを選択します。
 Forthコードは、以下。

\ 0 -> CLKS bits
TMP @ 0 17 lshift or TMP !

 A/D変換の開始は、STARTビットに1をセットします。

 コードにすると、以下。

\ 1 -> START bit
TMP @ 0 24 lshift or TMP !

 ここまでの内容を変数を使わないで、まとめられます。

: analog
  1  1 lshift    \ AD1 Channel
 11  8 lshift or \ CLKDIV = 12 --> 12 MHz / 12 = 1 MHz when SYSTEM_CLOCK 12MHz
  0 16 lshift or \ Burst off
  0 17 lshift or \ 11 clock cycles - 10 Bit accuraccy
  1 24 lshift or \ Start conversion now.
  AD0CR !
;

 A/D変換を開始して、終了するまでポーリングで待ちます。
 変換の最中か終了かを、ステータスレジスタの該当ビットを
 ポーリング。

 LPC1114のA/D変換器では、グローバルレジスタでも変換
 終了のフラグをキープしているので、そちらを利用する
 のが楽でしょう。

 このレジスタのビット構成は、以下。



 31ビット目を0ビット目までシフトして、論理値が1に
 なるまで、待てば変換終了の判断ができます。
 Forthコードにすると、次のようにすればよいでしょう。

  begin 1 31 lshift AD0GDR bit@ until \ Wait for DONE=1

 グローバルレジスタには、[15:6]の10ビットに変換データも
 含まれているので、スタックに取出して、右シフトすれば
 よいはず。

  AD0GDR @ 6 rshift $3FF and

 10ビットだけが有効なので、余計なビットをマスクで
 ゼロクリアするのが、お約束。

 ひとつのワードにまとめていくと以下。

: analogRead ( -- measurement )
  1  1 lshift    \ AD1 Channel
 11  8 lshift or \ CLKDIV = 12 --> 12 MHz / 12 = 1 MHz when SYSTEM_CLOCK 12MHz
  0 16 lshift or \ Burst off
  0 17 lshift or \ 11 clock cycles - 10 Bit accuraccy
  1 24 lshift or \ Start conversion now.
  AD0CR !

  begin 1 31 lshift AD0GDR bit@ until \ Wait for DONE=1
  AD0GDR @ 6 rshift $3FF and
;

 指定ビットから論理値を取得するためにワード「bit@」を利用。
 組込みワードで用意されているので、それを活用するとコードを
 短くできます。

 連続してA/D変換しながら、表示するコードにまとめます。

: analogScan ( -- )
  analog_init

  begin
    analogRead u. cr
  key? until
;

 全体は、以下。

$40048080 constant SYSAHBCLKCTRL
$40048238 constant PDRUNCFG \ Power-down configuration register
$40044078 constant IOCON_PIO1_0

$4001C000 constant AD0CR
$4001C004 constant AD0GDR

: analog_init
  1 13 lshift SYSAHBCLKCTRL bis! \ Enable Clock for ADC
  1  4 lshift PDRUNCFG bic!      \ Clear Power-down for ADC
  $42 IOCON_PIO1_0 !             \ Select Analog input mode for P1.0
;

: analogRead ( -- measurement )
  1  1 lshift    \ AD1 Channel
 11  8 lshift or \ CLKDIV = 12 --> 12 Mhz / 12 = 1 MHz when SYSTEM_CLOCK 12MHz
  0 16 lshift or \ Burst off
  0 17 lshift or \ 11 clock cycles - 10 Bit accuraccy
  1 24 lshift or \ Start conversion now.
  AD0CR !

  begin 1 31 lshift AD0GDR bit@ until \ Wait for DONE=1
  AD0GDR @ 6 rshift $3FF and
;

: analogScan ( -- )
  analog_init

  begin
    analogRead u. cr
  key? until
;

 この定義で、ワード「analogScan」を動かすと
 次のようになりました。



 A/D変換器には、次の治具を接続。




 いずれかのスイッチを押すと、分圧した電圧が出力されます。

 半田付けした治具は、以下。



 Forth基板とは、ブレッドボードで使うワイヤーで接続。
 接続には、次のスイッチを利用。




 スイッチの接続位置を変えて、アナログ値を
 デジタルで与えることが可能。


目次

inserted by FC2 system