Finally second and improved AVR DDS signal generator is here. First AVR DDS V1.0 generator was only an attempt of running DDS algorithm without any amplitude control. This time I still wanted to keep things simple like minimum count of widely accessible components circuit, single sided PCB that comes together with good functionality.
AVR DDS specification
AVR DDS signal generator V2.0 is a firmware based DDS signal generator which uses slightly modified Jesper’s DDS algorithm adapted to AVR-GCC C program as in-line ASM. Signal generator has two outputs – one for DDS signal and another for high speed [1..8MHz] square signal – which may be used for reliving microcontrollers with wrong fuse settings or for other purposes as well. High speed (HS) signal is direct output from Atmega16 OC1A(PD5) pin. DDS output is used for all other signals that are generated via R2R resistor network and is adjusted via LM358N offset and amplitude regulating circuits. Offset and amplitude can be regulated by two potentiometers. Offset can be regulated in range +5V..-5V while amplitude in range 0..10V. DDS frequency range is from 0 to 65534Hz that is more than enough for testing audio circuits and other tasks.
Main AVR DDS V2.0 signal generator features:
- Simple circuit with easily accessible and cheap components;
- Single sided PCB;
- In box power supply with external AC plug;
- Dedicated high speed (HS) signal output up to 8MHz;
- DDS signal with variable amplitude and offset;
- DDS signals: sine, square, saw, rev saw, triangle, ECG and noise.
- 2×16 LCD menu;
- Intuitive 5 button keypad.
- Frequency adjusting steps: 1, 10, 100, 1000, 10000Hz;
- Restoring last configuration after power up.
In the block diagram you may see logical structure of signal generatorV2.0
As you can see device requires several voltages: +5V, -12V, +12V, GND. -12V and +12V are used for offset and amplitude control. In this case power supply is constructed by using simple transformer and few voltage regulators.
Power supply block is assembled on a separate prototyping PCB board.
If you do not want to build power supply you may use PC ATX power supply unit where all required voltages are available. You may need to modify molex connector wiring as follows:
LCD menu control
All actions can be viewed in LCD menu. Menu can be controlled with 5 buttons that are next to LCD module
Up and down arrow buttons are used for browsing menu while right and left arrow buttons are used for changing frequency value. When middle button is pressed – signal generating starts. Press middle button again to stop signal generator. Here is a complete menu system of signal generator.
Important to notice, that there is a separate menu for changing frequency step. This is convenient if you need to change generator frequencies in wide range. This allows to set any frequency with relatively few button clicks.
Noise generation don’t have frequency setting. It uses simple rand() function where results are continuously output to DDS output.
High speed signal has four frequencies available: 1, 2, 4 and 8MHz.
Circuit diagram and PCB
Circuit diagram of DDS generator (excluding power supply) is very simple with easy accessible components. It uses following parts:
- AVR Atmega16 microcontroller clocked with 16MHz external crystal;
- Standard HD44780-based 2×16 LCD module;
- R2R DAC made of simple resistors;
- LM358N low power dual op amplifier;
- Two potentiometers;
- 5 buttons;
- several connectors and sockets.
Circuit diagram and PCB:
Single sided PCB:
Assembly
DDS generator is assembled in to plastic box:
Test run:
AVR DDS 2.0 Firmware
As I have mentioned DDS function is a modified Jesper’s DDS algorithm. Main modification is adding additional ASM line which enables to stop DDS generation. In version 1.0 the only option was to reset device, dds function checks if CPHA bit is set in SPCR register which is set during external interrupt service routine (stop button). So now algorithm takes 10 CPU cycles instead 9.
void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0){
asm volatile( “eor r18, r18 ;r18<-0″ “\n\t”
“eor r19, r19 ;r19<-0″ “\n\t”
“1:” “\n\t”
“add r18, %0 ;1 cycle” “\n\t”
“adc r19, %1 ;1 cycle” “\n\t”
“adc %A3, %2 ;1 cycle” “\n\t”
“lpm ;3 cycles” “\n\t”
“out %4, __tmp_reg__ ;1 cycle” “\n\t”
“sbis %5, 2 ;1 cycle if no skip” “\n\t”
“rjmp 1b ;2 cycles. Total 10 cycles” “\n\t”
:
:”r” (ad0),”r” (ad1),”r” (ad2),”e” (signal),”I” (_SFR_IO_ADDR(PORTA)), “I” (_SFR_IO_ADDR(SPCR))
:”r18″, “r19″
);}
DDS Signal tables has to be placed in flash sections where address starts with 0xXX00. So these sections has to be defined in makefile for proper memory placement:
#Define sections where to store signal tables
LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
LDFLAGS += -Wl,-section-start=.MySection6=0x3F00
LCD control library is described here.
I don’t want to go too deep in code discussions. Source code is commented pretty well if there will be any questions and suggestions about source code – feel free to drop a comment.
Testing and discussion
I have tested signal generator with oscilloscope and frequency counter. Signals look like expected in all frequency range [1 to 65535Hz]. Amplitude and offset regulator works OK. If offset is set to 5V, then maximum clear signal amplitude may be 5V as another 5V is already used for offset(same is if offset is -5V).
Here are few test signals on oscilloscope screen:
I am thinking of adding sinus sweep functionality in future firmware updates. Maybe I will if there will be a need
Download latest firmware (WinAVR20071221) and source code version here (source code and hex[120kB])
Download EagleCAD schematic and PCB here ( EagleCAD project[45kB])
Proteus simulation files with latest firmware included (avrdds_proteus [31kB])
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。