Arduino LFO Waveform Generator V2

(C) 2011, G. Forrest Cook

Arduino LFO V2 Schematic

Arduino LFO V2 Prototype


This project uses an Arduino microprocessor and a MAX522 8 bit serial DAC to produce arbitrary low frequency oscillator (LFO) waveforms. These waveforms are useful for driving a tremolo/vibrato circuit in a guitar amplifier such as the Lil Tiger or the Hammonator 2RVT. This is a second generation version of this project, see the first version for reference.

The first prototype of this project was build using the Arduino Diecimila development board and an Arduino prototype shield for the DAC and associated parts. The original assembly can be seen in the photographs of the Lil Tiger project. This final version of the circuit was built using just the Arduino's Atmega 168 (or Atmega 328) processor chip on a hand-wired perf-board as shown in the above photo. The microprocessor should be programmed on the Arduino board then moved to the stand-alone LFO board.


The 7.5VDC power to the board comes from a full-wave Schottky diode bridge rectifier and 2200uF filter capacitor that is connected to the 6.3VAC filament winding of a vacuum tube power supply. The 7.5V is regulated down to 5V using a 78L05 regulator. The 7.5V and 5V sources power the processor, DAC and op-amp. Note that when this circuit is used with the Lil-Tiger amp, the LFO ground is not connected to the chassis ground, it is floating at 3.15VAC. Be sure to keep the LFO circuit board electrically isolated from the chassis.

The DAC is a MAX522 that is connected to Port B on the Arduino, the port is setup to use the SPI (serial) output mode. The DAC output goes to an RC low-pass circuit to remove the waveform stairsteps. The smoothed waveform is sent to a variable voltage divider that is used to set the LED bias voltage to 1.4V. The output of the voltage divider drives two sections of a TLC2272 CMOS rail-to-rail op-amp. Note that the LED bias adjustment changes the waveform amplitude, first adjust the LED bias setting then adjust the LVR drive setting.

One op-amp section drives the front panel LED and the other drives the Light Variable Resistor opto coupler. Note that the TLC2272 op-amp sections have a fairly low maximum output current, the 1.5K resistors limit the LED currents to below this level. The low drive level is perfect for the opto-coupler, which uses a standard-output red LED. The front panel LED indicator should be a high-efficiency red LED for maximum brightness.

The bias is set so that the LED is just turning on when the DAC is producing zero volts of output, red LEDs typically turn on at around 1.4V. The bias adjustment can be preset by adjusting the potentiometer to 26.5K. A more accurate bias adjustment can be done by monitoring the output of either TLC2272 op-amp section with an oscilloscope in DC mode and setting the low point of the waveform to 1.4V. Due to the above mentioned floating ground situation, the scope ground should be floated or the LFO should be powered by an external 7.5VDC supply when adjusting the LED bias.

The LMC555 CMOS timer IC is configured as a standard multivibrator circuit, the only tricky part involves the dual 500K audio taper speed potentiometer. Normally the frequency in such a circuit is changed with one variable resistor, however this approach does not produce a wide enough range of frequencies for an LFO circuit. By changing the value of both resistors in the timing circuit, a much wider frequency range can be achived. The two 20K resistors set the maximum oscillator speed.

Note that the pot motion is reversed, fast is counter-clockwise and slow is clockwise. This is a minor inconvenience that allows using a common and inexpensive dual audio-taper 500K pot, if you can find a dual log-taper pot (good luck), the operation can be flipped back to "normal".


The current Arduino "sketch" for this project is BigBot522irq.pde, it uses a clocked hardware interrupt to step through an exponentially weighted sine wave. The modified sine wave compensates for the phase shift circuit's response to produce a more natural sweeping sound.

The waveforms were generated by this Python language program: The program was run and the output wave tables were stored in a file and transferred into the Arduino source code with a text editor.

Back to FC's Music Circuits page.