Tool/software:
Hi everyone,
we're currently working with a custom PCB that uses the DAC8771, and while basic communication and functionality seem to work, we're encountering a major issue:
The output amplitude is far too low. After some debugging, we suspect the issue might be related to the REFOUT pin.
Instead of the expected 5V reference output, we’re only seeing 1.5V on REFOUT.
Some details about our setup:
- We're not using the internal buck-boost converter.
- We supply external power: ±18V to the DAC.
- The SPI interface is working, and we can send and receive data.
- The DAC is configured in ±24 mA current output mode.
- Microprocessor is an ESP32-S3
We also tested the configuration where REFOUT is disabled, and we supply an external 5V reference to REFIN. However, in this case the output signal becomes even weaker.
We’re wondering:
Is this behavior expected under certain conditions?
Is our initialization sequence correct to enable REFOUT or use REFIN properly?
Could the schematic or power supply setup be the cause?
We'd really appreciate any feedback on whether our approach sounds right, or if anyone has run into a similar problem before.
Thanks in advance!
Pascal Richter
Initialitation code:
void initDAC8771() { // Reset Register (address = 0x01) dac8771WriteRegister(REG_RESET, 1); // reset device delay(100); // Reset Config Register (address = 0x02) dac8771WriteRegister(REG_RESET_CONFIG, (1 << 4) | (1 << 2) | (1 << 1)); // enable internal reference delayMicroseconds(50); // Select buck boost converter A (address = 0x06) dac8771WriteRegister(REG_SELECT_BUCK_BOOST, (0 << DCA)); delayMicroseconds(50); // Configuration Buck-Boost Register (address = 0x07) dac8771WriteRegister(REG_CONFIG_BUCK_BOOST, 0); delayMicroseconds(50); // Disable daisy chain, enable channel A (address = 0x03) dac8771WriteRegister(REG_SELECT_DAC, (1 << CLSLA) | (1 << CHA) | (1 << DSDO) | (0 << CREN) | (0b00 << WPD) | (0 << WEN)); delayMicroseconds(50); // Config DAC Register (0x04) OUT_EN dac8771WriteRegister(REG_CONFIG_DAC, (1 << 12) | (0b0111)); // Output enable and +/- 24mA current mode delayMicroseconds(50); digitalWrite(DAC_CLR, LOW); } void dac8771WriteRegister(uint8_t reg, uint16_t data) { tx_data[0] = reg & 0x7F; // MSB is 0 (write) tx_data[1] = (data >> 8) & 0xFF; tx_data[2] = data & 0xFF; trans.length = 8 * 3; // 3 Byte trans.tx_buffer = tx_data; esp_err_t err = spi_device_queue_trans(spi_dac, &trans, 0); if (err != ESP_OK) { Serial.print("Error writing to DAC8771 register: "); Serial.println(esp_err_to_name(err)); } }
Schematic:
