Problem bei der Nutzung eines 14 Bit SPI DACs (Analog AD5641)

Hi,

ich möchte gern einen DAC AD5641 an einen Arduino Nano anschließen. Dafür habe ich ein minimales PCB erstellt und dieses an den Nano angeschlossen.

Nano AD5641

D10 (SS) -> SYNC D11 (MOSI) -> SDIN D12 (MISO) -> unused D13 (SCK) -> SCLK +5V -> VCC GND -> GND

Da der DAC nicht reagiert (keine Nullspannung direkt nach Anschluss, keine Ausgabe irgendeiner Spannung), habe ich den Logicanalyser angeworfen: |500x88

Arduino Code:

SPISettings settingsAD5641(100000, MSBFIRST, SPI_MODE1);
...
void setDacVoltage(uint16_t voltage)
{
  uint16_t transferPackage = 0;

  /* first two bits should be empty -> normal operation
     power down modes are not implemented yet
     0 0 -> normal operation
     0 1 -> 1k to GND
     1 0 -> 100k to GND
     1 1 -> Three state
  */

  // extract the 14 DAC bits from the input value: 00xx xxxx xxxx xxxx = 0x3FFF
  transferPackage |= voltage & 0x3FFF;

  SPI.beginTransaction(settingsAD5641);
  // take the chip select low to select the device:
  digitalWrite(SPI_CHIP_SELECT_PIN, LOW);
  // transfer payload (16 bit)
  SPI.transfer16(transferPackage);
  // take the chip select high to de-select:
  digitalWrite(SPI_CHIP_SELECT_PIN, HIGH);
  SPI.endTransaction();
}

Jetzt weiß ich nicht mehr weiter, sieht jemand hier einen Fehler?

Gib uns einen complierbaren Sketch.
Grüße Uwe

MOSI im Diagramm ist konstant High, nicht das was in Deinem Codeschnipsel steht.

uwefed:
Gib uns einen complierbaren Sketch.
Grüße Uwe

#include <SPI.h>

/**
   Library for using a Analog devices AD5641 14 Bit DAC with Arduino Nano.

   Wiring:

   Nano          STM32   AD5641
   ------------------------------
   D10 (SS)   ->         SYNC
   D11 (MOSI) ->         SDIN
   D12 (MISO) ->         unused
   D13 (SCK)  ->         SCLK
   +5V        -> +3.3V   VCC
   GND        -> GND     GND

   DON'T USE +5V as supply for 3.3V logic boards (e.g. STM32)

   Links:
   - https://www.arduino.cc/en/Tutorial/SPITransaction
*/

#define SPI_CHIP_SELECT_PIN 10
#define SPI_MOSI 11
#define SPI_MISO 12
#define SPI_SCK  13

#define AD5641_MIN_VALUE 0
// 2^14 - 1
#define AD5641_MAX_VALUE 16383

uint16_t value = AD5641_MAX_VALUE;


/* Maximum SCLK frequency is 30 MHz. We use less here for safety   -> 1000000
   Data is transmitted MSB first.                                  -> MSBFIRST
   ...  configured so that the CPOL bit is 0 and the CPHA bit is 1 -> SPI_MODE1
*/
SPISettings settingsAD5641(250000, MSBFIRST, SPI_MODE1);

boolean debug = false;

void setup() {
  Serial.begin(57600);

  /*
      Since this library supports only master mode, this pin should be set always as OUTPUT
      otherwise the SPI interface could be put automatically into slave mode by hardware,
      rendering the library inoperative. It is, however, possible to use any pin as the
      Slave Select (SS) for the devices. For example, the Arduino Ethernet shield uses pin
      4 to control the SPI connection to the on-board SD card, and pin 10 to control the
      connection to the Ethernet controller.
  */
  pinMode(SPI_CHIP_SELECT_PIN, OUTPUT);
  // take the chip select high to de-select:
  digitalWrite(SPI_CHIP_SELECT_PIN, HIGH);
}

void setDacVoltage(uint16_t voltage)
{
  uint16_t transferPackage = 0;

  /* first two bits should be empty -> normal operation
     power down modes are not implemented yet
     0 0 -> normal operation
     0 1 -> 1k to GND
     1 0 -> 100k to GND
     1 1 -> Three state
  */

  // extract the 14 DAC bits from the input value: 00xx xxxx xxxx xxxx = 0x3FFF
  transferPackage |= voltage & 0x3FFF;
  Serial.println(transferPackage, 16);

  SPI.beginTransaction(settingsAD5641);
  // take the chip select low to select the device:
  digitalWrite(SPI_CHIP_SELECT_PIN, LOW);
  // transfer payload (16 bit)
  SPI.transfer16(transferPackage);
  // take the chip select high to de-select:
  digitalWrite(SPI_CHIP_SELECT_PIN, HIGH);
  SPI.endTransaction();
}

void loop() {
  // first bit 1, last bit 1, 14 Bit -> 0x2001
  setDacVoltage(AD5641_MAX_VALUE);
  Serial.println("loop() setDacVoltage finished");

  delay(1000);
}

Erledigt, danke fürs Reinschauen.
Ich mache die Logicauswertung gleich auch neu.

Hallo,

dir fehlt SPI.begin()

Hallo,

mit meinem Mega funktioniert das laut Datalogger.
Takt, MOSI, CS (oben nach unten)

#include <SPI.h>

/**
   Library for using a Analog devices AD5641 14 Bit DAC with Arduino Nano.

   Wiring:

   Nano          STM32   AD5641
   ------------------------------
   D10 (SS)   ->         SYNC
   D11 (MOSI) ->         SDIN
   D12 (MISO) ->         unused
   D13 (SCK)  ->         SCLK
   +5V        -> +3.3V   VCC
   GND        -> GND     GND

   DON'T USE +5V as supply for 3.3V logic boards (e.g. STM32)

   Links:
   - https://www.arduino.cc/en/Tutorial/SPITransaction
*/

const byte SPI_CHIP_SELECT_PIN = 10;
const unsigned int AD5641_MIN_VALUE = 0;
const unsigned int AD5641_MAX_VALUE = 16383;

SPISettings settingsAD5641(250000, MSBFIRST, SPI_MODE1);


void setup() {
  Serial.begin(9600);
  
  digitalWrite(SPI_CHIP_SELECT_PIN, HIGH);
  pinMode(SPI_CHIP_SELECT_PIN, OUTPUT);
  SPI.begin();
  
  setDacVoltage(AD5641_MAX_VALUE);
}


void loop() {
  
}

void setDacVoltage(unsigned int voltage)
{
  unsigned int transferPackage = 0;

  transferPackage = voltage & 0x3FFF;
  Serial.println(transferPackage);
  
  SPI.beginTransaction(settingsAD5641);
  digitalWrite(SPI_CHIP_SELECT_PIN, LOW);
  SPI.transfer16(transferPackage);
  digitalWrite(SPI_CHIP_SELECT_PIN, HIGH);
  SPI.endTransaction();
}

screenshot.png

Danke für die Mühen, aber ich glaube inzwischen dass mein Chip defekt ist. Der Output liegt immer bei 0V, es ist zum Mäusemelken. Werde mal einen neuen besorgen.

Hallo,

so schnell geben wir hier nicht auf. ;) Überprüfe nochmal die Verdrahtung. Notfalls alles ab und neu verdrahten. Aus der Ferne tippe ich auf einen Verdrahtungsfehler. Sind alle Massen verbunden? Liegt 5V an? Sind vielleicht blöde Fragen, sollte man jedoch nachgehen wenn nichts klappt. Sollte man auch mit einem Multimeter messen und nicht mit einem Datalogger. Pin1 Markierung ist korrekt? Sieht du in deinem Datalogger die Signale ordentlich? Gönne ihm einen oder zwei >= 100nF Abblockkondensator.

Das nächste mal: - erst ein fertiges Modul kaufen, dann eigenes entwickeln - immer mindestens 2 Stück kaufen, dann kann man vergleichen.

Hi,

ich hab insgesamt zwei AD5641 bestellt, und fünf PCBs. Bei LCSC/JLCPCB.

@Doc_Arduino: Danke für die Tipps.

Das sind die PCBs: |500x477 Aktuell nutze ich das PCB so, dass der Jumper oberhalb von R3 auf oben steht, also direkte 5V Versorgung. C1 ist unbestückt C3 ist ein 100nF Kerko U1 ist der AD5641 Der untere Teil nutzt einen TL431(U2) als Referenz und ist optional.

Ich hab schon die Verbindungen zwischen dem Pinheader links und jeweils dem U1 oben gemessen, die scheinen ok.

Benötige ich für SPI Pullups oder Terminierungen?

Grüße Benjamin

DrDiettrich: Das nächste mal: - erst ein fertiges Modul kaufen, dann eigenes entwickeln - immer mindestens 2 Stück kaufen, dann kann man vergleichen.

Mir ist kein fertiges 14 oder 16 Bit Modul bekannt, nur das 12 Bit MCP4725, deshalb die Eigenentwicklung. Außerdem eine gute Gelegenheit was zu lernen :) Japp, ich kaufe immer mindestens 2 Stück.

Doc_Arduino: Hallo,

mit meinem Mega funktioniert das laut Datalogger. Takt, MOSI, CS (oben nach unten)

|500x131

...

Das habe ich getestet, sieht auf dem Oszi und Datalogger gut aus. Aber keine Veränderung am Output des DAC.

salami738: Mir ist kein fertiges 14 oder 16 Bit Modul bekannt, nur das 12 Bit MCP4725,

Meist gibt es doch zu jedem halbwegs anspruchsvollen Chip Evaluierungsboards? Meist nicht ganz billig, hier CN0179 für 31$, aber wenn man seine Arbeitszeit abrechnen muß...

Ich hoffe mal, daß die GND Anschlüsse des PCB nicht in der Luft hängen?

DrDiettrich: Meist gibt es doch zu jedem halbwegs anspruchsvollen Chip Evaluierungsboards? Meist nicht ganz billig, hier CN0179 für 31$, aber wenn man seine Arbeitszeit abrechnen muß...

Ich hoffe mal, daß die GND Anschlüsse des PCB nicht in der Luft hängen?

Das komplette BottomLayer ist GND, alle GND Anschlüsse sind verbunden (auch gemessen mit Multimeter).

Hallo,

die Kabel zwischen Arduino und PCB sind auch keinen Meter lang nehme ich an. Wenn alles durchgemessen und okay ist, dann bleibt dir wohl nichts anderes übrig als den 2. IC aufzulöten. Ich kann erstmal keine Fehler erkennen.

Übigens löte ich SMD ICs zum experimentieren auf einen DIP Adapter um dann mittels Steckbrett erste Versuche zu starten. Diese Miniplatinen gibts bei ebay ganz günstig.

Ich kann erstmal nur viel Glück mit dem 2. IC wünschen.