G2026_MCP3002_2CH_AD変換

2025111

13:03

 

G2026_lpc812_mcp3002_ad_converter

 

 

10bit 2ch ADコンバーター MCP3002-I/P: 半導体 秋月電子通商-電子部品・ネット通販

 

 

 

 

 

 

 

プロジェクトの複写

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

//        自作 mcp3002 IC  10 bit 2ch AD変換

//        2025.11.1 土曜 goma0099

//                修正点はチャネルビット送信と、データヒット長のみで後は MCP3208 と同じでした

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

uint16_t mcp3002_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 bit0

//

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

 

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

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

 

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

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

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

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

 

// MCP3002 ように変更しました チャネルは1ビットのみ送信です

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変換待ち

 

// MCP3002用に修正しました、データ長は 10ビットです

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

{

red_bit = 10 - 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);

}