How to make a Function Generator from scratch

How to make a Function Generator from scratch

For our Analog Circuits Lab project we decided to make a Function generator. There was only 2 constrains imposed on the project :-

  1. No microcontrollers should be used

  2. Budget constrain of Rs 2500

Practical Introduction

In network analysis and signal processing, function generators are extensively used.

  1. They are used to generate certain commonly used signals like :-

    • Sine wave

    • Square wave

    • Triangular wave

    • Stable DC

  2. Apart from generation, they can be used to adjust the value of the frequency and amplitude required.

An actual Function generator can do soo much more, but these are sought of the most core important functionalities ( that is possible for us to implement at our level with what we know )

Schematic and Intuitions behind Idea

Main Circuits

There are 3 important parts :-

  • Timer controlled Counter Chip

  • Switching Circuit

  • Amplification and Frequency Control

Working

  • The generator generates 4 signals, namely DC, square, sine, and triangular wave.

  • At the beginning, a switching circuit has been implemented to switch between the 4 signals.

    • The circuit uses a 555 timer IC, a 2-bit counter, and 1x4 DeMultiplexer.

    • The 555 timer is used in Monostable mode whose output is controlled by a push button.

    • When the button is pushed, the timer IC generates a pulse which is used to increment the counter.

    • The value of the counter is then used to control the output line of the DeMultiplexer.

  • The Square wave is generated with the use of a timer in A - stable mode.

    • The timer IC behaves as an oscillator and generates a clock pulse.

    • The clock pulse is passed through a summing circuit such that the DC Offset is made 0V.

  • Now, apart from the DC wave, all the other output signals require the square wave. 1

    • Square Wave → Square Wave

    • Square Wave → Integrator → Triangular Wave

    • Square Wave → LC Oscillator → Sine Wave

    • Therefore, a circuit is placed which chooses between the DC output and the square wave output.

      • If DC → ON implies the Square Wave generator is OFF.

      • If DC → OFF implies the Square Wave generator is ON.

  • If the output is a DC wave it is directly taken.

  • If the output is a Square Wave, then depending on whether the signal we want (square, triangular, sine), different operations are performed on the square wave.

  • Which operation to perform is controlled using transistor switches.

    • Which transistor will work in saturation mode and which transistor will work in cutoff mode depends on the output of the DeMultiplexer.
  • At the end, there is a 4X1 Multiplexer which chooses the required signal and feeds it into an amplifier.

  • The amplified signal is displayed on the oscilloscope.

  • In this circuit, we can vary the frequency and the amplitude of the wave using potentiometers.

Simulation Results

Practical Problems Faced

  • LC Oscillator to generate sine wave failed

  • The new solution found to generate sine did not need the 5V that was used to power all the other 3 wave generators

  • Power generators were supplying current when we never expected it to - an anomaly we have no idea for, but few other teams were also running into this issue ( we burnt 3 NOT IC chips )

  • Opamp output when input is 0, is just weird.

Practical Solutions to those Practical Problems

  • Sine wave generating using Opamps and RC oscillator

  • A work around such that the opamp that was used to produce sine wave will be powered on, depending on if we give 5V or not. ( We used 2 other separate Opamps for this. )

  • We figured out the Offset Input and Output pin and potentiometer usage to make the difference as 0.

Practical Conclusion

  • A LOT of noise in real world experiments

  • The more components we use, the more complicated it gets, and more importantly THE HIGHER THE CHANCE FOR NOISE

  • Multisim and LtSpice are BEST TOOLKITS for the job

Thank you,

__CPP_Try_Hard__ ;