SPI 2chの12bit DAC。
多分Arduino関連でDAC使おうとしたときにみんなが見つけるであろうMCP4921は1ch
Adafruitだと4922ではなく4921の方を取り扱っていて、違いは1chか2chかというだけ。
MCP4922は秋月で手に入るので素直にこっちを使うといいのです。
MCPほにゃらら共通事項として、複数のポートがある場合、1ポートづつアクセスして設定する必要がある。
MCP4922の場合OUTAとOUTBがあるのでそれぞれ設定する。
簡単な使い方概要。
まずCSをLOWに。LDACをHIGHに。
データの送信。送信するデータはコマンド4ビットとデータ12ビットの合わせて16bit。これで1ポート分。
CSをHIGHに、LDACをLOWに。
ソフトウェアSPIでMCP4922を操作するためのファンクション書いた。
利用するピンは4本。全てアウトプットにする。
ソフトウェアSPIなので好きなピンに割り振ると良いです。
ちなみにリファレンス目的なので速度は考慮してません。
利用するピンとMCP4922の接続。
DACAC - LDAC
DACCS - CS
MCPSCK - SCK
MCPSI - SDI
void writeDAC(uint8_t ch, unsigned short data){
digitalWrite(DACAC,HIGH);
digitalWrite(DACCS,LOW);
digitalWrite(MCPSCK,LOW);
digitalWrite(MCPSI,ch); // A/B
digitalWrite(MCPSCK,HIGH);
digitalWrite(MCPSCK,LOW);
digitalWrite(MCPSI,HIGH); // non bufferd
digitalWrite(MCPSCK,HIGH);
digitalWrite(MCPSCK,LOW);
digitalWrite(MCPSI,HIGH); // gain x1
digitalWrite(MCPSCK,HIGH);
digitalWrite(MCPSCK,LOW);
digitalWrite(MCPSI,HIGH); // output
digitalWrite(MCPSCK,HIGH);
digitalWrite(MCPSCK,LOW);
for(int i = 0 ; i < 12 ; i ++ ){
digitalWrite(MCPSI,((data & (1 << (11-i)))!=0)? HIGH: LOW );
digitalWrite(MCPSCK,HIGH);
digitalWrite(MCPSCK,LOW);
}
digitalWrite(DACCS,HIGH);
digitalWrite(DACAC,LOW);
}
速度を稼ぐ場合はMCUのポートを直接操作してパラレルで扱うことしかないです。
digitalWriteとか使ってる場合ではないのですね。本当は。