Sometimes when tuning various electronic hardware, we need a simple signal generator with different waveforms and frequencies. One of the options is to buy a professional with variable gain professional coating and many additional functions. But if you are a hobbyist, you might want to build one. This small project is dedicated to making one of those signal generators.
AVR DDS signal generator consists of the following parts:
- Atmel Atmega8 8-bit microcontroller;
- Supply source and voltage regulator;
- 2×16 standard LCD and shift register 74HC164;
- Seven buttons;
- R-2R resistor leader for DAC;
- Three outputs: universal(OUT) from DAC, PWM, and pulses;
- Metal case;
- and microcontroller firmware.
Atmega8 microcontroller is a simplest of Atmega series. There is 8kb of FLASH program memory, and the maximum frequency is 16MHz, which is used to reach DDS generators maximum resolution at the maximum rate. For now, frequency is limited from 1 to 65535Hz with the minimal step of 1Hz.
DDS AVR generator is powered with a 9V battery. Voltage is reduced to 5V and stabilized by 7805 voltage regulator.
LCD is controlled using three wires through shift register 74HC164. So this register is used as serial to the parallel converter in order to save microcontroller pins. LCD is controlled in 8-bit mode.
AVR DDS Generator uses seven control buttons:
- Stop, which is a reset also;
- IP- increasing value;
- DOWN- decreasing value;
- Mode1 – signal selection button;
- Mode2 – signal properties;
- Freq – signal frequency multiplier selection.
AVR DDS signal generator uses R-2R digital-to-analog (DAC) converter. This is the simplest solution where resistors are connected in a ladder:
In this schematic, R=10kohm. By using 8 bits and 5V step, a value is about 18.5mV. This is enough for getting average-quality signals.
The generator has three outputs:
- Universal DAC output through the R-2R ladder;
- Impulse (SQ);
Universal output (OUT) is a signal output from DAC. This output forms various signals like sawtooth, sine, square, and triangle.
PWM channel is used to form for PWM signal output – directly from the timer.
SQ channel is an additional channel to form square pulses or second PWM signal. It will be implemented in the future.
The block chart has described the structure of AVD DDS signal generator. You can see the signal paths. Each block part is described in the specification.
Menu and program stages:
After the generator is switched on, the message is displayed in LCD: LCD SCREENS
â€žMode2â€œ button selects the step of frequency from 1 to 10000Hz by pressing it in series. “Up” and “Down” buttons change the frequency value by step value.
After the “Start” button is pressed – the last settings are saved in EEPROM, and signal generation is started.
The above functionality is implemented and tested. In future plans, there are few more signal generation modes. By pressing “Mode1”, you can see the following screens, which may change a little during implementation: LCD Screens1
Circuit diagram and PCB
PCB is single-sided, with some wiring done on the top side.
Circuit diagram explanation:
Microcontroller port pins are connected to:
- R-2R DAC is connected to D port pins 0…7;
- Shift register data line is connected to C port’s 0 pins;
- Shift registers synchronize line is connected to port C pin ;
- LCD screen’s E signal is controlled by C ports pin 2;
- The start button is connected to B port pin 0;
- The stop button is a reset button;
- Up button is connected to port B pin 3;
- Down button is connected to port B pin 4;
- Mode1 button is connected to C port pin 3;
- The mode2 button is connected to C port pin 4;
- Freq button is connected to C port pin 5;
- SQ signal is coming from AVR b port pin 2;
- PWM signal comes out from Port B pin 1.
Part list (exported from eagle): Parts List
In developing this AVR DDS signal generator, There were the following tools used:
- Eagle Cadsoft
- WinAVR 20060421
- Parts (Atmega8, PCB coated with a photoresistive layer, box,…)
- UV exposure unit
- PCB Etcher
- Developer, Etching solution
- Programmer AVR ISP
- Other tools…
Few words about firmware
Program is written in C language and can be compiled with WinAVR20060421 toolset. Programming is done by using AVR ISP and PonyProg programming software.
Program flow in a few words:
When AVR DDS generator is switched on:
- Initialization of LCD;
- Reading previous settings from EEPROM memory and displaying to LCD;
- Using buttons settings and signals can be changed. When the “Start” button is pressed, new settings are saved to EEPROM and signal generation starts.
- Note: After power up, you can press “Start” to start last saved signal generation immediately;
- Generator is stopped by pressing the “Stop” button which resets the generator. After Reset generator again loads its lasts configuration from EEPROM memory and is ready to start a new generation.
EEPROM memory stores following data: EEPROM data
- 0 – OUT_| ¯|_;
- 1 – OUT|/|/|;
- 2 – OUT|\|\|;
- 3 – OUT/\/\/\;
- 4 – OUT~~~~;
- 5 – OUT-NOISE;
- 20 – PWM-OCC;
- 21 – PWM-SINMDS;
- 22 – PWMSQSMDS;
- 23 – PWM-CMDS;
Frequency value is divided to 3 EEPROM bytes. Because max theoretical frequency is 16MHz which hexadecimal value is 0XF42400:
Duty value is from 1 to 99 in percents.
LCD_3w.h – LCD settings
LCD_3w.c it contains LCD control functions
- void sendByteToRegister(uint8_t);
- void LCDenableCommand(void);
- void LCDdisableCommand(void);
- void LCDenableData(void);
- void LCDdisableData(void);
- void LCDsendChar(uint8_t); //forms data ready to send to 74HC164
- void LCDsendCommand(uint8_t); //forms data ready to send to 74HC164
- void LCDinit(void);
- void LCDwritebyte(uint8_t, uint8_t);
- void LCDdefinechar(const uint8_t* ,uint8_t);
- void LCDclr(void);
- void LCDhome(void);
- void LCDstring(uint8_t*, uint8_t);
- void LCDGotoXY(uint8_t, uint8_t);
main.c – main program text where:
- signal tables are stored;
- messages to LCD are described
- EEPROM initialization is done;
- changing parameters are implemented;
- signal generation (using in-line ASM routines) is performed.
<h2 > Testing
For now testing is done by using frequency counter and Oscilloscope. In a frequency range of 1 to 65535Hz works OK. There can be greater frequency range programmed but with less resolution. I think for audio equipment testing there is more than enough frequencies.
As I mentioned earlier, this is a first trimmed version of AVR controlled generator. It has half of working functionality in many cases this can be enough. Main signals are generated and can be controlled. In the future, the functionality can be expanded to add PWM generation using timers. A generator generates signals as they are – directly from DAC. There is no variable gain regulation. To be a more interesting project there can be VGA amplifier used with feedback to control output signal voltage. The project source code is open to modify and expand functionality. If there will be some good modifications – feedback is always welcome.
More pictures from the project:
Download Eagle project files
Some software writing ideas were taken from Jespers Mini DDS.