皆様,次の事象で困っています.CSI20とmcp3208を接続し次のプログラムを動作させると電圧は適切に取得されます.しかし,これを2回目に動作させる,すなわちループにすると電圧が正しく取得できません.rx_bufAの[1] to [2]をデータ処理していますが,これが問題でしょうか?
ご指導よろしくお願いします.
void CSI20_ch_MCP3208(uint8_t ch, uint8_t sample, float *v){ uint16_t data; float sum; uint8_t i; rx_bufA[0] = 0x00; rx_bufA[1] = 0x00; rx_bufA[2] = 0x00; tx_bufA[0] = 0x06; if (ch == 0) { tx_bufA[1] = 0x00; } if (ch == 1) { tx_bufA[1] = 0x40; } if (ch == 2) { tx_bufA[1] = 0x80; } if (ch == 3) { tx_bufA[1] = 0xC0; } tx_bufA[2] = 0x00; tx_numA = 3; sum = 0; for (i=0; i<sample; i++) { CS_CSI20 = 0U; // Select Chip g_csi20_comflag = 0xFF; // send flag set R_CSI20_Send_Receive(tx_bufA, tx_numA, rx_bufA); /* send instruction */ while (g_csi20_comflag) /* wait for transmit complete */ { NOP(); } CS_CSI20 = 1U; // Deselect Chip data = rx_bufA[1]; data = data << 8; data = data | rx_bufA[2]; data = data & 0x0FFF; sum += (float)data * 2.492 / 4096; } *v = sum/sample;}
皆様,
Trail and Errorで何とか正常に動作するようになりました.問題は,次の2点でした.
(1)Chip Selectの処理
(2)あるchのADCデータを取得したあと,waitをもたせる(今回の場合,100msのwait).
電圧は,小数点第2位以下が異常でした.異常の程度は,あるchをテスタで測定すると1.834Vなのに1.854Vになるという状態でした.
上記2点の修正で,連続的に複数ch(私の場合4ch)をLoopで回しても,当該chはコンスタントに1.834を取得できるようになりました.
インターネットでMCP3204の記事があり参考にしようとしましたが,ある程度精密な測定をしようとする場合,これらの記事が本当に正しく電圧を測定しているものかどうか疑問です.また,私にとって,MCP3204/3208のマニュアルはわかりずらく,これもあまり参考になりませんでした.