G2506_U35_MCP3208_8CH_AD変換

202516

8:02

G2506_lpc11u35_8ch_ad_report

 

概要

 

 

 

 

 

 

 

 

 

uint32_t ad_dat;        // AD変換結果

uint8_t ch_no,cs_pin;        // チャネル番号、チップセレクトピン

 

// MCP3208制御ピン代入

SPI_CLK_pin = 17;        // CLK

SPI_SOMI_pin = 18;        // SOMI = Dout

SPI_MOSI_pin = 19;        // MOSI = Din

cs_pin = 20;                // CS

 

    // MCP3208制御  PIO 入力、出力定義

    pin_set_output(SPI_CLK_pin);

    pin_set_input(SPI_SOMI_pin);

    pin_set_output(SPI_MOSI_pin);

    pin_set_output(cs_pin);

 

 

                    // MCP3208実験

                    ch_no = cha_dec_to_int(rcv_buf,1,1);

                    ad_dat = mcp3208_read(cs_pin,ch_no);

                    UART_msg_dec("ad=",ad_dat,"\r\n");

 

実験結果

 

 

 

 

 

 

すべてのチャネルの変換結果

 

 

 

 

 

 

 

 

事前調査で共用関数に問題が発生しました

 

 

 

 

2025.01.06 MON (22:20) goma0099 -12569098-

 LPC共通関数_解凍してLPCフォルダに

 

/////////////////////////////////////////////////

//        自作 mcp3208 IC

/////////////////////////////////////////////////

uint16_t mcp3208_read(

uint8_t prm_cs_pin,                // チップセレクトピン

uint8_t prm_ch_no)                // 変換ch

{

uint16_t        rcv_dat = 0;

uint16_t        cnt;

uint8_t                red_bit;

uint16_t        wait = 0;                // ゼロでも正常

 

pin_out(SPI_CLK_pin,1,'u',5);                // CLK ON DOWN で処理する場合の初期化

pin_out(prm_cs_pin,0,'u',0);                // CS ENABLE

 

//        bit        0        START

//                1        0:DIFF 1:SINGLE

//                2        ch bit2

//                3        ch bit1

//                4        ch bit0

//        ループは 20回回すが 送信は 4BIT のみです

 

spi_snd_down(1,wait);                // 1 スタート

spi_snd_down(1,wait);                // 1:SNGLE  0:DEF (必ずシングルで実行する事)

 

/////////////////////////////////////////////

//        *** チャンネル解析の 1ビットが取得出来ていないような?

//        送信関数をどくりつさせたら 解決しました

/////////////////////////////////////////////

 

if(bit_chk(prm_ch_no,2) == 0) spi_snd_down(0,wait); else spi_snd_down(1,wait);

if(bit_chk(prm_ch_no,1) == 0) spi_snd_down(0,wait); else spi_snd_down(1,wait);

if(bit_chk(prm_ch_no,0) == 0) spi_snd_down(0,wait); else spi_snd_down(1,wait);

 

spi_snd_down(0,wait);

 

//        少し時間待ちすれば良いのに 2msec は長いように思いますが

//        wait_usec() を使うと 変換結果がふらつき 安定しません

//        消費電力の関係かもしれません

wait_sec('m',2);        // AD変換待ち

 

for(cnt=0 ; cnt<=12 ; cnt++)

{

red_bit = 12 - cnt;

// MOSI

if(spi_snd_down(0,wait) == 1) rcv_dat |= (1 << red_bit);

else rcv_dat &= ~(1 << red_bit);

}

 

pin_out(prm_cs_pin,1,'u',0);                // CS DISABLE

 

// 2025.01.06 MON (22:08) goma0099 -12569098-

// 本関数をLPC11U35で調査したとき、変換結果が反転していたので

// 対策していましたが、本日テストすると、再度反転して、LPC812と同じ

// 処理で正常になっていました

// CPUタイプ別の処理は、再び反転した場合のためコメントにして残します

 

//if(LPC_I2C_CPU_TYPE == 1) return(4095-(rcv_dat&0xFFF));

//else return(rcv_dat & 0xFFF);

 

return(rcv_dat & 0xFFF);

}