G2506_U35_MCP3208_8CH_AD変換
2025年1月6日
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-
/////////////////////////////////////////////////
// 自作 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);
}