AD9832 DDS Sinewave (Based on MLabo's AD9834 DDS Sinewave)

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*AD9834 DDS Test 2011/07/14 MLabo*/
00002 /*AD9832 DDS Test based on 2011/07/14 MLabo, by Sakura,Fuyuno */
00003 #include "mbed.h"
00004 
00005 #define XTAL_FREQ ((double)16160000.0)
00006 
00007 DigitalOut FSYN(p8);
00008 DigitalOut SCLK(p7);
00009 DigitalOut SDATA(p5);
00010 Serial pc(USBTX,USBRX);
00011 
00012 void serial_out(uint16_t data) {
00013     FSYN = 0;
00014     data & 0x8000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00015     data & 0x4000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00016     data & 0x2000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00017     data & 0x1000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00018     data & 0x0800? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00019     data & 0x0400? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00020     data & 0x0200? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00021     data & 0x0100? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00022     data & 0x0080? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00023     data & 0x0040? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00024     data & 0x0020? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00025     data & 0x0010? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00026     data & 0x0008? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00027     data & 0x0004? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00028     data & 0x0002? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00029     data & 0x0001? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
00030     FSYN = 1;
00031 }
00032 
00033 typedef union {
00034     uint32_t        UI;
00035     uint8_t        B[4];
00036 } FREQDATA ;
00037 
00038 void AD9832_Init(void) {
00039     FREQDATA FreqReg ;
00040     FreqReg.UI = 0 ;
00041     serial_out(0xF800);
00042     serial_out(0x3300 + FreqReg.B[3]);
00043     serial_out(0x2200 + FreqReg.B[2]);        
00044     serial_out(0x3100 + FreqReg.B[1]);
00045     serial_out(0x2000 + FreqReg.B[0]);
00046     serial_out(0xC000);
00047 }
00048 
00049 void AD9832_SetFreq(double freq) {
00050     FREQDATA FreqReg ;
00051     FreqReg.UI = (uint32_t)(freq * (double)(0x100000000UL) / (XTAL_FREQ) + 0.5);
00052     serial_out(0x3300 + FreqReg.B[3]);
00053     serial_out(0x2200 + FreqReg.B[2]);        
00054     serial_out(0x3100 + FreqReg.B[1]);
00055     serial_out(0x2000 + FreqReg.B[0]);
00056 }
00057 
00058 int main() {
00059     double freq ;
00060     char buf[256] ;
00061     int i,ptr ;
00062     
00063     pc.baud(38400);
00064     SCLK = 1;
00065     SDATA = 0;
00066     FSYN = 1;
00067     AD9832_Init();
00068     AD9832_SetFreq(60.0) ;
00069     while(1) {
00070         pc.printf("\r\nAD9832>");
00071         ptr = 0;
00072         while(1) {
00073             if (pc.readable()) {
00074                 i = pc.getc() ;
00075                 if (i == 0x0D) {
00076                     buf[ptr] = '\0' ;
00077                     break ;
00078                 }
00079                 pc.putc(i) ;
00080                 buf[ptr++] = i ;
00081             }
00082         }
00083         freq = atof(buf) ;
00084         pc.printf("\r\nFreq SET:%g",freq);        
00085         AD9832_SetFreq(freq) ;
00086     }
00087 }