AAAAAAAAAAAAAAAAAAA

Dependencies:   mbed FastPWM

main.cpp

Committer:
vanenzo
Date:
2017-03-20
Revision:
12:acfe1d7232e3
Parent:
11:f991915d6245
Child:
13:032f94430b0b

File content as of revision 12:acfe1d7232e3:

#include "mbed.h"
#include "FastPWM.h"
#include <algorithm>

#define ddsstart    SYNC2 = 1;wait_us(10);SYNC2 = 0;wait_us(10)
#define ddsstop     SYNC2 = 1;wait_us(10)
#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_us(10);SYNC1 = 0;wait_us(10)
#define dacstop     SYNC1 = 1;wait_us(10)
#define mclkstart   mclk.period_us(0.1);mclk.pulsewidth_us(0.05);
#define mclkstop    mclk = 0.0;

 
//основные пины
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);//amp dac
DigitalOut SYNC2(PD_2);//dds
// мультиплекс, ЦАП, кнопко

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

DigitalOut *P0,*P1,*P2,*P3;//Указатели на пины функции mux

//пины управления мультиплексором выбора пояса
DigitalOut IE0(PB_1);
DigitalOut IE1(PB_15);
DigitalOut IE2(PB_14);
DigitalOut IE3(PB_13);

//пины управления мультиплексорами генератора
DigitalOut II0(PA_0);
DigitalOut II1(PA_1);
DigitalOut II2(PA_4);
DigitalOut II3(PB_0);

//пины управления мультиплексорами земли
DigitalOut IG0(PA_5);
DigitalOut IG1(PA_6);
DigitalOut IG2(PA_7);
DigitalOut IG3(PB_6);

//пины управления мультиплексорами 1 дифф канала 
DigitalOut DI10(PC_7);
DigitalOut DI11(PA_9);
DigitalOut DI12(PA_8);
DigitalOut DI13(PB_10);

//пины управления мультиплексорами 2 дифф канала  
DigitalOut DI20(PB_4);
DigitalOut DI21(PB_5);
DigitalOut DI22(PB_3);
DigitalOut DI23(PA_10);

//пины управления КУ  
DigitalOut AA0(PC_0);
DigitalOut AA1(PC_1);

//отруб ненужных каналов АЦП
BusOut adzero(PC_2,PC_3,PC_5);

//управление мультиплексорами
void mux_group();
int IE;
int j; //inject I
int k; //measure I
int belt;
float yprint[2560];


void mux();//универсальная процедура выбора канала
int P;//канал в mux 

void emux();// выбор пояса
void emux_init();//выключение всех поясов
void imux(); //выбор инжектирующего электрода
void igmux();//выбор земли
void DI1mux();//выбор первого  измерительного электрода
void DI2mux();//выбор второго измерительного электрода

//измерение 
void preamp();
int PA;

//связь с ПК
void five();
void four();
char key4[] = "4";
char key5[] = "5";
char buffer[2];

// переменные генератор-цап
int freqdata;
float amp;
int form;
void freq();
void freqsq();
void sinus();
void square();
void triangle();
void adc_read();
void request();
void rasputte();
void channel();
void amplitude();
int II; int IG; int DI1; int DI2;

void measure();
void ranging();
int sign;
int range;

void fout();

void belt_request();
void swap();
int diff;

int ymax;
void adc_read();
int yp;
int exf;


//секция тестирования
void ctest();
int ct;

static ADC_HandleTypeDef AdcHandle;

void adc_init() {
        // we assume AnalogIn has configureed GPIO, we need ADC channel ?  
        __ADC1_CLK_ENABLE();  // Enable ADC clock
        // Configure ADC
        AdcHandle.Instance = (ADC_TypeDef *)ADC1;
        AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV2;
        AdcHandle.Init.Resolution            = ADC_RESOLUTION12b;
        AdcHandle.Init.ScanConvMode          = DISABLE;
        AdcHandle.Init.ContinuousConvMode    = ENABLE;    // DMA
        AdcHandle.Init.DiscontinuousConvMode = DISABLE;
        AdcHandle.Init.NbrOfDiscConversion   = 0;
        AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
        AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIGCONV_T1_CC1;
        AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
        AdcHandle.Init.NbrOfConversion       = 1;
        AdcHandle.Init.DMAContinuousRequests = ENABLE;    // DMA
        AdcHandle.Init.EOCSelection          = DISABLE;
        HAL_ADC_Init(&AdcHandle);
}

static DMA_HandleTypeDef DMA_Handle;

void dma_init() {
    //  DMA init  ADC1 is DMA2 channel0 stream 0 or 4 use DMA2_Stream0  thd

    __DMA2_CLK_ENABLE();
    DMA_Handle.Instance = DMA2_Stream0;
    DMA_Handle.State = HAL_DMA_STATE_READY;
    HAL_DMA_DeInit(&DMA_Handle);
    DMA_Handle.Init.Channel = DMA_CHANNEL_0;   
    DMA_Handle.Init.Direction = DMA_PERIPH_TO_MEMORY;
    DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE;
    DMA_Handle.Init.MemInc = DMA_MINC_ENABLE;
    DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    DMA_Handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    DMA_Handle.Init.Mode =  DMA_NORMAL;
    DMA_Handle.Init.Priority = DMA_PRIORITY_HIGH;
    DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    DMA_Handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
    DMA_Handle.Init.MemBurst = DMA_MBURST_SINGLE;   
    DMA_Handle.Init.PeriphBurst = DMA_PBURST_SINGLE;
    HAL_DMA_Init(&DMA_Handle);

    __HAL_LINKDMA(&AdcHandle, DMA_Handle, DMA_Handle);
}

void adc_readn( uint16_t * data, uint32_t nelems) {
    ADC_ChannelConfTypeDef sConfig;
    sConfig.Channel = ADC_CHANNEL_14;  // PC_4
    sConfig.Rank = 1;
    sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
    sConfig.Offset = 0;
    HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
    HAL_ADC_Start_DMA(&AdcHandle, (uint32_t *)data, nelems);
    while (DMA_Handle.Instance->CR & DMA_SxCR_EN);   // spin
    HAL_ADC_Stop(&AdcHandle);
}

void button_check();

Timer t;

int main()
{
    adzero = 0;
    serial.baud(256000);
        ddsstop;dacstop;
        DDS.frequency(400000);DDS.format(16,2);
        ddsstart; DDS.write(0x21C2);
        ddsstart; DDS.write(0x20C2);
        ddsstop; // инициализация dds
        mclkstart
        wait_ms(1);
        //printf("10000000000000000\r\n");
    while(true) {
        emux_init();
        IE = 0;emux();IG = 0; II = 0;igmux();imux();
        memset(yprint,0,sizeof yprint);
        exf = 0;
        belt_request();       
        ctest();
        if (ct == 1) {continue;}
        else {wait_us(10); printf("7\r\n"); fflush (stdout); wait_us(100);};
        request();
        while(true){
        t.reset();
        t.start();
        rasputte();
        mux_group();
        t.stop(); 
        //fout();
        //////////////////////////
        for (yp = 0; yp < (256*belt); yp++) {printf("%.4f\r\n",yprint[yp]);};
        /////////////////////////
   // printf("1000r useconds %i\r\n", t.read_ms());
          wait_us(1);
          four();
          if (exf == 1){break;}
        }
         amp = 0.1;amplitude();sq=0.0;
          ddsoff;  
    }
}

void belt_request()
{
    fflush(stdout);
    fflush(stdin);
    scanf("%i",&belt);
    fflush(stdin);
    fflush(stdout);
    }

void fout()
{
    //printf("%.1g,%i\r\n", ampd[ampc], freqdata);
    printf("# name: data\r\n");
    printf("# type: scalar struct\r\n");
    printf("# ndims: 2\r\n");
    printf(" 1 1\r\n");
    printf("# length: 4\r\n");
    printf("# name: description\r\n");
    printf("# type: sq_string\r\n");
    printf("# elements: 1\r\n");
    printf("# length:  20\r\n");
    if (form == 1){printf("# sin %03i kHz %1.01f mA\r\n",freqdata,amp);}
    else if (form == 2){printf("# sqr %03i kHz %1.01f mA\r\n",freqdata,amp);}
    else {printf("# tri %03i kHz %1.01f mA\r\n",freqdata,amp);};
    printf("\r\n");
    printf("\r\n");
    printf("# name: meas_volts\r\n");
    printf("# type: matrix\r\n");
    printf("# rows: 256\r\n");
    printf("# columns: 1\r\n");
    for (yp = 0; yp < 256*belt; yp++) {printf("%.4g\r\n",yprint[yp]);};
    memset(yprint,0,sizeof yprint);
    printf("\r\n");
    printf("# name: time\r\n");
    printf("# type: scalar\r\n");
    printf("    %04i ms\r\n",t.read_ms());
    printf("\r\n");
    printf("# name: n_elec\r\n");
    printf("# type: scalar\r\n");
    printf(" 16\r\n");
    
}

void ctest()
{
    ct = 0;
    int mg = 0;
    int mj = 0;
    int aread=0;
    sign=1; PA=1; preamp();
    form = 1; freqdata = 50; amp = 5;
    sinus();
    for (mg = 0; mg < belt; mg++) {
        IE = mg; emux();
        for (mj = 0; mj < 15; mj+=2) {
            II = mj; IG = mj+1; DI1 = mj; DI2 = mj+1;
            igmux(); imux(); DI1mux(); DI2mux();
            int xa = (int)5000/freqdata;
            int xaa = (int)xa/10;
            uint16_t x[xa];
            adc_init();
            dma_init();
            memset(x,0,sizeof x);
            adc_readn(x,xa);
            sort(x+xaa,x + xa);
            aread = (int)x[xa-1];
            if ((aread > 2400) &&(test_button.read() == 1))
            {printf("%i,%i\r\n",mg+1, mj+1); printf("%i,%i\r\n",mg+1, mj+2);ct = 1;}
        }
    
    }
    mclkstop;
     }


void four()
{
      //printf("\r");
        fflush (stdout);
        fflush (stdin);
        scanf ("%2s",buffer);
        fflush (stdout);
        if (strcmp (key4,buffer) == 0){exf = 1;}
         }
 
 void five()
{
    do {
        fflush (stdout);
        scanf ("%2s",buffer);
    } while (strcmp (key5,buffer) != 0);
        wait_us(10);
       fflush (stdout);
}

void amplitude()
{
    uint16_t ampt;
    uint16_t ampReg;
    ampt = uint16_t(819.2*(5.0-amp));
    ampReg = uint16_t(ampt & 0xFFF);
    DAC.format(16,1);DAC.frequency(400000);
    dacstart;
    DAC.write(ampReg*4);
    dacstop;
    }

void 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;
}

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

void sinus()
{
    ddsstart;
    sinsoft;
    freq();
    ddsstop;
    amplitude();
    mclkstart;
    }

void square()
{
    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();
    mclkstart;
    freqsq();
}

void triangle()
{
    ddsstart;
    trisoft;
    ddsstart;
    freq();
    ddsstop;
    amplitude();
    mclkstart;
}

void request()
{
   // printf("forma, chastota\r\n");
    fflush(stdout);
    fflush(stdin);
    scanf("%i,%i,%i,%f",&belt,&form,&freqdata,&amp);
    fflush(stdin);
    fflush(stdout);
    }
    
    

void rasputte()
{
    switch(form) {
        case (1):
            sinus();
            break;
        case (2):
            square();
            break;
        case (3):
            triangle();
            break;
    }
    }
    
void emux_init()
{
   P = 15; P0=&IE0; P1=&IE1; P2=&IE2; P3=&IE3; 
   mux();
}

void emux()
{
   P = IE; P0=&IE0; P1=&IE1; P2=&IE2; P3=&IE3; 
   mux();
}

void imux()
{
   P = II; P0=&II0; P1=&II1; P2=&II2; P3=&II3; 
   mux();
}

void igmux()
{
   P = IG; P0=&IG0; P1=&IG1; P2=&IG2; P3=&IG3; 
   mux();
}

void DI1mux()
{
   P = DI1; P0=&DI10; P1=&DI11; P2=&DI12; P3=&DI13; 
   mux();
}

void DI2mux()
{
   P = DI2; P0=&DI20; P1=&DI21; P2=&DI22; P3=&DI23; 
   mux();
}


void mux()
{
    switch (P) {
        case (0):  {*P0=0; *P1=0; *P2=0; *P3=0;} break;
        case (1):  {*P0=1; *P1=0; *P2=0; *P3=0;} break;
        case (2):  {*P0=0; *P1=1; *P2=0; *P3=0;} break;
        case (3):  {*P0=1; *P1=1; *P2=0; *P3=0;} break;
        case (4):  {*P0=0; *P1=0; *P2=1; *P3=0;} break;
        case (5):  {*P0=1; *P1=0; *P2=1; *P3=0;} break;
        case (6):  {*P0=0; *P1=1; *P2=1; *P3=0;} break;
        case (7):  {*P0=1; *P1=1; *P2=1; *P3=0;} break;
        case (8):  {*P0=0; *P1=0; *P2=0; *P3=1;} break;
        case (9):  {*P0=1; *P1=0; *P2=0; *P3=1;} break;
        case (10): {*P0=0; *P1=1; *P2=0; *P3=1;} break;
        case (11): {*P0=1; *P1=1; *P2=0; *P3=1;} break;
        case (12): {*P0=0; *P1=0; *P2=1; *P3=1;} break;
        case (13): {*P0=1; *P1=0; *P2=1; *P3=1;} break;
        case (14): {*P0=0; *P1=1; *P2=1; *P3=1;} break;
        case (15): {*P0=1; *P1=1; *P2=1; *P3=1;} break;
    }
}

void preamp()
{
    switch (PA)
    {
        case(1):    {AA0=0;AA1=0;} break;
        case(10):   {AA0=0;AA1=1;} break;
        case(100):  {AA0=1;AA1=0;} break;
        case(1000): {AA0=1;AA1=1;} break;
    }
}


void mux_group()
{
        yp=0;
        for (IE = 0; IE < belt; IE++) {
        emux();
        //wait_ms(20);
        PA=1; range=1;preamp();
        channel();
    }
    //mclkstop;
}

void channel()
{
    j = 0;//inject
    k = 0;//measure
   for (j = 0; j<16; j++) {
        //button_check();
        if (j==15) {IG = j; II = 0;} else {IG = j; II = j+1;}
        DI2=j;igmux(); imux();DI2mux();
       if ((j==0)&&(IE==0)){wait_ms(1);}
        for (k = 0; k<16; k++) {
                DI1 = k; 
                DI1mux(); 
                wait_us(100);
                measure();
              //  printf("\r\n");
             }
        }
        
    /*    for (j = 0; j<16; j++) {
        //button_check();
        if (j==15) {IG = j; II = 0;} else {IG = j; II = j+1;}
        DI1 = II;igmux(); imux();DI1mux();
        
               wait_ms(2);
               
                measure();}*/
   /*     while(1){
 printf("%s\r\n", "vvod II inJect ");
    fflush(stdout);    
    scanf("%i",&II);//инжект
    printf("%s\r\n", "vvod IG inJect ");
    fflush(stdout);    
    scanf("%i",&IG);//инжектIG
    igmux(); imux();
        //button_check();
    printf("%s\r\n", "vvod DI1");
    fflush(stdout);    
    scanf("%i",&DI1);//инжект
    DI1mux(); measure();}*/
        
    }


void measure()
{
    ranging();
    adc_read();
}

void ranging()//определение коэффициента усиления и знака
{
    int xa = (int)10000/freqdata;
    if (xa < 100){xa=100;}
    else if (xa > 1000){xa=1000;};
    int xaa = (int)xa/5;
    uint16_t x[xa];
    int s_ok=0;
    //IG = 0; II = 1;DI1 = II;DI2=IG;igmux();imux();DI1mux();DI2mux();wait_ms(10);
    PA=1; preamp();
    //while(s_ok==0){
    adc_init();
    dma_init();
    memset(x,0,sizeof x);
    adc_readn(x,xa);
    //printf("non_sorted\r\n");
    //for (s_ok = 0; s_ok < xa; s_ok++) {printf("%i\r\n",x[s_ok]);};
    sort(x+xaa,x + xa);
     //printf("sorted\r\n");
    //for (s_ok = 0; s_ok < xa; s_ok++) {printf("%i\r\n",x[s_ok]);};
    ymax = (int)((x[xa-1]+x[xa-2]+x[xa-3])-(x[xaa]+x[xaa+1]+x[xaa+2]))/3;
        if (ymax <= 4) {range=1000;s_ok=1;wait_us(50);} 
        else if (((ymax > 4)&&(ymax <= 35))) {range=100;s_ok=1;wait_us(50);} 
        else if (((ymax > 35)&&(ymax <= 350))) {range=10;s_ok=1;wait_us(50);} 
        else if (ymax > 350) {range=1;s_ok=1;wait_us(50);};
//}
    PA = range; preamp();
    //printf("%i,%i,%i,%i\r\n",ymax,x[xa-(xaa+1)], x[0], range);
memset(x,0,sizeof x);
}

void swap()
{
    int diff = DI1;
    DI1 = DI2;
    DI2 = diff;
    DI1mux();
    DI2mux();   
}

void adc_read()//измерение и вывод со всеми коэффициентами
{
    int ya = (int)10000/freqdata;
    float ym = 0;
    if (ya < 100){ya=100;}
    else if (ya > 1000){ya=1000;};
    int yaa = (int)ya/10;
    uint16_t y[ya];
    adc_init();
    dma_init();
    memset(y,0,sizeof y);
    adc_readn(y,ya);
   // for (yp = 0; yp < 400; yp++) {printf("%i\r\n",y[yp]);};
    sort(y+yaa,y + ya);
    ym = ((y[ya-2]+y[ya-3]+y[ya-4]+y[ya-5]+y[ya-6])-(y[yaa+1]+y[yaa+2]+y[yaa+3]+y[yaa+4]+y[yaa+5]))/10;
    yprint[yp]=(((ym)*3.3*10)/(4096*range));yp++;
    memset(y,0,sizeof y);

}


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