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?
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.
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.
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.
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.
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.
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).
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.