Puzzle for you – what is this thing?
Maybe the demo sketch helps?
Answer: it’s an 8-bit digital-to-analog converter, using an R-2R ladder network (with 10 kΩ & 20 kΩ resistors).
The above toneGen.pde sketch generates a sine wave of approx 1 KHz:
There’s lots of ways to improve on this and turn it into a general-purpose function generator for example.
The interesting part is that all four ports are used for the required 8 I/O pins, and that due to the regularity of the pin assignment, they can all be set at once with very little code. The pin assignments for the DAC are:
- bit 0 = AIO1
- bit 1 = AIO2
- bit 2 = AIO3
- bit 3 = AIO4
- bit 4 = DIO1
- bit 5 = DIO2
- bit 6 = DIO3
- bit 7 = DIO4
The maximum attainable frequency is about 1.84 Khz with this software approach (1.95 KHz with the sine256 table placed in RAM), but that’s only if you use all 256 steps of the sine wave. The loop itself runs at about 1.84 * 256 = 470 KHz, so based on the Nyquist–Shannon sampling theorem, it should be possible to generate decent signals up to well over 200 KHz. The trick is to increment the “index” variable by larger values:
Here’s the corresponding output:
Still a pretty decent sine wave, so 16 resistors are all it takes to cover the entire audible frequency range.
By using fixed-point calculations for “fractional indexing”, you can get even more fine-grained control over the frequency of the generated signal. The following version generates an 8.01 KHz sine wave on my setup (note that “index” is now a 16 bit unsigned integer):
Update – I’ve changed the main loop to avoid the calling overhead of loop() itself. That increases the maximum attainable frequency by another 50%. Note that interrupts must be disabled to produce a clean tone.
Here is a nice example for the R-2R ladder (with pwm and oversampling) :http://www.tuxgraphics.org/electronics/201005/bench-power-supply-v3.shtml (Made by Guido Socher)
Thanks! I’ve followed up on this on the discussion forum – see http://talk.jeelabs.net/topic/617#post-3462
I’d guess it’s a Covox… and woundn’t be very wrong :o)