G2509_U35_内蔵AD変換の実験
2025年11月11日
11:15
G2509_lpc11u35_built-in_AD_conversion_experiment
Version:0.9 StartHTML:00000000 EndHTML:00000000 StartFragment:00000000 EndFragment:00000000 G2509
概要
![]()
ADチャネルとPIN一覧
|
AD番号 |
PIN番号 |
説明 |
|
|
0 |
21 |
|
|
|
1 |
22 |
|
|
|
2 |
23 |
|
|
|
3 |
24 |
|
|
|
4 |
25 |
|
|
|
5 |
26 |
使えません |
|
|
6 |
20 |
使えません |
|
|
7 |
27 |
|
|
過去資料の調査




一部を発見しました

// AD 変換 10 BIT 4 CH
if(rcv_buf[0] == '1')
{
AD_Configuration(); // (2) A-Dコンバータの初期化
wait_sec('m',2);
UART_puts(" A-D(0-3), "); // (5) タイトル表示
for(cnt=0 ; cnt<5 ; cnt++)
{
ad_data = Get_ADC_Data(cnt); // (6) A-D変換のデータ取得
UART_putdec(ad_data); // (7) A-D変換データの表示
UART_puts(", "); // (5) タイトル表示
}
UART_puts("\r\n");
}

テストのプロジェクトは、下記とします


adc_LPC11U35.h を編集します


|
AD0 |
TDI_PIO0_11 |
21 |
|
|
AD1 |
TMS_PIO0_12 |
22 |
|
|
AD2 |
TDO_PIO0_13 |
23 |
|
|
AD3 |
TRST_PIO0_14 |
24 |
|
|
AD4 |
SWDIO_PIO0_15 |
25 |
|
|
AD5 |
PIO0_16 |
26 |
|
|
AD6 |
PIO0_22 |
20 |
|
|
AD7 |
PIO0_23 |
27 |
|



AD変換のモニタコード



実験回路を構成します


実験中の問題点など考察
ヘッダーファイルの最終コード




// A-Dコンバータ初期化関数
// PIN毎に定義をします
void AD_Configuration(uint8_t prm_ch)
{
if(prm_ch < 0 || 7 < prm_ch) return;
if(prm_ch == 5) return;
if(prm_ch == 6) return;
switch(prm_ch)
{
case 0:
// AD0 pin 21
LPC_IOCON->TDI_PIO0_11 &= ~(1 << 7); // (1) アナログ入力モードの選択(ADMODE='0')
LPC_IOCON->TDI_PIO0_11 &= ~(1 << 4); // (2) プルアップ抵抗を無効(MODE='00')
LPC_IOCON->TDI_PIO0_11 |= (1 << 1); // (3) A-D機能の選択(FUNC='010')
LPC_ADC->CR |= (1 << 0); // (6) A-D入力ポートをAD0に選択(SEL='00000010')
break;
case 1:
// AD1 pin 22
LPC_IOCON->TMS_PIO0_12 &= ~(1 << 7); // (1) アナログ入力モードの選択(ADMODE='0')
LPC_IOCON->TMS_PIO0_12 &= ~(1 << 4); // (2) プルアップ抵抗を無効(MODE='00')
LPC_IOCON->TMS_PIO0_12 |= (1 << 1); // (3) A-D機能の選択(FUNC='010')
LPC_ADC->CR |= (1 << 1); // (6) A-D入力ポートをAD1に選択(SEL='00000010')
break;
case 2:
// AD2 pin 23
LPC_IOCON->TDO_PIO0_13 &= ~(1 << 7); // (1) アナログ入力モードの選択(ADMODE='0')
LPC_IOCON->TDO_PIO0_13 &= ~(1 << 4); // (2) プルアップ抵抗を無効(MODE='00')
LPC_IOCON->TDO_PIO0_13 |= (1 << 1); // (3) A-D機能の選択(FUNC='010')
LPC_ADC->CR |= (1 << 2); // (6) A-D入力ポートをAD2に選択(SEL='00000010')
break;
case 3:
// AD3 pin 24
LPC_IOCON->TRST_PIO0_14 &= ~(1 << 7); // (1) アナログ入力モードの選択(ADMODE='0')
LPC_IOCON->TRST_PIO0_14 &= ~(1 << 4); // (2) プルアップ抵抗を無効(MODE='00')
LPC_IOCON->TRST_PIO0_14 |= (1 << 1); // (3) A-D機能の選択(FUNC='010')
LPC_ADC->CR |= (1 << 3); // (6) A-D入力ポートをAD3に選択(SEL='00000010')
break;
case 4:
// AD4 pin 25
LPC_IOCON->SWDIO_PIO0_15 &= ~(1 << 7); // (1) アナログ入力モードの選択(ADMODE='0')
LPC_IOCON->SWDIO_PIO0_15 &= ~(1 << 4); // (2) プルアップ抵抗を無効(MODE='00')
LPC_IOCON->SWDIO_PIO0_15 |= (1 << 1); // (3) A-D機能の選択(FUNC='010')
LPC_ADC->CR |= (1 << 4); // (6) A-D入力ポートをAD4に選択(SEL='00000010')
break;
case 5:
// AD5 pin 26 xxxxx 使えません
LPC_IOCON->PIO0_16 &= ~(1 << 7); // (1) アナログ入力モードの選択(ADMODE='0')
LPC_IOCON->PIO0_16 &= ~(1 << 4); // (2) プルアップ抵抗を無効(MODE='00')
LPC_IOCON->PIO0_16 |= (1 << 1); // (3) A-D機能の選択(FUNC='010')
LPC_ADC->CR |= (1 << 5); // (6) A-D入力ポートをAD5に選択(SEL='00000010')
break;
case 6:
// AD6 pin 20 xxxxx 使えません
LPC_IOCON->PIO0_22 &= ~(1 << 7); // (1) アナログ入力モードの選択(ADMODE='0')
LPC_IOCON->PIO0_22 &= ~(1 << 4); // (2) プルアップ抵抗を無効(MODE='00')
LPC_IOCON->PIO0_22 |= (1 << 1); // (3) A-D機能の選択(FUNC='010')
LPC_ADC->CR |= (1 << 6); // (6) A-D入力ポートをAD6に選択(SEL='00000010')
break;
case 7:
// AD7 pin 27
LPC_IOCON->PIO0_23 &= ~(1 << 7); // (1) アナログ入力モードの選択(ADMODE='0')
LPC_IOCON->PIO0_23 &= ~(1 << 4); // (2) プルアップ抵抗を無効(MODE='00')
LPC_IOCON->PIO0_23 |= (1 << 1); // (3) A-D機能の選択(FUNC='010')
LPC_ADC->CR |= (1 << 7); // (6) A-D入力ポートをAD7に選択(SEL='00000010')
break;
}
LPC_SYSCON->PDRUNCFG &= ~(1 << 4); // (4) A-Dコンバータに電力を供給(ADC_PD='0')
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 13); // (5) A-Dコンバータにクロックを供給(ADC='1')
LPC_ADC->CR |= (10 << 8); // (7) クロック周波数の設定(CLKDIV='10')
LPC_ADC->CR |= (1 << 16); // (8) ハードウエア・スキャン・モードの選択(BURST='1')
}
uint32_t Get_ADC_Data(uint8_t prm_ch)
{ // A-D変換データ取得関数
uint32_t data = 0; // 変数定義
if(prm_ch < 0 || 7 < prm_ch) return 0;
if(prm_ch == 5) return 0;
if(prm_ch == 6) return 0;
AD_Configuration(prm_ch); // 変換のたびに定義を繰り返す安定動作の為
while (((data = LPC_ADC->DR[prm_ch]) & (1<<31)) == 0); // (1) A-D変換の完了待ち
data = (data >> 6) & 0x3ff; // (2) A-D変換データの取り出し
return data; // (3) A-D変換データを戻り値として返す
}

シリアル通信を使って変換テストをした後の考察

if(rcv_buf[0] == 'd' || rcv_buf[0] =='D')
{
// 内蔵AD変換の実験をします
// コマンド解析
// 0123456
// D0
ch = cha_dec_to_int(rcv_buf,1,1);
ad_dat = Get_ADC_Data(ch);
UART_puts("Bilt-in AD CH=");
UART_putdec(ch);
UART_puts(" DAT=");
UART_putdec(ad_dat);
UART_puts("\r\n");
}
ブレッドボードで配線変更しつつ、ボリューム抵抗で電圧を変更してテストしました




