R-2R ladder DAC
The most common way to build a DAC is to use a R-2R ladder circuit. Make: Online has a photo-guide for building one. However, this DAC has no output buffer, which would make this circuit a bit more reliable and working with all kinds of loads.
|MAKE: Online's DAC shield|
Make: Online - Proto-DAC shield for Arduino
A Direct digital synthesizer build using a R-2R ladder DAC - This is worth a look if you're interested in outputting audio.
R-2R ladder DAC with output buffer
For the best results, you should use an output buffer in the DAC. The buffer separates your R-2R ladder from the load you connect it to and makes the result non load dependent. Here's maybe the best tutorial I've seen for a R-2R DAC with an output buffer. It uses a common LM358 operational amplifier that can be driven from single supply. Note that in order to get the full output range to work with this circuit, you need to have a higher than 5V supply for the LM358. Of course, another way to get around this problem is to use a 5V supply but put a simple voltage divider in front of the op amp. Then you'll get lower than 5V output but don't lose fidelity.
|Ikalogic's R-2R DAC with an output buffer.|
Ikalogic's very good page on R-2R DACs
The 2 cent DAC by raalst
A very clever solution utilizing the integrated pullup resistors on the Atmega chip. You need only 1 resistor and as many output pins as you want bits. The output is a bit crude but 500kHz could be reached. The internal pullups are specified to be minimum 20kohms and maximum 50kohms so the result might not be the most accurate.
Arduino Forum - The 2ct DAC
Simple 10-bit DAC by avdweb
This design uses only two output pins, and the circuit is fairly simple, utilizing an op amp. The max settling time is 20ms, which is way too low for audio output. But the settling time could be enhanced with a circuit modification...
Arduino Forum - Simple 10-bit DAC
avdweb - Simple 10-bit DAC
Using the PWM as a DAC
Of course, you can also use the PWM outputs to get an analog output signal from the Arduino. Just put a low pass filter after the PWM output to get a nice & smooth output with a frequency range up to 16kHz, according to this Lab3 experiment.
|A direct digital synthesizer realized with Arduino's PWM output.|
Lab3 - Arduino DDS using PWM
Resistor/PWM hybrid DAC
This is a good explanation on how to combine two PWM outputs in order to double the bit resolution. So combining two 8-bit arduino PWM outputs you can get a 16-bit PWM output! Remember Arduino's limits if you plan on going down this road. I mean, the Atmega chip is just 8-bit...
Link doesn't work? Try this one via the Wayback Machine
SPI-interfacing two Microchip MPC4921 DAC chips with Arduino
Stepan Schulz used SPI to interface two MPC4921 12-bit DAC chips. This saves you pins compared to the R-2R ladder. Using the onboard SPI of the Arduino like Stepan, you need 5 pins, but you can save one (maybe even two) if you code the SPI code by hand.
Stepan's post on the Arduino forum
See the code here
Audio shield with MCP4921 DAC
Adafruit industries' Wave shield is an audio shield for Arduino that also uses the MCP4921 SPI DAC chip. You can play back 12-bit 22kHz wav files. This means the maximum output frequency is 11kHz.
Adafruit Industries - Wave shield
Midivox - synthesizer shield with the MCP4921
Another shield that uses the MCP4921 DAC chip. This one's quite cool, it's a monophonic synthesizer with MIDI input and the synth engine has an attack / release generator and a cool filter! Proves that the Arduino can be used to generate synth sounds.
Narbotic instruments - Midivox - A synth shield featuring the MPC4921.
DAC using AD420 16-bit serial-input DAC
Shaduzlabs.com has a good article for using the AD420 with Arduino. There's schematics, pictures and a code example.
Shaduzlabz.com - High-accuracy 16-bit DAC for Arduino
That's it for now. Thanks for reading! Please comment, if you have anything to add!
[Edit: randy pointed out this site with some hints for Arduino audio DAC solutions. Thanks!]