LTC1660CNをArduinoで動かす


秋月電子で購入したDAコンバータのLTC1660CNのArduino MEGAからの使い方のメモです。
多分MEGAじゃなくとも大丈夫でしょう。

僕の状態:
DAコンバータの初心者
ビット演算わからない→ここ調べながら
マイコン間のシリアル通信をするのは初めて

本記事の内容:
下記の参考記事の内容を元に、LTC1660CNの出力をArduino IDEのシリアルモニタの入力から自由に変えられるようになることを目指します。

参考記事:
LTC1660CN (軍鶏乃記録)2012.6.18
A Library for LTC1665/LTC1660 (Kerry D. Wong)2010.5.2

どんなコードでDACは動かせるのか

Kerry D. Wangさんの記事にはこのようなコードが載っていました(一部抜粋)。

// Kerry D. Wang氏のコードより一部抜粋
// http://www.kerrywong.com/2010/05/02/a-library-for-ltc1665ltc1660/
// コメントの和訳:みくに(訳は1660バージョン、意訳)
// コメントの追加:みくに


// デジタルアナログ変換を行わせる
void output(long chn, long val)
{
  // 16桁のビット列を送る
  // 上位4桁は出力を行うDACのアドレス
  long t = chn << 12; // 16桁のうちchnの4桁を先頭に置く(シフト演算で後ろに12桁の'0'を加える)

  //下位2桁は無視するのでシフト演算で'0'を後ろに2つ加える。
  t = t | val << 2;

  // ここからデータの転送をするためのコード
  digitalWrite(pinCSLD, LOW); // どうやらpinCSLDをLOWにすると転送を開始するらしい。
  for (long i = 15; i >= 0; i--)
  { 
    long b = (t >> i) & 1;
    digitalWrite(pinIN, b);
    digitalWrite(pinSCK, HIGH); // どうやらpinSCKがHIGHになった時のpinINを読み取るらしい
    digitalWrite(pinSCK, LOW);  
  }

  digitalWrite(pinCSLD, HIGH); // どうやらpinCSLDをHIGHにすると転送を終了するらしい。
}

SPI通信がどのような手順で行われているか、僕の推測でコード内にコメントを追加しました。
(間違いがわかり次第、修正していきます。)

それを用いてloop(){}の中にプログラムを実装していけばLTC1660CNを動かすことができるみたいです。

コードを読解して初めて、データシート8ページ目のTIMING DIAGRAM(下図)の意味が理解できました。

Linear Technology LTC1665/LTC1660 data sheet

シリアルモニタから入力した数値を出力させる

Kerryさんの記事のコードをそのまま実行するとchn=1,output=64/1024で出力されるようなので、とりあえず、そのまま書き込んで実行してみようと思います。配線はKerryさんの記事中の画像の通りにします。

またloop(){}内のコードは以下のように書きました。

void loop()
{ // カッコ内のコードをKerryさんの記事のコードのloop(){}のカッコの中に書き入れた状態にする
  if ( Serial.available() > 0 ) {
  delay(20);
  deg = Serial.parseInt();
  }
  if ( deg > 0 && deg < 1024) // 0を除外したのは改行を区別して除外するのが面倒だったから
  {
    output(1,long(deg));
  }
  delay(1000);
  Serial.println(analogRead(pinAnalogOut));
}

これを書き込んでシリアルモニタを起動し適当な数字を入れてみます。
すると、だいたい近い値が検出されました。

入力値-3くらいの数値がシリアルモニタに表示されたので、だいたいうまくいっているはずです。
厳密にコントロールしたいときは1~1023を入れてそれぞれ出力値がどうなるか調べて対応関係を調べておくといいと思います。