目次
前
次
A/D変換処理
A/D変換に関係するピンアサインは、以下。
ピンアサインを決めたならば、CONFIGRATIONに移ります。
A/D変換に関係するSFRを探すと、以下。
A/D変換器を利用する場合、次の5種のレジスタを扱うと
データシートに記載がありました。
- control register AD0CR $4001C000
- global data register AD0GDR $4001C004
- interrupt enable register AD0INTEN $4001C00C
- data register AD0DR0 $4001C010
- data register AD0DR1 $4001C014
- data register AD0DR2 $4001C018
- data register AD0DR3 $4001C01C
- data register AD0DR4 $4001C020
- data register AD0DR5 $4001C024
- data register AD0DR6 $4001C028
- data register AD0DR7 $4001C02C
- status register AD0STAT $4001C030
制御レジスタで、変換開始、入力ピン選択、単発か連続
さらに割込みやクロックの周波数を指定。
詳細は、後で見ていきます。
単発の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基板とは、ブレッドボードで使うワイヤーで接続。
接続には、次のスイッチを利用。
スイッチの接続位置を変えて、アナログ値を
デジタルで与えることが可能。
目次
前
次