LPC1114のA/Dコンバータでちょっとつまづいたのでメモ。
LPC1114のA/Dコンバータには以下の2つのモードがある。
(1) ソフトウェア制御モード
A/D制御レジスタ(AD0CR)のBURST=0とするとこのモードとなる。
AD0CRのSELでチャンネルを選択し、AD0CRのSTART=001で変換を開始する。
注意すべきは、AD0CRのSELで選べるチャンネルは一つだけであり、二つ以上のビットをセットしてもいちばん若いビットのチャンネルのみがA/D変換される。
Chip_ADC_SetBurstCmd(LPC_ADC, DISABLE);
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH0, ENABLE);
Chip_ADC_SetStartMode(LPC_ADC, ADC_START_NOW, ADC_TRIGGERMODE_RISING);
while (Chip_ADC_ReadStatus(LPC_ADC, ADC_CH0, ADC_DR_DONE_STAT) != SET) {}
uint16_t data;
Chip_ADC_ReadValue(LPC_ADC, ADC_CH0, &data);
(2) ハードウェアスキャンモード
A/D制御レジスタ(AD0CR)のBURST=1とするとこのモードとなる。
ソフトウェア制御モードと異なり、AD0CRのSELで複数のチャンネルを選択できる。
以降はハードウェアが選択されたチャンネルを順次A/D変換し続けてくれる。
注意すべきは、AD0CRのSTARTは必ず000に設定しなければならない。このことは『LPC111x/LPC11C1x User manual』のAD0CRの項に明記されているが、日本語版は訳がおかしい。英語読めという話である。
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH0, ENABLE);
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH1, ENABLE);
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH2, ENABLE);
Chip_ADC_SetBurstCmd(LPC_ADC, ENABLE);
Chip_ADC_SetStartMode(LPC_ADC, ADC_NO_START, ADC_TRIGGERMODE_RISING);
uint16_t data[3];
Chip_ADC_ReadValue(LPC_ADC, ADC_CH0, &data[0]);
Chip_ADC_ReadValue(LPC_ADC, ADC_CH1, &data[1]);
Chip_ADC_ReadValue(LPC_ADC, ADC_CH2, &data[2]);
以上のことは、すべて『LPC111x/LPC11C1x User manual』に書かれている。ググる前にちゃんとマニュアル読めという話である。
SELで複数チャンネルを選択しておいてSTART=001としたタイミングで連続変換できるようなモードがあったら便利なのだけどそんなものはないようだ。