G2509_U35_内蔵AD変換の実験

20251111

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");

 

            }

 

ブレッドボードで配線変更しつつ、ボリューム抵抗で電圧を変更してテストしました