アナログ / デジタル コンバータ (ADC) 16.9 1.1 Msps 用 ADC コンフィグレーション
デバイスが40 MIPSで動作する場合、スループット1.1 Msps/分解能10ビットでサンプリン グするようにADCモジュールを設定できます。
AD12Bビット(ADxCON1<10>)を「0」にクリアする事により、ADCモジュールを10ビット 動作に設定します。ASAMビット(ADxCON1<3>)を「1」にセットする事により、変換終了後 にサンプリングを自動的に開始します。SSRC<2:0>ビット(ADxCON1<7:5>)を「111」に設 定する事により、サンプリング終了/変換開始をトリガするサンプルクロック源として内部カ ウンタを選択します。ADRCビット(ADxCON3<15>)を「0」にクリアする事により、ADC変 換クロックとしてシステムクロックを選択します。自動サンプリング時間ビットを12 TADより も低く設定します。ADCS<7:0>ビット(ADxCON3<7:0>)を「00000011」に設定する事によ り、ADC変換クロックを75 nsに設定します(式16-7参照)。
式16-7: 40 MIPS動作時のADC変換クロック
最大16 MIPSのデバイスでも、CPUが13.3 MIPSで動作すれば1.1 MspsのADC速度を達成 できます。式16-8に従ってADC変換クロックを75 nsに設定します。
式16-8: 13.3 MIPS動作時のADC変換クロック
ADCモジュールを10ビット動作に設定するため、ADCの変換時間は式16-9から12 TADとな ります。
式16-9: ADC変換時間
ADCチャンネルCH0とCH1を選択(CHPS<1:0> = 01)し、アナログ入力AN0またはAN3 (常にいずれか1つだけ)を逐次モード(SIMSAM = 0)で変換するように設定します。図 16-25 に、ADCモジュールの動作シーケンスを示します。
図16-25: 1.1 Msps用サンプリング シーケンス
TAD = TCY × (ADCS<7:0> + 1) = (1/40M) × 3 = 75 ns (13.3 MHz)
TAD = TCY × (ADCS<7:0> + 1) = (1/13.3M) × 3 = 75 ns (13.3 MHz)
TCONV = 12 × TAD = 900 ns (1.1 MHz)
Sample 1 ANx
Sample 2 ANx CH0
CH1
Convert 1 ANx
Convert 2 ANx SOC
Sample 4 ANx Convert 3 ANx
Convert 4 ANx Sample 3 ANx Sample 5 ANx
例16-8: 1.1 Msps用ADCコンフィグレーション コード void initAdc1(void)
{
AD1CON1bits.FORM = 3; // Data Output Format:Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 7; // Internal Counter (SAMC) ends sampling and starts conversion AD1CON1bits.ASAM = 1; // ADC Sample Control:Sampling begins immediately after
// conversion
AD1CON1bits.AD12B = 0; // 10-bit ADC operation
AD1CON2bits.SIMSAM = 0; // Sequential sampling of channels AD1CON2bits.CHPS = 1; // Converts channels CH0/CH1
AD1CON3bits.ADRC = 0; // ADC Clock is derived from Systems Clock AD1CON3bits.SAMC = 0; // Auto Sample Time = 0 * TAD
AD1CON3bits.ADCS = 2; // ADC Conversion Clock TAD = TCY * (ADCS + 1) = (1/40M) * 3 = // 75 ns (13.3 MHz)
// ADC Conversion Time for 10-bit Tconv = 12 * TAD = 900 ns (1.1 MHz) AD1CON1bits.ADDMABM = 1; // DMA buffers are built in conversion order mode
AD1CON2bits.SMPI = 0; // SMPI must be 0 //AD1CHS0/AD1CHS123:A/D Input Select Register
AD1CHS0bits.CH0SA = 0; // MUXA +ve input selection (AIN0) for CH0 AD1CHS0bits.CH0NA = 0; // MUXA -ve input selection (VREF-) for CH0 AD1CHS123bits.CH123SA = 0;// MUXA +ve input selection (AIN0) for CH1 AD1CHS123bits.CH123NA = 0;// MUXA -ve input selection (VREF-) for CH1 //AD1PCFGH/AD1PCFGL:Port Configuration Register
AD1PCFGL = 0xFFFF;
AD1PCFGH = 0xFFFF;
AD1PCFGLbits.PCFG0 = 0; // AN0 as Analog Input
IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit IEC0bits.AD1IE = 0; // Do Not Enable A/D interrupt AD1CON1bits.ADON = 1; // Turn on the A/D converter void initDma0(void)
{
DMA0CONbits.AMODE = 0; // Configure DMA for Register indirect with post increment DMA0CONbits.MODE = 2; // Configure DMA for Continuous Ping-Pong mode
DMA0PAD = (int)&ADC1BUF0;
DMA0CNT = (NUMSAMP-1);
DMA0REQ = 13;
DMA0STA = __builtin_dmaoffset(BufferA);
DMA0STB = __builtin_dmaoffset(BufferB);
IFS0bits.DMA0IF = 0; //Clear the DMA interrupt flag bit IEC0bits.DMA0IE = 1; //Set the DMA interrupt enable bit DMA0CONbits.CHEN = 1;
}
アナログ / デジタル コンバータ (ADC)
16.10 DMA なしデバイスのサンプリング / 変換シーケンス例
以下のコンフィグレーション例では、各種のサンプリングおよびバッファリング設定でのA/D 動作を説明します。各例では、ASAMビットをセットする事により、自動的にサンプリングを 開始します。また、変換トリガがサンプリング終了/変換開始をトリガします。
16.10.1 1 チャンネルを複数回サンプリング / 変換する
図 16-26と表16-14に、ADCの基本的なコンフィグレーションを示します。この場合、1つの S&Hチャンネル(CH0)を使用して1つのADC入力(AN0)をサンプリング/変換します。結果 はADCバッファ(ADC1BUF0~ADC1BUFF)に保存されます。このプロセスを16回繰り返し てバッファがフルになると、ADCモジュールが割り込みを生成します。以上のプロセスを繰り 返し実行します。
CHPSビットでS&H CH0だけを有効にします。ALTSをクリアする事により、MUXA入力だ けを有効にします。CH0SAビットとCH0NAビットでCH0+入力に入力チャンネルAN0、 CH-入力にVREF-を選択します。その他の入力選択ビットは全て使用しません。
図16-26: 1チャンネルを割り込み1回あたり16回変換する
ADC Clock
SAMP
ADC1BUF0
TSAMP
TCONV
ADC1BUF1 DONE
ADC1BUF2 ADC1BUFF
Input to CH0 AN0
TSAMP
TCONV
AN0
TSAMP
TCONV
AN0
TSAMP
TCONV
AN0
AD1IF ASAM Conversion Trigger
表16-14: 1チャンネルをADC割り込み1回あたり16回変換する
制御ビット 動作シーケンス
シーケンス選択 MUXA入力をサンプリングする: AN0 → CH0
SMPI<3:0> =1111 CH0を変換してADC1BUF0に書き込む
サンプリング16回ごとに割り込む MUXA入力をサンプリングする: AN0 → CH0
CHPS<1:0> =00 CH0を変換してADC1BUF1に書き込む
チャンネル CH0 MUXA入力をサンプリングする: AN0 → CH0
SIMSAM = n/a CH0を変換してADC1BUF2に書き込む
1チャンネル サンプリングには適用せず MUXA入力をサンプリングする: AN0 → CH0
BUFM =0 CH0を変換してADC1BUF3に書き込む
16ワード単一結果バッファ MUXA入力をサンプリングする: AN0 → CH0
ALTS = 0 CH0を変換してADC1BUF4に書き込む
常にMUXA入力選択を使用する MUXA入力をサンプリングする: AN0 → CH0 MUXA入力選択 CH0を変換してADC1BUF5に書き込む
CH0SA<3:0> =0000 MUXA入力をサンプリングする: AN0 → CH0
CH0+入力にAN0を選択する CH0を変換してADC1BUF6に書き込む
CH0NA =0 MUXA入力をサンプリングする: AN0 → CH0
CH0-入力にVREF-を選択する CH0を変換してADC1BUF7に書き込む
CSCNA =0 MUXA入力をサンプリングする: AN0 → CH0
入力スキャンしない CH0を変換してADC1BUF8に書き込む
CSSL<15:0> = n/a MUXA入力をサンプリングする: AN0 → CH0
スキャン入力選択を使用しない CH0を変換してADC1BUF9に書き込む
CH123SA = n/a MUXA入力をサンプリングする: AN0 → CH0
チャンネルCH1/CH2/CH3+入力を使用しない CH0を変換してADC1BUFAに書き込む
CH123NA<1:0> = n/a MUXA入力をサンプリングする: AN0 → CH0
チャンネルCH1/CH2/CH3 -入力を使用しない CH0を変換してADC1BUFBに書き込む MUXB入力選択 MUXA入力をサンプリングする: AN0 → CH0
CH0SB<3:0> = n/a CH0を変換してADC1BUFCに書き込む
チャンネルCH0+入力を使用しない MUXA入力をサンプリングする: AN0 → CH0
CH0NB = n/a CH0を変換してADC1BUFDに書き込む
チャンネルCH0-入力を使用しない MUXA入力をサンプリングする: AN0 → CH0
CH123SB = n/a CH0を変換してADC1BUFEに書き込む
チャンネルCH1/CH2/CH3 +入力を使用しない MUXA入力をサンプリングする: AN0 → CH0
CH123NA<1:0> = n/a CH0を変換してADC1BUFFに書き込む
チャンネルCH1/CH2/CH3 -入力を使用しない ADC割り込み 以上を繰り返す 初回ADC割り込み時の
ADCバッファの状態
2回目ADC割り込み時の ADCバッファの状態
ADC1BUF0 AN0サンプル1 AN0サンプル17
ADC1BUF1 AN0サンプル2 AN0サンプル18
ADC1BUF2 AN0サンプル3 AN0サンプル19
ADC1BUF3 AN0サンプル4 AN0サンプル20
ADC1BUF4 AN0サンプル5 AN0サンプル21
ADC1BUF5 AN0サンプル6 AN0サンプル22
ADC1BUF6 AN0サンプル7 AN0サンプル23
ADC1BUF7 AN0サンプル8 AN0サンプル24
ADC1BUF8 AN0サンプル9 AN0サンプル25
ADC1BUF9 AN0サンプル10 AN0サンプル26
ADC1BUFA AN0サンプル11 AN0サンプル27
ADC1BUFB AN0サンプル12 AN0サンプル28
ADC1BUFC AN0サンプル13 AN0サンプル29
ADC1BUFD AN0サンプル14 AN0サンプル30
アナログ / デジタル コンバータ (ADC)
16.10.2 全アナログ入力をスキャンしながら A/D 変換する
図 16-27と表16-15に、利用可能な全アナログ入力チャンネルを1つのS&Hチャンネル(CH0) で サ ン プ リ ン グ / 変 換 す る 場 合 の セ ッ ト ア ッ プ 例 を 示 し ま す。ADC 制 御 レ ジ ス タ 2 (ADxCON2<10>)のスキャン入力選択ビット(CSCNA)をセットする事により、CH0正極性入 力へのADC入力をスキャンします。その他の条件は16.10.1「1チャンネルを複数回サンプリ ング/変換する」と同じです。
CH0 は最初にAN0入力をサンプリング/変換し、次にAN1入力をサンプリング/変換します。
この入力スキャンプロセスは、バッファがフルになるまで16回繰り返されます。結果はADC バッファ(ADC1BUFA~ADC1BUFF)に保存されます。その後ADCモジュールが割り込みを 生成します。以上のプロセスを繰り返し実行します。
図16-27:割り込み1回あたり16入力をスキャンする
ADC Clock
SAMP
ADC1BUF0
TSAMP
TCONV
ADC1BUF1 DONE
ADC1BUF2 ADC1BUFF
Input to CH0 AN0
TSAMP
TCONV
AN1
TSAMP
TCONV
AN14
TSAMP
TCONV
AN15
AD1IF ASAM Conversion Trigger
表16-15: ADC割り込み1回あたり16入力をスキャンする
制御ビット 動作シーケンス
シーケンス選択 MUXA入力をサンプリングする: AN0 → CH0
SMPI<3:0> =1111 CH0を変換してADC1BUF0に書き込む
サンプリング16回ごとに割り込む MUXA入力をサンプリングする: AN1 → CH0
CHPS<1:0> =00 CH0を変換してADC1BUF1に書き込む
チャンネル CH0 MUXA入力をサンプリングする: AN2 → CH0
SIMSAM = n/a CH0を変換してADC1BUF2に書き込む
1チャンネル サンプリングには適用せず MUXA入力をサンプリングする: AN3 → CH0
BUFM =0 CH0を変換してADC1BUF3に書き込む
16ワード単一結果バッファ MUXA入力をサンプリングする: AN4 → CH0
ALTS =0 CH0を変換してADC1BUF4に書き込む
常にMUXA入力選択を使用する MUXA入力をサンプリングする: AN5 → CH0
MUXA入力選択 CH0を変換してADC1BUF5に書き込む
CH0SA<3:0> = n/a MUXA入力をサンプリングする: AN6 → CH0
CSCNAによるオーバーライド CH0を変換してADC1BUF6に書き込む
CH0NA =0 MUXA入力をサンプリングする: AN7 → CH0
CH0-入力にVREF-を選択する CH0を変換してADC1BUF7に書き込む
CSCNA =1 MUXA入力をサンプリングする: AN8 → CH0
CH0+入力をスキャンする CH0を変換してADC1BUF8に書き込む CSSL<15:0> =1111 1111 1111 1111 MUXA入力をサンプリングする: AN9 → CH0
AN0 ~AN15をスキャンする CH0を変換してADC1BUF9に書き込む
CH123SA = n/a MUXA入力をサンプリングする: AN10 → CH0
チャンネルCH1/CH2/CH3+入力を使用しない CH0を変換してADC1BUFAに書き込む
CH123NA<1:0> = n/a MUXA入力をサンプリングする: AN11 → CH0
チャンネルCH1/CH2/CH3-入力を使用しない CH0を変換してADC1BUFBに書き込む MUXB入力選択 MUXA入力をサンプリングする: AN12 → CH0
CH0SB<3:0> = n/a CH0を変換してADC1BUFCに書き込む
チャンネルCH0+入力を使用しない MUXA入力をサンプリングする: AN13 → CH0
CH0NB = n/a CH0を変換してADC1BUFDに書き込む
チャンネルCH0-入力を使用しない MUXA入力をサンプリングする: AN14 → CH0
CH123SB = n/a CH0を変換してADC1BUFEに書き込む
チャンネルCH1/CH2/CH3+入力を使用しない MUXA入力をサンプリングする: AN15 → CH0
CH123NB<1:0> = n/a CH0を変換してADC1BUFFに書き込む
チャンネルCH1/CH2/CH3-入力を使用しない ADC割り込み 以上を繰り返す 初回ADC割り込み時の
ADCバッファの状態
2回目ADC割り込み時の ADCバッファの状態
ADC1BUF0 AN0サンプル1 AN0サンプル17
ADC1BUF1 AN1サンプル2 AN1サンプル18
ADC1BUF2 AN2サンプル3 AN2サンプル19
ADC1BUF3 AN3サンプル4 AN3サンプル20
ADC1BUF4 AN4サンプル5 AN4サンプル21
ADC1BUF5 AN5サンプル6 AN5サンプル22
ADC1BUF6 AN6サンプル7 AN6サンプル23
ADC1BUF7 AN7サンプル8 AN7サンプル24
ADC1BUF8 AN8サンプル9 AN8サンプル25
ADC1BUF9 AN9サンプル10 AN9サンプル26
ADC1BUFA AN10サンプル11 AN10サンプル27
ADC1BUFB AN11サンプル12 AN11サンプル28
ADC1BUFC AN12サンプル13 AN12サンプル29
ADC1BUFD AN13サンプル14 AN13サンプル30