2012/12/10

[電子工作]ADコンバーター MCP3002 を使ってみた。

,
放置してたので使わないと…ということで使ってみました。
MCP3002はMicrochipのADコンバーターで、入力2ch、10bitで秋月で売られているものです。
 このADコンバーターはSPIでデータを取得します。なので、SPIマスターにArduinoを使いました。

 ADコンバーターから値を読み込むには、SPIで2byteのデータを送ります。送るデータの内容と送り方は、データシートのFigure 6.1あたりを見てください。
(MCP3002 datasheet p15より抜粋)















上の図を見ると、送るデータのうち設定するのは、3~5bit目のSGL、ODD、MSBFのみということがわかります。楽ですね!
 1bit目は0です。2bit目はStartbitで、必ず1です。これは上図からわかります。
 SGLビットとODDビットは、入力信号のうちどちらのch(0または1)を使うか、差動入力にするか、を設定します。設定の仕方は、データシートp13 Table5-1を参考にしてください。
 MSBFビットは、1にするとデータがMSB(上位ビット)から、0にするとデータがLSB(下位ビット)から送られてきます。これは、データシートp13 5.1章の途中にある"If the MSBF bit is high, then the data will come
from the device in MSB first format and..."あたりを参考にしてください。

なので、例えばch0のデータを、上位ビットから順に送って欲しかったら、0b011101000、0b00000000と送るわけです。

以下Arduinoのコードです。

void setup(){
  Serial.begin(9600);
  pinMode(10, OUTPUT);
}

void loop(){
  //SPI通信を行い、ADコンバーターからデータを取得
  SPI.begin();
  //SPI.setClockDivider(SPI_CLOCK_DIV128);
  digitalWrite(10, LOW);
  byte highbyte = SPI.transfer(0b01101000);
  byte lowbyte = SPI.transfer(0x00);
  digitalWrite(10, HIGH);
  SPI.end();
  unsigned int data = ((highbyte << 8) + lowbyte) & 0x03FF;
  
  //シリアル通信でパソコンに送る
  Serial.println(data);
  delay(500);
}

17行目は、取得した2つのデータを結合しています。highbyteが上位8bitなので、シフト演算で上位8bitになるようずらします。で、データは下位10bitだけなので、0x03FF=0b0000 0011 1111 1111との論理積を取っています。 

SPI.setClockDividerは別にあってもなくても、DIV8でも128でも変わらないです…

このスケッチを書き込むと、こんな感じで、データがシリアルに送られてきます。
シリアルモニタ
























繋ぐのはSPIバスと電源だけですが、一応配線図を…
巷でArduino使いさんたちが使っている、Fritzingというエディタで、実体配線図を書いてみました。自信がないので接続するときは自分でちゃんとデータシート見てください:;(∩´﹏`∩);:
配線図






































配線てD&Dでよかったんですね…部品なくて困ってた…

詰まった点。
1)SPI通信で、CS(Chip Select)が下がらない。
最初は0しか送られてこなくて、困った挙句ロジアナで見てみると、CSが上がったまま。データシートによれば、というか普通はCSが下がるとSPIバスで通信が行われるので、しょうがないので手動でCS(10)を制御しました。
 で、そうするとデータは取得できるようになったのですが、逆にロジアナで見れなくなった…なんでだろう…

0 コメント to “[電子工作]ADコンバーター MCP3002 を使ってみた。”

コメントを投稿