• 検索結果がありません。

レッスン 4: A/D 変換

ドキュメント内 PICkit 3 Starter Kit User’s Guide (ページ 55-60)

Chapter 3. レッスン

3.5 レッスン 4: A/D 変換

PICkit™ 3 スタータキット ユーザガイド

DS41628B_JP - p.56  2015 Microchip Technology Inc.

PIC18F14K22のANSELレジスタは多少異なりますが、機能は同じです。各PIC MCU

のデータシートに示したレジスタ定義の表では、一番上の行に各ビットの機能の詳細 (既定値の状態等)を表示しています。ANSA0ビットは読み書き可能で、パワーオン

リセット(POR)とブラウンアウト リセット(BOR)時の既定値はアナログ入力です。

BORは、電源電圧がコンフィグレーション ワードで設定したしきい値より下がると 発生します。

3.5.4.1.2 ADCON0

ADCON0はADCの動作を制御します。bit 0はADCモジュールのイネーブルビット

です。bit 1はA/D変換を開始するためのビットで、bit <6:2>はADCが読み出すチャ

ンネルを選択します。

このレッスンでは、ADCを有効にしてRA4を入力チャンネルに選択します。ADCON1 レジスタ(後述)で内部参照電圧を選択し、A/D変換クロックを8TOSCとします。チャ ンネル変更後、ADCサンプリング コンデンサのセトリングに約5 μs必要です。最後

に ADCON0レジスタの GOビットをセットすると変換が開始します。GOビットには

DONEフラグとしての役割もあります。つまり、変換が完了するとADCはGOビットを ハードウェアでクリアします。変換結果はADRESH:ADRESLレジスタペアに格納さ れます。

変換結果の上位4ビットをコピーして、PORTCに接続されたLEDに表示します。

3.5.4.2 PIC16

3.5.4.3 PIC18

3.5.4.3.1 ADCON1

PIC16のADCON1レジスタとPIC18のADCON2レジスタは、プロセッサクロック

速度と変換速度の比を選択します。ADCは1ビットの変換に少なくとも1.6 μsを必 要とするため、この設定が重要です。クロックが速すぎても遅すぎても精度が低下し ます。プロセッサクロック速度を高くした場合、変換速度を維持するには分周値を大 きくする必要があります。

10ビットの変換結果を右詰めと左詰めのどちらで格納するかは、ADFMビット(bit <7>) で選択します。このプログラムでは左詰めを選択しているため、下位 2 ビットが

ADRESLレジスタに格納され、上位8ビットがADRESHレジスタに格納されます。

しかし実際にこのプログラムで使うのはADRESHレジスタの上位4ビットのみです。

ADC参照電圧は、VDDまたはVREFに接続した別の参照電圧のどちらかを参照電圧指 定ビットで選択します。

3-15: ADCの変換結果は左詰めフォーマットで格納され、青で示したビットがLATCにコピー

される。bit 6DS1を制御し、bit 7DS2を制御する(以下同様)

レジスタ ADRESH ADRESL

結合後 のbit #

9 8 7 6 5 4 3 2 1 (LSb) 0

3-16: 新しく学ぶエンハンスト ミッドレンジのレジスタ

レジスタ 目的

ADCON1 変換結果のフォーマット、変換速度、参照電圧

3-17: 新しく学ぶPIC18のレジスタ

レジスタ 目的

ADCON1 参照電圧

ADCON2 変換結果のフォーマット、変換速度

3.5.5 新しく学ぶ命令 3.5.5.1 両デバイス共通

3.5.5.1.1 SWAPF

ニブルを入れ換えます。ニブルは4ビットの事で、1バイトは2個のニブルで構成さ れます。以下に例を示します。

3-19:

ADCを実行します。ADRESHにはA/D変換結果のb'10100011’が格納されます。

3-20:

3-3: SWAPFの図解

3-18: 新しく学ぶ両デバイス共通の命令

命令 英語名 目的

SWAPF Swapf nibbles in f ニブルを入れ換える

3-19: SWAPF実行前

レジスタ 値

WREG B’01100110’

3-20: SWAPF実行前

レジスタ 値

ADRESH B’10100011’

3-21: SWAPF実行後

レジスタ 値

WREG B’0011-1010’

ADRESH B’1010-0011’

movlw b’01100110’

swapf ADRESH, w ; now perform the swapf and save in WREG, leaving ADRESH intact

ADRESH

WREG

1 0 1 0 0 0 1 1

1 0 1 0

0 0 1 1

PICkit™ 3 スタータキット ユーザガイド

DS41628B_JP - p.58  2015 Microchip Technology Inc.

3.5.6 アセンブリ

3.5.6.1 エンハンスト ミッドレンジ

A/D変換結果を左詰めで格納している事に注意します。このため、swapf命令を使っ て上位4ビットをLATCに代入できます。

3-21:

ドル記号($)はアドレスカウンタの現在の値を表します。「$-1」は、goto命令のジャ ンプ先を(現在のアドレス - 1)、すなわち1つ前の命令とするようアセンブラに指示 しています。

3.5.6.2 PIC183-22:

ここでは「1」の代わりに「$-2」としている事に注意します。これは非常に重要な 違いです。PIC18のプログラムメモリはバイト単位でアドレス指定できますが、PIC18 の命令ワードは2バイト長です。1つ前の命令は、アドレス空間では2バイト前に相 当します。PIC18の命令のアドレスは常に偶数です。

3.5.7 C言語

3.5.7.1 両デバイス共通 例3-23:

ここではADRESHレジスタを右方向へ4回シフトしています。符号なし変数に対す

るシフトは論理シフトです。以下に例を示します。

;Start the ADC

nop ;requried ADC delay of 8uS => (1/(Fosc/4)) = (1/(500KHz/4)) = 8uS banksel ADCON0

bsf ADCON0, GO ;start the ADC

btfsc ADCON0, GO ;this bit will be cleared when the conversion is complete goto $-1 ;keep checking the above line until GO bit is clear ;Grab Results and write to the LEDs

swapf ADRESH, w ;Get the top 4 MSbs (remember that the ADC result is LEFT justified!) Banksel LATC

movwf LATC ;move into the LEDs bra MainLoop

3-22: シフト前のADRESH

シフト前のADRESH

Bit # MSb (7) 6 5 4 3 2 1 LSb (0)

値 0 1 0 1 1 1 0 1

goto $-1 ;keep checking the above line until GO bit is clear

goto $-2 ;keep checking the above line until GO bit is clear

__delay_us(5); //wait for ADC charging cap to settle GO = 1;

while (GO) continue; //wait for conversion to be finished LATC = (ADRESH >> 4); //grab the top 4 MSbs

LEDはピン<RC3:RC0>に接続されているため、この一時作業領域レジスタの内容を LATCに代入する事ができます。PORTCレジスタのそれ以外のビットは無視できます。

ポテンショメータを時計方向に回しても、LEDはなかなか点灯しません。これは、A/D 変換結果の上位4ビットを表示しているためで、電圧を大きく変化させないとこれら のビットには影響しません。自習課題として、下位ニブル(bit 0~3)をLATCに代入 して試してみましょう。LEDの状態がより頻繁に変化します。

3-23: シフト後の一時作業領域レジスタ

シフト後のADRESH

Bit # MSb (7) 6 5 4 3 2 1 LSb (0)

値 0 0 0 0 0 1 0 1

ADRESH >> 4; //grab the top 4 MSbs

PICkit™ 3 スタータキット ユーザガイド

DS41628B_JP - p.60  2015 Microchip Technology Inc.

ドキュメント内 PICkit 3 Starter Kit User’s Guide (ページ 55-60)