|
setup diary |
最近はADCとしては、MCP3425をよく使っている。内部標準電圧を使用するので参照電圧は不要だし、差動入力で負の電圧も読めるし、i2cなので通信に必要な信号の数が少ないというという利点がある。2.048Vまでの電圧を符号を含めて16bitでADCでき、小さな電圧に対しては8倍まで増幅して読むことも可能である。これをarduino UNOで使うときに、符号の部分でつまづくことがあるので、メモをしておこうと思う。
配線は非常に単純で、電源と測定する電圧とSDA,SCLをつなげば良い。pull upはAVRがしてくれるので、気にしなくても良い。ただし、SDAとSCLはそれぞれA4とA5につながっているので、それらのピンは使えなくなる。
下のプログラムでは、i2cで通信するときには、アドレス0x68を指定して、レジスタに0x88を書き込んでいる。これは、one shot modeで 16bit増幅なしで測定を開始するということを意味する。このモードでは1/15秒で測定が終了する。測定が終了したかを調べることもできるが、その通信によるノイズが入らないように、十分に時間が経ってから、データを読み出す。Wire.read()で1byteのdataを読み出すが、この関数の型はintである。arduino UNOでのintは16bitなので、符号を気にせずに計算する式で、符号もうまく処理できるようだ。何の工夫も無いコードであるが、一応符号も考慮しているのである。しかし、16bit以外のモードではこうは行かないので、注意しなければならない。
#include <Wire.h> void setup(){ Wire.begin(); Serial.begin(9600); delay(100); } void loop(){ Wire.beginTransmission(0x68); Wire.write(0x88); Wire.endTransmission(); delay(100); Wire.requestFrom(0x68,2); Serial.println(Wire.read()*256+Wire.read()); delay(500); }