2017年
5月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2017-05-04 ADコンバーター

_ MCP3425とarduino UNO

最近は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);
}

2017-05-05 DAコンバーター

_ MCP4922とarduino UNO

DACとしては、以前はMCP4922を使っていたが、最近は MCP4726を使うようになった。前者のinterfaceはSPIで、後者はI2Cである。arduinoでMCP4922を使ったことが無かったので、プログラムを書いてみた。

arduino UNOのSPIは、SS(10), MOSI(11), MISO(12), SCK(13)の4pinを使って行なわれる。今回は、ICにコマンドを送るだけなので、MISOは使わない。また、MCP4922のLDACは9pinに、SHDNはVccに接続した。SPIの使い方は、SPI.hを組み込んで、モードをセットして、書き込む。

serialからDAのデータを受け取るときに、どのような処理をしようか迷ったが、parseIntを使うと、数字をintに変換してくれるので、正の数だとchAを、負の数だとchBにデータを送るようにしてみた。

#include <SPI.h>
#define LDAC   9
void setup(){
  Serial.begin(9600);
  pinMode(LDAC,OUTPUT);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  SPI.setDataMode(SPI_MODE0);
}
void loop() {
  if(Serial.available()>0){
    int i=Serial.parseInt();
    digitalWrite(LDAC,HIGH);
    digitalWrite(SS,LOW);
    if(i<0){i=-i-1;i|=0x8000;}
    i|=0x3000;
    SPI.transfer(i >> 8);
    SPI.transfer(i & 0xff);
    digitalWrite(SS,HIGH);
    digitalWrite(LDAC,LOW);
    delay(500);
  }
}