ESP32-S3: The DAC Removal That Breaks Projects Ported From the S2

If you are here because dacWrite() stopped compiling after you moved a project to the ESP32-S3: you are not missing a config flag. The peripheral is gone.

The original ESP32 has two 8-bit DAC channels on GPIO25 and GPIO26. The ESP32-S2 kept two 8-bit channels on GPIO17 and GPIO18. The ESP32-S3 has none. Espressif removed the DAC from the S3 entirely; the silicon does not have one, the ESP-IDF DAC driver does not exist for the S3 target, and the Arduino dacWrite() call has nothing to talk to.

This catches teams constantly, because the S3 is marketed, accurately in most respects, as the upgrade path from the S2. It offers more RAM, vector instructions, better USB, and BLE added back. The migration guides cover the GPIO remapping. The DAC removal is in the datasheet, but it is the kind of line nobody reads until the analog output stage of a ported design goes silent.

And because the fix lives on the board, not in the firmware, this is a hardware migration issue: budget for it before you commit to the S3.

Here is what the DAC was probably doing in your design, and the right replacement for each case.

Case 1: Slow Analog Control Voltage (Bias, Reference, Dimming)

If the DAC was generating a DC or slowly varying control voltage (such as a bias for an analog stage, a brightness reference, or a setpoint into a comparator), the replacement is LEDC PWM plus an RC low-pass filter.

The S3’s LEDC peripheral runs up to 14-bit duty resolution, though the highest bit depths require a lower PWM carrier frequency, which trades off against filter ripple and settling time. A first-order RC filter (start around 10 kΩ / 1 µF for control voltages, then size against your required settling time and ripple) turns the PWM into a clean DC level with more amplitude resolution than the old 8-bit DAC, with the caveat that the usable resolution and settling time depend on the filter you choose.

The catch: This needs two passive components on the board. If you are porting firmware onto an existing S3 board that has no filter footprint, you are into a board revision or a bodge. This is why the DAC removal is a hardware migration issue, not just a firmware one: check it at schematic review, not at bring-up.

Case 2: Audio Output

If the DAC was producing audio (even the lo-fi 8-bit audio that hobbyist projects loved the original ESP32 for), stop trying to recreate it on-chip.

The right answer on the S3 is I2S into an external DAC or amplifier: a PCM5102A for line-level output, or a MAX98357A for direct speaker drive. Both are a few euros, both are wired in minutes, and both sound dramatically better than the old internal DAC ever did.

The S3’s I2S peripheral is more capable than the original ESP32’s, so the port usually nets out as an upgrade. The cost is, again, hardware: one small IC and its support passives.

Case 3: Mid-Rate Arbitrary Waveforms

The awkward middle: the DAC was generating a waveform too fast for a filtered PWM to track cleanly but not really audio.

The S3 has a sigma-delta modulator (SDM) peripheral that can output a 1-bit modulated stream on a GPIO; with an RC filter, it behaves like a crude DAC and is the closest on-chip analogue to what you lost. It works, but the effective resolution and noise floor depend heavily on the filter and the signal bandwidth. Furthermore, ESP-IDF’s SDM driver is less traveled than LEDC or I2S; budget bench time to characterize it.

For anything where waveform fidelity actually matters, skip the SDM and use a SPI or I2C DAC. For waveforms, prefer the SPI MCP4921, whose update rate is far higher than the I2C MCP4725, which is limited by the bus. Both cost little and remove the uncertainty.

Case 4: You Were Using the DAC Pins as Cheap Analog Out in a Product

If this is a shipping product line being migrated to the S3 for the USB or compute improvements, treat the DAC removal as a line item in the migration cost: external DAC IC or filter network, board revision, and re-validation of the analog path.

We have seen teams discover this after committing to the S3 on the strength of the digital feature comparison. The migration decision should be made with the full BOM delta in front of you, not just the headline specs.

Why Espressif Removed It

No official single-sentence answer exists, but the engineering logic is straightforward: the 8-bit DAC was the weakest peripheral on the chip. It had poor linearity, audible artifacts, and was rarely used in commercial designs. The die area on the S3 went to things commercial customers actually pay for: vector extensions for AI workloads, more SRAM, and USB-OTG.

The hobbyist community misses the DAC. The commercial design-win spreadsheet does not.

The practical lesson generalizes beyond this one chip: within a vendor family, never assume peripheral continuity between generations. Diff the peripheral tables, not the marketing comparison, before committing to a migration.

S3 Migration Checklist

Before moving any ESP32 or ESP32-S2 design to the S3:

  1. Grep the codebase for dacWrite, dac_output, and dac_oneshot / dac_continuous IDF calls.
  2. Classify each use: * DC control voltage → LEDC + RC filter
    • Audio → I2S + external DAC/amp
    • Waveform → external SPI DAC (or SDM if you can afford to characterize it).
  3. Check the board impact: See whether the replacement needs board changes, filter footprints, or a DAC IC, and fold them into the same revision as the S3 swap.
  4. Re-validate the analog path on real hardware; PWM-derived rails carry switching ripple the old DAC did not.

Migrating a product across chip generations? Peripheral deltas like this one are exactly what a silicon-migration review catches before the board is committed. We run them as short, fixed-scope engagements. Talk to an Embedded Architect →

Frequently Asked Questions

Does the ESP32-S3 have a DAC?

No. The original ESP32 has two 8-bit DAC channels (GPIO25/26) and the ESP32-S2 has two (GPIO17/18), but the ESP32-S3 has no DAC peripheral at all. The ESP-IDF DAC driver is not available for the S3 target, and Arduino’s dacWrite() does not work on it.

How do I get analog output on the ESP32-S3?

For DC or slow control voltages, use the LEDC PWM peripheral with an RC low-pass filter. For audio, use I2S into an external DAC (PCM5102A) or amplifier (MAX98357A). For mid-rate waveforms, use an external SPI DAC such as the MCP4921.

Why did Espressif remove the DAC from the ESP32-S3?

Likely because it was the family’s weakest peripheral and the die area was worth more elsewhere. It had poor linearity and was rarely used in commercial designs, so the space was reallocated to commercially valuable additions like vector instructions and USB-OTG.

Can I port ESP32-S2 audio projects to the ESP32-S3?

The firmware ports, but the analog output stage must be redesigned around I2S and an external DAC or amplifier, which means a hardware change. Audio quality typically improves substantially compared with the old internal 8-bit DAC.


Work With Us
Ready to de-risk your next hardware project?

Join other engineering leaders receiving our monthly insights, or reach out to discuss how Better Devices can help your team ship faster.

Leave a Reply

Your email address will not be published. Required fields are marked *

Let's Discuss Your Engineering Goals

Ready to move your project forward? Schedule a technical discovery session with our senior engineers to explore solutions for your embedded systems, CI/CD, or field engineering challenges.

Better Devices — Newsletter Popup