Control AD8933 waveform generator chip from mBed interfacing with MATLAB

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
pc445
Date:
Mon Jul 07 02:03:22 2014 +0000
Commit message:
communication with Matlab

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jul 07 02:03:22 2014 +0000
@@ -0,0 +1,166 @@
+/////////////////////////////////////////////////////////////////////////
+// AD9833 control code
+// Create by Po-Cheng Chen 07-04-2014
+// Version 0.2 (MATLAB)
+/////////////////////////////////////////////////////////////////////////
+
+#include "mbed.h"
+#include "SPI.h"
+#include "DigitalOut.h"
+
+SPI AD9833_SPI(p5, p6, p7); //mosi, miso, sclk --> don't need MISO
+DigitalOut fSync(p8); //use p8 as FSync data pin (same as chip select)
+
+Serial pc(USBTX, USBRX);    //define serial USB port
+DigitalOut myled1(LED1), myled2(LED2), myled3(LED3), myled4(LED4); //define LEDs
+
+/////////////////////////////////////////////////////////////////////////
+// ASCII to Interger function
+/////////////////////////////////////////////////////////////////////////
+unsigned int ascii2int(char c)
+{
+    unsigned int i;
+    i = 0;
+    switch(c) {
+        case 0x20:
+            i = 0;
+            break;
+        case '0' :
+            i = 0;
+            break;
+        case '1' :
+            i = 1;
+            break;
+        case '2' :
+            i = 2;
+            break;
+        case '3' :
+            i = 3;
+            break;
+        case '4' :
+            i = 4;
+            break;
+        case '5' :
+            i = 5;
+            break;
+        case '6' :
+            i = 6;
+            break;
+        case '7' :
+            i = 7;
+            break;
+        case '8' :
+            i = 8;
+            break;
+        case '9' :
+            i = 9;
+            break;
+        default:
+            i = 0;
+            break;
+    }
+    return i;
+}
+/////////////////////////////////////////////////////////////////////////
+// 8 digit function
+/////////////////////////////////////////////////////////////////////////
+unsigned int digit8(char c7, char c6, char c5, char c4,
+                    char c3, char c2, char c1, char c0)
+{
+    unsigned int k7 = 10000000*ascii2int(c7);
+    unsigned int k6 = 1000000*ascii2int(c6);
+    unsigned int k5 = 100000*ascii2int(c5);
+    unsigned int k4 = 10000*ascii2int(c4);
+    unsigned int k3 = 1000*ascii2int(c3);
+    unsigned int k2 = 100*ascii2int(c2);
+    unsigned int k1 = 10*ascii2int(c1);
+    unsigned int k0 = ascii2int(c0);
+    unsigned int k = k7 + k6 + k5 + k4 + k3 + k2 + k1 + k0;
+    return k;
+}
+/////////////////////////////////////////////////////////////////////////
+// SPI initialization
+/////////////////////////////////////////////////////////////////////////
+void SPI_INITIALIZATION()
+{
+    //Setup the spi for 16 bit data, with 25MHz clock rate, mode 2
+    // Note: mBed is MSB first SPI protocol
+    AD9833_SPI.format(16,2);
+    AD9833_SPI.frequency(25000000);
+    fSync = 1;
+    wait_ms(10);
+}
+/////////////////////////////////////////////////////////////////////////
+// SPI writing
+/////////////////////////////////////////////////////////////////////////
+void write_SPI(short dat)
+{
+    fSync = 0;
+    AD9833_SPI.write(dat);
+    fSync = 1;
+}
+/////////////////////////////////////////////////////////////////////////
+// Calculate desired frequency
+/////////////////////////////////////////////////////////////////////////
+long calFreq(long freq)
+{
+    long  freq_cal;  //define freq calculated value
+    float freq_val = 0.00000000;    //define ferq calculate tempotary value
+    
+    //calculate the frqe reg value
+    //((desired frequency)/(reference frequency)) x 0x10000000.
+    freq_val = (((float)(freq))/25000000);
+    freq_cal = freq_val*0x10000000;
+    return freq_cal;
+}
+/////////////////////////////////////////////////////////////////////////
+// Set frequency register
+/////////////////////////////////////////////////////////////////////////
+void setFreq(long frequency)
+{   
+    int freq_MSB;   //define freq MSB reg value
+    int freq_LSB;   //define freq LSB reg value
+    
+    long freq_cal = calFreq(frequency); //calculate the frequency register
+    
+    freq_MSB = (int)((freq_cal & 0xFFFC000)>>14); // shift 14 bits
+    freq_LSB = (int)(freq_cal & 0x3FFF);
+    
+    freq_MSB = freq_MSB | 0x4000;  //assign freq reg address
+    freq_LSB = freq_LSB | 0x4000;
+    ///////////////////////////////////////////////////////////////////////////////////    
+    //print the data from the serial port to verifiy the function
+    //printf("freq_LSB 0x%x\n\r", freq_LSB);
+    //printf("freq_MSB 0x%x\n\r", freq_MSB);
+    ///////////////////////////////////////////////////////////////////////////////////
+    write_SPI(0x2100);      //write control reg - apply reset
+    write_SPI(freq_LSB);    //write freq reg - LSB
+    write_SPI(freq_MSB);    //write freq reg - MSB
+    write_SPI(0xC000);      //write phase reg - (0 for now)
+    write_SPI(0x2000);      //write control reg - disable reset
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Main function
+// Comments:include the command line from Matlab
+//          Control from COM port
+/////////////////////////////////////////////////////////////////////////
+int main()
+{
+    char buf[128];     // assign buffer for the command from PC
+    SPI_INITIALIZATION(); // initialized the SPI
+    while(true) {
+        if (pc.readable()) {
+            //WAV AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH END \n \0
+            //A, B, C, D ,E, F, G, H are frequency numbers
+            //need 3 + (32) + 3 + 1 + 1 = 40
+            pc.gets(buf, 16);
+            if ((buf[0] == 'W')&&(buf[1] == 'A')&&(buf[2] == 'V')&&(buf[11] == 'E')&&(buf[12] == 'N')&&(buf[13] == 'D')) {
+                myled1 = !myled1;
+                int freq_pc = digit8(buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]);
+                setFreq(freq_pc);
+                
+            } // end of if( buffer read)
+        } // end of if(pc.readable())        
+    }// end of while()
+} // end of main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Jul 07 02:03:22 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/024bf7f99721
\ No newline at end of file