a

Dependencies:   mbed

main.cpp

Committer:
visarute
Date:
2015-08-20
Revision:
0:4e9491b0ed04

File content as of revision 0:4e9491b0ed04:

// Paladin board control code
// control switch matrix and function generator
// by Visarute Pinrod 4/23/2015
// with AD9833 control code from Po-Cheng Chen 07-04-2014

#include "mbed.h"
#include "SPI.h"
#include "DigitalOut.h"

SPI spi1(p5, p6, p7); //mosi, miso, sclk --> don't need MISO
DigitalOut cs_AD9833(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

DigitalOut set1(p15);
DigitalOut set2(p16);
DigitalOut set3(p19);
DigitalOut set4(p18);
DigitalOut set5(p23);
DigitalOut set6(p25);
DigitalOut set7(p27);
DigitalOut set8(p29);

DigitalOut rset1(p13);
DigitalOut rset2(p14);
DigitalOut rset3(p20);
DigitalOut rset4(p17);
DigitalOut rset5(p24);
DigitalOut rset6(p26);
DigitalOut rset7(p28);
DigitalOut rset8(p30);

DigitalOut enableVout(p21);
DigitalOut disableVout(p22);

// get value from command format
int getVal(char *cmd){
    int val=-1;
    char valC[4];
    valC[0]=cmd[3];
    valC[1]=cmd[4];
    valC[2]=cmd[5];
    valC[3]=cmd[6];
    sscanf(valC,"%4x",&val);
    return val;
}

// Start SPI connection
void startSPI(){
    spi1.format(8,3);
    spi1.frequency(1000000);
    cs_AD9833 = 1;
}

void writeAD9833(short dat)
{
    cs_AD9833 = 0;
    spi1.write(dat>>8);
    spi1.write(dat&0xFF);
    cs_AD9833  = 1;
}

/////////////////////////////////////////////////////////////////////////
// Function for AD9833 control code
// Create by Po-Cheng Chen 07-04-2014
// Version 0.2 (MATLAB)
/////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////
// 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))/10000000);
    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);
    ///////////////////////////////////////////////////////////////////////////////////
    writeAD9833(0x2100);      //write control reg - apply reset
    writeAD9833(freq_LSB);    //write freq reg - LSB
    writeAD9833(freq_MSB);    //write freq reg - MSB
    writeAD9833(0xC000);      //write phase reg - (0 for now)
    writeAD9833(0x2000);      //write control reg - disable reset
}

void swInitial(){
    set1 = 0;
    set2 = 0;
    set3 = 0;
    set4 = 0;
    set5 = 0;
    set6 = 0;
    set7 = 0;
    set8 = 0;
    rset1 = 0;
    rset2 = 0;
    rset3 = 0;
    rset4 = 0;
    rset5 = 0;
    rset6 = 0;
    rset7 = 0;
    rset8 = 0;
    enableVout = 0;
    disableVout = 0;
}

void setSwitch(DigitalOut& sw){
    sw = 1;
    wait(0.005);
    sw = 0;
    wait(0.05);
}

void setRotation(){
    setSwitch(set1);
    setSwitch(rset2);
    setSwitch(rset3);
    setSwitch(set4);
    setSwitch(set5);
    setSwitch(rset6);
    setSwitch(set7);
    setSwitch(rset8);
}

void rsetRotation(){
    setSwitch(rset1);
    setSwitch(set2);
    setSwitch(set3);
    setSwitch(rset4);
    setSwitch(rset5);
    setSwitch(set6);
    setSwitch(rset7);
    setSwitch(set8);
}

void setX(){
    setSwitch(rset1);
    setSwitch(rset2);
    setSwitch(rset3);
    setSwitch(set4);
    setSwitch(set5);
    setSwitch(set6);
    setSwitch(rset7);
    setSwitch(set8);
}

void rsetX(){
    setSwitch(set1);
    setSwitch(set2);
    setSwitch(set3);
    setSwitch(rset4);
    setSwitch(rset5);
    setSwitch(rset6);
    setSwitch(set7);
    setSwitch(rset8);
}

void setY(){
    setSwitch(set1);
    setSwitch(rset2);
    setSwitch(set3);
    setSwitch(set4);
    setSwitch(rset5);
    setSwitch(set6);
    setSwitch(rset7);
    setSwitch(rset8);
}

void rsetY(){
    setSwitch(rset1);
    setSwitch(set2);
    setSwitch(rset3);
    setSwitch(rset4);
    setSwitch(set5);
    setSwitch(rset6);
    setSwitch(set7);
    setSwitch(set8);
}

void setModeR(){
    swInitial();   
    setRotation();
    rsetRotation();
    setRotation();
    setRotation();
    swInitial();   
}

void setModeX(){
    swInitial();   
    setX();
    rsetX();
    setX();
    setX();
    swInitial();   
}

void setModeY(){
    swInitial();   
    setY();
    rsetY();
    setY();
    setY();
    swInitial();   
}

void enableOutput(){
    swInitial();  
    setSwitch(enableVout);
    swInitial();  
}

void disableOutput(){
    swInitial();  
    setSwitch(disableVout);
    swInitial();  
}

// Start connection
void initialization(){
    pc.baud(921600);
    startSPI(); // Start SPI connection 
    setModeR();
    disableOutput();
    enableOutput();
    enableOutput();
}


int main(){
    // Variable for main function
    char buf[16];       // Buffer for the command from PC
    int val;          // Value from command
    
    // Start system
    initialization();
    // Infinite loop: listen to serial command
    while(1) {
        if (pc.readable()) {
            //Command format: Start Mode Submode VALUe enD   S F F FFFF D
            pc.gets(buf, 16);
            //pc.printf("Get buf: %s\n",buf);
            if ((buf[0] == 'S')&&(buf[7] == 'D')) {
                //Mode switch
                switch(buf[1]) { 
                //set axis mode
                case 'm': 
                    // Submode switch
                    switch(buf[2]) { 
                    case 'r':
                        setModeR();
                        break;
                    case 'x':
                        setModeX();
                        break;
                    case 'y':
                        setModeY();
                        break;
                    default:
                        break;
                    }
                //Output enable
                case 'o': 
                    // Submode switch
                    switch(buf[2]) { 
                    case 'T':
                        enableOutput();
                        break;
                    case 'F':
                        disableOutput();
                        break;
                    default:
                        break;
                    }
                    break;
                default:
                    break;
                }
            }
        }     
    }
    return 0;
}