G2026_MCP3002_2CH_AD変換
2025年11月1日
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);
}

