Digital Function Generator (MEGA16-P)

16,118

Circuit Image

The function generator features two BNC outputs: one for the high speed [1 to 8 MHz] square signal (BNC1) and another for the DDS signal (BNC2). Offset and amplitude can be regulated by two potentiometers: offset in range of +5V to -5V (POT1) and amplitude in range of 0 to 10V (POT2). Up and down arrow buttons are used for changing the function type (sine, triangle etc.) while left and right arrow buttons are used for changing the frequency value. There is also a separate menu for changing frequency step. When the middle button is pressed, the signal generation starts. The middle button is pressed again for stopping the signal. More details can be found in the original site. Because of the present LCD character orientation, which is different from the original implementation (180 degrees), the following changes in main.c were made:

Buttons LEFT and RIGHT were reversed:

#define LEFT 3//PORTD
#define RIGHT 1//PORTD

Buttons TOP and BOTTOM were reversed:

#define DOWN 4//PORTD
#define UP 0//PORTD

For the latest version of AVR-GCC compiler, the following changes should be made (according to Geoff comment on scienceprog.com):

struct signal {
volatile uint8_t mode; // signal
volatile uint8_t fr1; // Frequency [0..7]
volatile uint8_t fr2; // Frequency [8..15]
volatile uint8_t fr3; // Frequency [16..31]
volatile uint32_t freq; // frequency value
volatile uint8_t flag; // if 0 generator is OFF, 1 is ON
volatile uint32_t acc; // accumulator
volatile uint8_t ON;
volatile uint8_t HSfreq; // high speed frequency [1...4Mhz]
volatile uint32_t deltafreq; // frequency step value
} SG;

The ATMEGA16 fuses should be:

HIGH = 0×59
LOW = 0xCF

This is interpreted to the following options checked (all others unchecked):

OCDEN
SPIEN
BOOTSZ1
BOOTSZ2
SUT1
SUT0

The function generator circuit is designed to provide a versatile waveform output, suitable for various applications in testing and signal processing. The circuit includes two BNC output connectors, allowing simultaneous output of a high-speed square wave signal and a Direct Digital Synthesis (DDS) signal. The high-speed output (BNC1) operates within a frequency range of 1 to 8 MHz, while the DDS output (BNC2) can generate a variety of waveforms, including sine and triangle waves.

Two potentiometers (POT1 and POT2) are incorporated into the design to allow for manual adjustment of the signal's offset and amplitude. POT1 adjusts the offset voltage from +5V to -5V, enabling the user to shift the waveform vertically on an oscilloscope. POT2 controls the amplitude of the output signal, which can be set from 0V to 10V, providing flexibility in signal strength for different applications.

User interface elements consist of up and down arrow buttons for selecting the waveform type and left and right arrow buttons for adjusting the frequency value. This arrangement allows for intuitive navigation through various settings. A dedicated menu facilitates changes to the frequency step, enhancing the functionality of the generator.

The microcontroller at the heart of the circuit is the ATmega16, which manages signal generation and processing. It utilizes a structure to store the operational parameters, including the current mode of operation, frequency settings, and flags indicating the status of the signal generator. The microcontroller's fuses are configured to enable specific features, such as the On-Chip Debugger (OCDEN) and Serial Peripheral Interface (SPIEN), while ensuring the bootloader size is appropriately set.

Overall, this function generator circuit provides a robust platform for generating precise waveforms, making it an essential tool for electronics testing and experimentation.The function generator features two BNC outputs : one for the high speed [1 to 8 MHz] square signal (BNC1) and another for the DDS signal (BNC2). Offset and amplitude can be regulated by two potentiometers : offset in range of +5V to -5V (POT1) and amplitude in range of 0 to 10V (POT2).

Up and down arrow buttons are used for changing the function type (sine, triangle etc.) while left and right arrow buttons are used for changing the frequency value. There is also a separate menu for changing frequency step. When the middle button is pressed, the signal generation starts. Middle button is pressed again for stopping the signal. More details can be found in the original site. Because of the present LCD character orientation, which is different from the original implementation (180 degrees), the following changes in main.c were made : Buttons LEFT and RIGHT were reversed : #define LEFT 3//PORTD #define RIGHT 1//PORTD Buttons TOP and BOTTOM were reversed : #define DOWN 4//PORTD #define UP 0//PORTD For the latest version of AVR-GCC compiler, the following changes should be made (according to Geoff comment on scienceprog.com) : struct signal{ volatile uint8_t mode; //signal volatile uint8_t fr1; //Frequency [0..7] volatile uint8_t fr2; //Frequency [8..15] volatile uint8_t fr3; //Frequency [16..31] volatile uint32_t freq; //frequency value volatile uint8_t flag; //if 0 generator is OFF, 1 is ON volatile uint32_t acc; //accumulator volatile uint8_t ON; volatile uint8_t HSfreq; //high speed frequency [1...4Mhz] volatile uint32_t deltafreq; //frequency step value }SG; The ATMEGA16 fuses should be : HIGH = 0×59 LOW = 0xCF This is interpreted to the following options checked (all others unchecked) : OCDEN SPIEN BOOTSZ1 BOOTSZ2 SUT1 SUT0 🔗 External reference