User Tools

Site Tools


This is an old revision of the document!


A completely open design for a function/waveform generator: hardware, firmware, software

for more info, read about openbench

For collected links, try DDS link on delicious and Function Gen link on delicious

Notes & stuff

Design constraints

One or two designs: Low cost, high cost.

  • Low cost is ~$50-75
  • High cost is ~$100-150

Waveforms we want (in order of importance)

  • Sine wave
  • Square wave (with variable PWM)
  • Triangle wave (with variable PWM?)
  • Sawtooth (possibly a modification of triangle wave???)
  • Arbitrary waveform (sync, envelopes, etc)

Frequency range:

  • 1 Hz → 100 KHz required (must cover audio ranges)
  • 1mHz → 10MHz is ideal (digital/analog ranges)

Output capabilities:

  • 50 ohm/inf impedance
  • 1mv → 10V amplitude
  • 0 → 10V DC offset
  • trigger output

USB control? Panel control? Both?

Vpp? (+-12V is pretty 'standard')

100mA is not a bad current capability to shoot for

PCB is doublesided, 10/10 rule

Parts are DIP, thruhole or PLCC (preferred) SOIC, 1206 (likely). No TSSOP, QFP, LLP, MSOP, uSOIC, etc.

Waveform generation

Waveforms we want (in order of importance)

  • Sine wave
  • Square wave (with variable PWM)
  • Triangle wave
  • Sawtooth (possibly a modification of triangle wave???)
  • arbitrary waveform (sync, envelopes, etc)

Frequency range:

  • 1 Hz or lower
  • 100 KHz or higher (must cover audio ranges)
  • 1mHz → 10MHz is ideal (digital/analog ranges)

Generator tech

Two options for chip 'styles' is the all-in-one oscillator (ICL3038, etc) +PLL or DDS


All-in-one is nice, although not very stable w/o PLL. Two options available, MAX038 & XR220.

  • The MAX038 is completely unavailable.
  • And the XR2206 kinda sucks.

Pros: easy, cheap, simple Cons: unavailable, PLL required


Direct-Digital-Synthesis, currently popular. Basically: wavetable + 24 or 32 bit adder and sampling above nyquist to get precision waveforms.

  • Pros: digital, precise, no PLL needed
  • Cons: hard to get high frequencies because of oversampling

Either roll your own or buy off the shelf (basically from AD)

Off the shelf, AD parts

They come with sync out, very very high speeds. But only sine and square out, and in small packages (TSSOP).

Roll your own

Idea #1: Get a chunk of SRAM (like, say, CY7C1399B-12VXC), fill it with your wavetable, then clock it with a variable clock (LTC6903 1KHz→68MHz !!) maybe use along with adder/scaler to provide more range at high/low freq. We could get up to 4MHz, nice!

  • Pros: high frequency range
  • Cons: complex, lots of glue and fiddling, but might be a good solution

Idea #2: SRAM + 32 bit adder, just like AD. Maybe make the adder in a CPLD or something else that can be clocked super-fast (See ELM's DDS generator)

  • Pros: the ideal solution: high resolution, high speed
  • Cons: ugh CPLD, dont even know if there's a good solution available for the price/package we need, a little pricey

Look at: , a handmade adder

For CPLD, 100MHz PLCC (44 or 68) either XC9500 (xilinx) or MAX7000 (altera)

Idea #3: Hand-roll the adder code into an AVR microcontroller, and use onboard memory. Lots of examples: AVR generator or Jesper miniDDS (note: can't we do this in 8 cycles by using LD? just make sure we have an AVR with more than 256b of RAM)

  • Pros: ultra-cheap/simple
  • Cons: 8 @ 20MHz → low frequency output (20M/16samples/8cycles = ~150KHz), 8bit resolution

Other possibilities include going with an SX instead of AVR: SX28 can be clocked up to 75MIPS (maybe give us 500KHz…but will draw an insane 100mA from 5V. jesus!)

Idea #4: A combination of idea #1 and idea #3. Take a simple AVR that is able to calculate waveforms, but not in realtime. Load the wavetable in some external RAM, and clock it at the desired speed.

  • Pros: high frequency, adjustable waveform
  • Cons: complex

Power supply

Need 3.3V (probably), 5V, +-12V (@100mA)

Idea #1 Use 'computer' power supply: $5-$10!

  • Pros: cheap, safe, pretty good quality, universal, big
  • Cons: need to load down 5V - should look into this

Idea #2 Use 78xx's with 120V transformer.

  • Pros: well understood, cheap, safe (isolated), clean power, huge
  • Cons: Transformers kind of a pain, unsafe (to build, wiring 120V yuk)

Idea #3 Use a regulated power supply/wall wart with multiple outputs (see Jameco#154624 5V @0.5A +-12V @0.13A each $13)

  • Pros: Reasonably well priced, regulated, clean power
  • Cons: 'One offs' might be hard to find power supplies for later

Idea #4 DC/DC converters, run off of 'single' supply like 5V or 9VDC

  • Pros: simple, regulated, ultra compact
  • Cons: expensive, noisy

Idea #4b Build your own DC/DC converter, a bit like sprite_tm did. Have the processor generate the PWM needed for the converter.

  • Pros: cheap, same as idea #4
  • Cons: noisy

Planned versions

Inexpensive kit


USB and/or external power (9VDC)

Single output, +12V max (maybe -12V too).

Boost converter: LT1610 will give +12V @ 1.2MHz switching freq. Has 8V max input so must clamp input. ugh.

For isolation, use wall wart that provides 5→9VDC


2x16 LCD and some buttons & rotary encoders for UI. Maybe an 'm88? at 12MHz does the UI work and USB nonsense. (USB "serial" (or raw) interface using USBtiny.) and sends just raw serial/spi commands to DDS chipset


DDS done by dedicated chip probaby Atmega48 running @ 20MHz

DAC is DAC0800 (?)

/home/ladyada/public_html/wiki/data/attic/openbench/fgen.1194630071.txt.gz · Last modified: 2016/01/28 18:05 (external edit)