Ivan Scherbakov
/
last_2_1_0_interchange_208_byte
AAAAAAAAAAAAAAAAAAA
Diff: main.cpp
- Revision:
- 8:e68460a69e2e
- Parent:
- 7:299b41477dfb
- Child:
- 9:996abe9af847
--- a/main.cpp Thu Feb 11 04:12:40 2016 +0000 +++ b/main.cpp Tue Mar 07 11:24:55 2017 +0000 @@ -1,5 +1,7 @@ #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) @@ -9,304 +11,544 @@ #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); -DigitalOut SYNC2(PD_2); - +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 outA0(PC_5); -DigitalOut outA1(PC_6); -DigitalOut outA2(PC_8); -DigitalOut outA3(PC_9); +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); -//пины управления мультиплексорами измерительной части -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)}; //пины поясов +//пины управления мультиплексорами 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); -int mg;//переменная поясов -int j;//мультиплексор генератора -int k;//мультиплексор измерительной части -float mdata[2080]; -int md; -int p; +//отруб ненужных каналов АЦП +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 -int muxout(int j); -int muxin(int k); -int mux_init(); -int channel(); -int mux_group(); -int button_check(); +void emux();// выбор пояса +void emux_init();//выключение всех поясов +void imux(); //выбор инжектирующего электрода +void igmux();//выбор земли +void DI1mux();//выбор первого измерительного электрода +void DI2mux();//выбор второго измерительного электрода -char key[] = "5"; +//измерение +void preamp(); +int PA; + +//связь с ПК +void five(); +void four(); +char key4[] = "4"; +char key5[] = "5"; char buffer[2]; -// переменные генератор-цап +// переменные генератор-цап int freqdata; float amp; int form; -int sinus(); -int square(); -int triangle(); -int adc_read(); -int request(); -int rasputte(); -int adc_read(); +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; +} + -int main() { - while(true) { - md=0; - 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;//выключение прямоугольника после ??? - for (p=0; p<=md; p++){printf(" %.5g\r\n",mdata[p]);} - //ddsstart; - //ddsoff; - //ddsstop; +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,&); + 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; } } - 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() +void preamp() { - 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; - } + 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; } - mdata[md] = ymax*3.3; - md++; - return 0; -} - - -int request() -{ - fflush(stdout); - scanf("%i,%i,%f",&form,&freqdata,&); - 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() +void mux_group() +{ + for (IE = 0; IE < 1; IE++) { + emux(); + PA=1; range=1;preamp(); + wait_ms(20); + channel(); + } + mclkstop; +} + +void channel() { - int mi = 0; - for (mi = 0; mi < 10; mi++) { - mux[mi] = 1; + 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"); + } } - return 0; - + + /* 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();}*/ + } -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; + +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); } -int button_check() - { - if (button.read() == 1){ +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; - amplitude(); - while (button.read() == 1); - amp = amp1; - amplitude(); + if (button.read() == 1) { + int amp1; + amp1 = amp; + amp = 0.1; + amplitude(); + while (button.read() == 1); + amp = amp1; + amplitude(); } - } - return 0; } +} \ No newline at end of file