AAAAAAAAAAAAAAAAAAA

Dependencies:   mbed FastPWM

main.cpp

Committer:
vanenzo
Date:
2016-02-11
Revision:
6:a24da8bee018
Parent:
5:dcaed6b6b3cb
Child:
7:299b41477dfb

File content as of revision 6:a24da8bee018:

#include "mbed.h"
#include "FastPWM.h"
#define ddsstart    SYNC2 = 1;wait_ms(1);SYNC2 = 0;wait_ms(1)
#define ddsstop SYNC2 = 1;wait_ms(1)
#define ddsreset    DDS.write(0x21C0)
#define sinsoft     DDS.write(0x2000)
#define trisoft     DDS.write(0x2002)
#define tripin      DDS.write(0x2202)
#define ddsoff      DDS.write(0x2048)
#define dacstart    SYNC1 = 1;wait_ms(1);SYNC1 = 0;wait_ms(1)
#define dacstop     SYNC1 = 1;wait_ms(1)

//основные пины 
Serial serial(USBTX,USBRX);
FastPWM mclk(PA_15);
FastPWM sq(PB_7);
SPI DDS(PC_12, NC, PC_10);
SPI DAC(PC_12, NC, PC_10);
DigitalOut SYNC1(PC_11);
DigitalOut SYNC2(PD_2);

// мультиплекс, ЦАП, кнопко

AnalogIn analog_value(PC_4);
DigitalIn button(PA_13); // проверка нажатой кнопки пауза

//пины управления мультиплексорами генератора
DigitalOut outA0(PC_5);
DigitalOut outA1(PC_6);
DigitalOut outA2(PC_8);
DigitalOut outA3(PC_9);

//пины управления мультиплексорами измерительной части
DigitalOut inA0(PA_5);
DigitalOut inA1(PA_6);
DigitalOut inA2(PA_7);
DigitalOut inA3(PB_6);
DigitalOut mux[10] = {(PC_7), (PA_9), (PA_8), (PB_10), (PB_4),(PB_5), (PB_3),(PA_10),(PB_14),(PB_13)}; //пины поясов

int mg;//переменная поясов
int j;//мультиплексор генератора
int k;//мультиплексор измерительной части

int muxout(int j);
int muxin(int k);
int mux_init();
int channel();
int mux_group();
int button_check();

char key[] = "5";
char buffer[2];

// переменные генератор-цап 
int freqdata;
float amp;
int form;
float mdata;
int sinus();
int square();
int triangle();
int adc_read();
int request();
int rasputte();
int adc_read();

int main() {
      while(true) {
        ddsstop;
        dacstop;
        DDS.format(16,2);
        ddsstart; DDS.write(0x21C2); ddsstart; DDS.write(0x20C2);ddsstop; // инициализация dds 
        //  ddsstart; ddsreset; ddsstop;
        
      do {
         fflush (stdout);
         scanf ("%2s",buffer);
      } while (strcmp (key,buffer) != 0);
       fflush (stdout);
       mclk.period_us(0.1);
       mclk.pulsewidth_us(0.05);
       request();
       rasputte();
       mux_group();
       sq=0.0;//выключение прямоугольника после ???
    //ddsstart;
    //ddsoff;
    //ddsstop;
    }
}

    int amplitude () {
        uint16_t ampt;
        uint16_t ampReg;
        ampt = uint16_t(819.2*(5-amp));
        ampReg = uint16_t(ampt & 0xFFF);
        DAC.format(16,1);
        dacstart;
        DAC.write(ampReg*4);
        dacstop;
        return 0;
    }

    int freq () {
        ddsstart;
        float FreqReg;
        uint32_t ftemp;
        uint16_t Uptemp, Lowtemp;
        FreqReg = 26.8435456 * (uint32_t)freqdata*1000;
        ftemp = (uint32_t)FreqReg;
        Lowtemp = (uint16_t)(ftemp & 0x3FFF);
        Uptemp = (uint16_t)((ftemp/16384) & 0x3FFF);
        DDS.write(Lowtemp + 0x4000);ddsstart;
        DDS.write(Uptemp + 0x4000);
        ddsstop;
        return 0;
    }

    int freqsq () {
        float period;
        period = 1000/freqdata;
        sq.period_us(period);
        sq.pulsewidth_us(period/2);
        return 0;
    }

    int sinus() {
        ddsstart;
        sinsoft;
        freq();
        ddsstop;
        amplitude();
        return 0;
    }

    int square() {
        freqsq();
        ddsstart;DDS.write(0x210A);
        ddsstart;DDS.write(0x4000);
        ddsstart;DDS.write(0x4000);
        ddsstart;DDS.write(0x8000);
        ddsstart;DDS.write(0x8000);
        ddsstart;DDS.write(0xCC00);
        ddsstart;DDS.write(0xE400);
        ddsstart;DDS.write(0x220A);
        ddsstop;
        amplitude();
        return 0;
    }

    int triangle() {
        ddsstart;
        trisoft;
        ddsstart;
        freq();
        ddsstop;
        amplitude();
        return 0;
    }
    
    
int adc_read()
{
    float y=0;
    float ymax=0;
    int ar = 0;
    int qr = 200000/freqdata;
    for (ar=0; ar<=qr; ar++) {
        y =  analog_value.read();
        if (ymax < y) {
            ymax = y;
        }
    }
    printf(" %.5g\r\n",ymax*3.3);
    return 0;
}   


int request()
{
    fflush(stdout);
    scanf("%i,%i,%f",&form,&freqdata,&amp);
    printf("%i",8); // спросить Сашу
    fflush(stdout);
    return 0;
}

int rasputte() 
    {
        switch(form) {
            case (1):
                sinus();
                break;
            case (2):
                square();
                break;
            case (3):
                triangle();
                break;
        }
        return 0;
    }

    int muxout(int j)
    {
        switch (j) {
            case (0):{outA0=0; outA1=0; outA2=0; outA3=0;} break;
            case (1):{outA0=1; outA1=0; outA2=0; outA3=0;}  break;
            case (2):{outA0=0; outA1=1; outA2=0; outA3=0;}  break;
            case (3):{outA0=1; outA1=1; outA2=0; outA3=0;}  break;
            case (4):{outA0=0; outA1=0; outA2=1; outA3=0;}  break;
            case (5):{outA0=1; outA1=0; outA2=1; outA3=0;}  break;
            case (6):{outA0=0; outA1=1; outA2=1; outA3=0;}  break;
            case (7):{outA0=1; outA1=1; outA2=1; outA3=0;}  break;
            case (8):{outA0=0; outA1=0; outA2=0; outA3=1;}  break;
            case (9):{outA0=1; outA1=0; outA2=0; outA3=1;}  break;
            case (10):{outA0=0; outA1=1; outA2=0; outA3=1;}  break;
            case (11):{outA0=1; outA1=1; outA2=0; outA3=1;}  break;
            case (12):{outA0=0; outA1=0; outA2=1; outA3=1;}  break;
            case (13):{outA0=1; outA1=0; outA2=1; outA3=1;}  break;
            case (14):{outA0=0; outA1=1; outA2=1; outA3=1;}  break;
            case (15):{outA0=1; outA1=1; outA2=1; outA3=1;}  break;
        }
        return 0;
    }

    int muxin(int k)
    {
        switch(k) {
            case (0):{inA0=0; inA1=0; inA2=0; inA3=0;}  break;
            case (1):{inA0=1; inA1=0; inA2=0; inA3=0;}  break;
            case (2):{inA0=0; inA1=1; inA2=0; inA3=0;}  break;
            case (3):{inA0=1; inA1=1; inA2=0; inA3=0;}  break;
            case (4):{inA0=0; inA1=0; inA2=1; inA3=0;}  break;
            case (5):{inA0=1; inA1=0; inA2=1; inA3=0;}  break;
            case (6):{inA0=0; inA1=1; inA2=1; inA3=0;}  break;
            case (7):{inA0=1; inA1=1; inA2=1; inA3=0;}  break;
            case (8):{inA0=0; inA1=0; inA2=0; inA3=1;}  break;
            case (9):{inA0=1; inA1=0; inA2=0; inA3=1;}  break;
            case (10):{inA0=0; inA1=1; inA2=0; inA3=1;}  break;
            case (11):{inA0=1; inA1=1; inA2=0; inA3=1;}  break;
            case (12):{inA0=0; inA1=0; inA2=1; inA3=1;}  break;
            case (13):{inA0=1; inA1=0; inA2=1; inA3=1;}  break;
            case (14):{inA0=0; inA1=1; inA2=1; inA3=1;}  break;
            case (15):{inA0=1; inA1=1; inA2=1; inA3=1;}  break;
        }
        return 0;
    }

    int channel()
{
    int j = 0;
    int k = 0;
    for (j = 0; j<=15; j++) {
        button_check();
        muxout(j);
        for (k = 0; k<=15; k++) {
            if ((k==j)||(j==(k+1))||(j==(k-1))||((k==0)&&(j==15))||((k==15)&&(j==0))) {
                continue;
            } else {
                muxin(k);
                adc_read();
            }
        }
    }
    return 0;
}


int mux_init()
{
    int mi = 0;
        for (mi = 0; mi < 10; mi++) {
            mux[mi] = 1;
        }
            return 0;

    }

int mux_group()
    {   
        //mux_init();
        for (mg = 0; mg < 10; mg++) {
        if (mg > 0){mux[mg-1] = 1;} //Выключить предыдущий пояс
        mux[mg] = 0;
        channel();
        mux_init();
    }
    return 0;
}

int button_check()
    {
    if (button.read() == 1){
        wait_ms(10);
        if (button.read() == 1){
        int amp1;
        amp1 = amp;
        amp = 0;
        amplitude();
        while (button.read() == 1);
        amp = amp1;
        amplitude();
        }
        }
            return 0;
    }