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が最大でした。

前へ

CircuitPython 10行プログラミング STEP7 (3) BMP280と7セグメントLEDの表示

次へ

ArduinoでIoTにチャレンジ<その5> Arduino MKR WiFi 1010に接続されたセンサからのデータをWebブラウザに表示する①