ANALOG OUTPUT ③ MKR WiFi 1010にDAC MCP4921
MKR WiFi 1010のSPIバスに、外付けで12ビットD-AコンバータMCP4921を取り付けます。前回使用したI2CバスのMCP4725とは、バス速度が異なります。
●MCP4921のおもなスペック
- 分解能 12ビット
- 電源電圧 2.7~5.5V
- レール・ツー・レール出力(0.010V~Vdd)
- セトリング時間 4.5us
- Vref入力端子
- スルーレート 0.55V/us
- SPIバス ~20MHz
- 出力 x1とx2
DIPパッケージのデバイスをebayで入手しました。
●接続
MCP4921 ピン番号 |
MCP4921 機能 |
MKR WiFi 1010 |
---|---|---|
1 | Vdd | Vcc 3.3V |
2 | /CS | 7 |
3 | SCK | 9 SCK |
4 | SDI | 8 MOSI(COPI) |
5 | /LDAC | 6 |
6 | Vrefa | Vcc |
7 | AVss | GND |
8 | Vouta | - |
(最近の表示の変化。MOSIー>COPI、MISOー>CIPO)
●スケッチ
書き込むレジスタです。16ビットのデータなので、8ビットずつ送ります。最初の8ビットのうち、最初の4ビットは0b0011もしくは0b0111です。D0を送ると、/CSをHighにし、/LDACをLowにすれば、Voutに出力が現れます。
bit15 | bit14 | bit13 | bit12 | bit11~bit0 |
---|---|---|---|---|
A/B選択 0:DACa |
BUF選択 0:Unbuffered |
x1、x2選択 1: x1 |
SHDN選択 0:Output buffer disabled, Output is high impedance |
D11~D0出力 |
最初にD11~D0は全部'1'の最大値を、次に全部'0'の最小値を繰り返し送ります。
#include <SPI.h>
#define LDAC 6
#define SS 7
SPISettings settings(10000000,MSBFIRST,SPI_MODE0);
void setup() {
pinMode(LDAC, OUTPUT);
pinMode(SS, OUTPUT);
Serial.begin(9600);
SPI.begin();
}
void loop() {
SPI.beginTransaction(settings);
digitalWrite(LDAC, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(0b00111111); //
SPI.transfer(0b11111111);
digitalWrite(SS, HIGH);
digitalWrite(LDAC, LOW);
SPI.endTransaction();
SPI.beginTransaction(settings);
digitalWrite(LDAC, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(0b00110000); //
SPI.transfer(0b00000000);
digitalWrite(SS, HIGH);
digitalWrite(LDAC, LOW);
SPI.endTransaction();
}
実行結果です。出力には10kΩの負荷抵抗を入れています。
SPIバスの転送速度は10MHzが最大でした。