AAAAAAAAAAAAAAAAAAA

Dependencies:   mbed FastPWM

main.cpp

Committer:
vanenzo
Date:
2017-03-07
Revision:
8:e68460a69e2e
Parent:
7:299b41477dfb
Child:
9:996abe9af847

File content as of revision 8:e68460a69e2e:

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

#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)
#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

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();
int II; int IG; int DI1; int DI2;

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

void swap();
int diff;

int ymax;
void adc_read();
uint16_t y[40];
uint16_t x[40];
int yp;
float yprint[256];

//секция тестирования
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_15CYCLES;
    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);
    while(true) {
        emux_init();
        IE = 0;emux();IG = 0; II = 0;igmux();imux();
        yp=0;
        memset(yprint,0,sizeof yprint);
        ddsstop;dacstop;DDS.format(16,2);
        ddsstart; DDS.write(0x21C2);
        ddsstart; DDS.write(0x20C2);
        ddsstop; // инициализация dds
        four();
        /*ctest();
        if (ct == 1) {continue;}
         else {
            printf("7\r\n");
            five();};*/
        request();
        rasputte();
        mux_group();
        form = 1; freqdata = 1; amp = 0.1;sinus();
        sq=0.0;
       for (yp = 0; yp < 256; yp++) {printf("%.5g\r\n",yprint[yp]);};
       memset(yprint,0,sizeof yprint);
    }

}


void ctest()
{
    ct = 0;
    int mg = 0;
    int mj = 0;
    sign=1; PA=1; preamp();
    form = 1; freqdata = 50; amp = 1;
    sinus();
    for (mg = 0; mg < 10; 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();
            if ((analog_value.read_u16() > 2500) &&(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()
{
    do {
        fflush (stdout);
        scanf ("%2s",buffer);
    } while (strcmp (key4,buffer) != 0);
    fflush (stdout);
 }
 
 void five()
{
    do {
        fflush (stdout);
        scanf ("%2s",buffer);
    } while (strcmp (key5,buffer) != 0);
    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);
    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()
{
    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();
    mclkstart;
}

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

void request()
{
   // printf("forma, chastota\r\n");
    fflush(stdout);
    scanf("%i,%i,%f",&form,&freqdata,&amp);
    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()
{
        for (IE = 0; IE < 1; IE++) {
        emux();
        PA=1; range=1;preamp();
        wait_ms(20);
        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();
        for (k = 0; k<16; k++) {
                DI1 = k; 
                DI1mux(); 
                wait_us(50);
                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 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);
    t.reset();
    t.start();
    adc_readn(x,40);
    t.stop(); 
    printf("1000r useconds %i\r\n", t.read_us());
    sort(x,x + 40);
    ymax = (x[38]);
        if (ymax <= 0) {} 
        else if (((ymax >= 2049)&&(ymax < 2050))) {range=1000;s_ok=1;} 
        else if (((ymax >= 2050)&&(ymax < 2068))) {range=100;s_ok=1;} 
        else if(((ymax >= 2068)&&(ymax < 2248))) {range=10;s_ok=1;} 
        else {range=1;s_ok=1;};
}
PA = range; preamp();
memset(x,0,sizeof x);
}

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

void adc_read()//измерение и вывод со всеми коэффициентами
{
    
    
    adc_init();
    dma_init();
    memset(y,0,sizeof y);
    adc_readn(y,40);
   // for (yp = 0; yp < 400; yp++) {printf("%i\r\n",y[yp]);};
    sort(y,y + 40);
    yprint[yp]=(float)(((y[39]-2048)*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();
        }
    }
}