Ivan Scherbakov
/
last_2_1_0_interchange_208_byte
AAAAAAAAAAAAAAAAAAA
main.cpp@8:e68460a69e2e, 2017-03-07 (annotated)
- Committer:
- vanenzo
- Date:
- Tue Mar 07 11:24:55 2017 +0000
- Revision:
- 8:e68460a69e2e
- Parent:
- 7:299b41477dfb
- Child:
- 9:996abe9af847
no dynamic arrays
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vanenzo | 0:957268dd05c4 | 1 | #include "mbed.h" |
vanenzo | 0:957268dd05c4 | 2 | #include "FastPWM.h" |
vanenzo | 8:e68460a69e2e | 3 | #include <algorithm> |
vanenzo | 8:e68460a69e2e | 4 | |
vanenzo | 0:957268dd05c4 | 5 | #define ddsstart SYNC2 = 1;wait_ms(1);SYNC2 = 0;wait_ms(1) |
vanenzo | 0:957268dd05c4 | 6 | #define ddsstop SYNC2 = 1;wait_ms(1) |
vanenzo | 0:957268dd05c4 | 7 | #define ddsreset DDS.write(0x21C0) |
vanenzo | 0:957268dd05c4 | 8 | #define sinsoft DDS.write(0x2000) |
vanenzo | 0:957268dd05c4 | 9 | #define trisoft DDS.write(0x2002) |
vanenzo | 0:957268dd05c4 | 10 | #define tripin DDS.write(0x2202) |
vanenzo | 0:957268dd05c4 | 11 | #define ddsoff DDS.write(0x2048) |
vanenzo | 0:957268dd05c4 | 12 | #define dacstart SYNC1 = 1;wait_ms(1);SYNC1 = 0;wait_ms(1) |
vanenzo | 0:957268dd05c4 | 13 | #define dacstop SYNC1 = 1;wait_ms(1) |
vanenzo | 8:e68460a69e2e | 14 | #define mclkstart mclk.period_us(0.1);mclk.pulsewidth_us(0.05); |
vanenzo | 8:e68460a69e2e | 15 | #define mclkstop mclk = 0.0; |
vanenzo | 0:957268dd05c4 | 16 | |
vanenzo | 8:e68460a69e2e | 17 | |
vanenzo | 8:e68460a69e2e | 18 | //основные пины |
vanenzo | 0:957268dd05c4 | 19 | Serial serial(USBTX,USBRX); |
vanenzo | 0:957268dd05c4 | 20 | FastPWM mclk(PA_15); |
vanenzo | 0:957268dd05c4 | 21 | FastPWM sq(PB_7); |
vanenzo | 2:b489f23d9d2c | 22 | SPI DDS(PC_12, NC, PC_10); |
vanenzo | 0:957268dd05c4 | 23 | SPI DAC(PC_12, NC, PC_10); |
vanenzo | 8:e68460a69e2e | 24 | DigitalOut SYNC1(PC_11);//amp dac |
vanenzo | 8:e68460a69e2e | 25 | DigitalOut SYNC2(PD_2);//dds |
vanenzo | 5:dcaed6b6b3cb | 26 | // мультиплекс, ЦАП, кнопко |
vanenzo | 5:dcaed6b6b3cb | 27 | |
vanenzo | 5:dcaed6b6b3cb | 28 | AnalogIn analog_value(PC_4); |
vanenzo | 5:dcaed6b6b3cb | 29 | DigitalIn button(PA_13); // проверка нажатой кнопки пауза |
vanenzo | 8:e68460a69e2e | 30 | DigitalIn test_button(USER_BUTTON); |
vanenzo | 8:e68460a69e2e | 31 | |
vanenzo | 8:e68460a69e2e | 32 | DigitalOut *P0,*P1,*P2,*P3;//Указатели на пины функции mux |
vanenzo | 8:e68460a69e2e | 33 | |
vanenzo | 8:e68460a69e2e | 34 | //пины управления мультиплексором выбора пояса |
vanenzo | 8:e68460a69e2e | 35 | DigitalOut IE0(PB_1); |
vanenzo | 8:e68460a69e2e | 36 | DigitalOut IE1(PB_15); |
vanenzo | 8:e68460a69e2e | 37 | DigitalOut IE2(PB_14); |
vanenzo | 8:e68460a69e2e | 38 | DigitalOut IE3(PB_13); |
vanenzo | 5:dcaed6b6b3cb | 39 | |
vanenzo | 5:dcaed6b6b3cb | 40 | //пины управления мультиплексорами генератора |
vanenzo | 8:e68460a69e2e | 41 | DigitalOut II0(PA_0); |
vanenzo | 8:e68460a69e2e | 42 | DigitalOut II1(PA_1); |
vanenzo | 8:e68460a69e2e | 43 | DigitalOut II2(PA_4); |
vanenzo | 8:e68460a69e2e | 44 | DigitalOut II3(PB_0); |
vanenzo | 8:e68460a69e2e | 45 | |
vanenzo | 8:e68460a69e2e | 46 | //пины управления мультиплексорами земли |
vanenzo | 8:e68460a69e2e | 47 | DigitalOut IG0(PA_5); |
vanenzo | 8:e68460a69e2e | 48 | DigitalOut IG1(PA_6); |
vanenzo | 8:e68460a69e2e | 49 | DigitalOut IG2(PA_7); |
vanenzo | 8:e68460a69e2e | 50 | DigitalOut IG3(PB_6); |
vanenzo | 5:dcaed6b6b3cb | 51 | |
vanenzo | 8:e68460a69e2e | 52 | //пины управления мультиплексорами 1 дифф канала |
vanenzo | 8:e68460a69e2e | 53 | DigitalOut DI10(PC_7); |
vanenzo | 8:e68460a69e2e | 54 | DigitalOut DI11(PA_9); |
vanenzo | 8:e68460a69e2e | 55 | DigitalOut DI12(PA_8); |
vanenzo | 8:e68460a69e2e | 56 | DigitalOut DI13(PB_10); |
vanenzo | 8:e68460a69e2e | 57 | |
vanenzo | 8:e68460a69e2e | 58 | //пины управления мультиплексорами 2 дифф канала |
vanenzo | 8:e68460a69e2e | 59 | DigitalOut DI20(PB_4); |
vanenzo | 8:e68460a69e2e | 60 | DigitalOut DI21(PB_5); |
vanenzo | 8:e68460a69e2e | 61 | DigitalOut DI22(PB_3); |
vanenzo | 8:e68460a69e2e | 62 | DigitalOut DI23(PA_10); |
vanenzo | 8:e68460a69e2e | 63 | |
vanenzo | 8:e68460a69e2e | 64 | //пины управления КУ |
vanenzo | 8:e68460a69e2e | 65 | DigitalOut AA0(PC_0); |
vanenzo | 8:e68460a69e2e | 66 | DigitalOut AA1(PC_1); |
vanenzo | 5:dcaed6b6b3cb | 67 | |
vanenzo | 8:e68460a69e2e | 68 | //отруб ненужных каналов АЦП |
vanenzo | 8:e68460a69e2e | 69 | BusOut adzero(PC_2,PC_3,PC_5); |
vanenzo | 8:e68460a69e2e | 70 | |
vanenzo | 8:e68460a69e2e | 71 | //управление мультиплексорами |
vanenzo | 8:e68460a69e2e | 72 | void mux_group(); |
vanenzo | 8:e68460a69e2e | 73 | int IE; |
vanenzo | 8:e68460a69e2e | 74 | int j; //inject I |
vanenzo | 8:e68460a69e2e | 75 | int k; //measure I |
vanenzo | 8:e68460a69e2e | 76 | |
vanenzo | 8:e68460a69e2e | 77 | void mux();//универсальная процедура выбора канала |
vanenzo | 8:e68460a69e2e | 78 | int P;//канал в mux |
vanenzo | 5:dcaed6b6b3cb | 79 | |
vanenzo | 8:e68460a69e2e | 80 | void emux();// выбор пояса |
vanenzo | 8:e68460a69e2e | 81 | void emux_init();//выключение всех поясов |
vanenzo | 8:e68460a69e2e | 82 | void imux(); //выбор инжектирующего электрода |
vanenzo | 8:e68460a69e2e | 83 | void igmux();//выбор земли |
vanenzo | 8:e68460a69e2e | 84 | void DI1mux();//выбор первого измерительного электрода |
vanenzo | 8:e68460a69e2e | 85 | void DI2mux();//выбор второго измерительного электрода |
vanenzo | 0:957268dd05c4 | 86 | |
vanenzo | 8:e68460a69e2e | 87 | //измерение |
vanenzo | 8:e68460a69e2e | 88 | void preamp(); |
vanenzo | 8:e68460a69e2e | 89 | int PA; |
vanenzo | 8:e68460a69e2e | 90 | |
vanenzo | 8:e68460a69e2e | 91 | //связь с ПК |
vanenzo | 8:e68460a69e2e | 92 | void five(); |
vanenzo | 8:e68460a69e2e | 93 | void four(); |
vanenzo | 8:e68460a69e2e | 94 | char key4[] = "4"; |
vanenzo | 8:e68460a69e2e | 95 | char key5[] = "5"; |
vanenzo | 4:2a0242bfbe0c | 96 | char buffer[2]; |
vanenzo | 4:2a0242bfbe0c | 97 | |
vanenzo | 8:e68460a69e2e | 98 | // переменные генератор-цап |
vanenzo | 0:957268dd05c4 | 99 | int freqdata; |
vanenzo | 0:957268dd05c4 | 100 | float amp; |
vanenzo | 0:957268dd05c4 | 101 | int form; |
vanenzo | 8:e68460a69e2e | 102 | void freq(); |
vanenzo | 8:e68460a69e2e | 103 | void freqsq(); |
vanenzo | 8:e68460a69e2e | 104 | void sinus(); |
vanenzo | 8:e68460a69e2e | 105 | void square(); |
vanenzo | 8:e68460a69e2e | 106 | void triangle(); |
vanenzo | 8:e68460a69e2e | 107 | void adc_read(); |
vanenzo | 8:e68460a69e2e | 108 | void request(); |
vanenzo | 8:e68460a69e2e | 109 | void rasputte(); |
vanenzo | 8:e68460a69e2e | 110 | void channel(); |
vanenzo | 8:e68460a69e2e | 111 | int II; int IG; int DI1; int DI2; |
vanenzo | 8:e68460a69e2e | 112 | |
vanenzo | 8:e68460a69e2e | 113 | void measure(); |
vanenzo | 8:e68460a69e2e | 114 | void ranging(); |
vanenzo | 8:e68460a69e2e | 115 | int sign; |
vanenzo | 8:e68460a69e2e | 116 | int range; |
vanenzo | 8:e68460a69e2e | 117 | |
vanenzo | 8:e68460a69e2e | 118 | void swap(); |
vanenzo | 8:e68460a69e2e | 119 | int diff; |
vanenzo | 8:e68460a69e2e | 120 | |
vanenzo | 8:e68460a69e2e | 121 | int ymax; |
vanenzo | 8:e68460a69e2e | 122 | void adc_read(); |
vanenzo | 8:e68460a69e2e | 123 | uint16_t y[40]; |
vanenzo | 8:e68460a69e2e | 124 | uint16_t x[40]; |
vanenzo | 8:e68460a69e2e | 125 | int yp; |
vanenzo | 8:e68460a69e2e | 126 | float yprint[256]; |
vanenzo | 8:e68460a69e2e | 127 | |
vanenzo | 8:e68460a69e2e | 128 | //секция тестирования |
vanenzo | 8:e68460a69e2e | 129 | void ctest(); |
vanenzo | 8:e68460a69e2e | 130 | int ct; |
vanenzo | 8:e68460a69e2e | 131 | |
vanenzo | 8:e68460a69e2e | 132 | static ADC_HandleTypeDef AdcHandle; |
vanenzo | 8:e68460a69e2e | 133 | |
vanenzo | 8:e68460a69e2e | 134 | void adc_init() { |
vanenzo | 8:e68460a69e2e | 135 | // we assume AnalogIn has configureed GPIO, we need ADC channel ? |
vanenzo | 8:e68460a69e2e | 136 | __ADC1_CLK_ENABLE(); // Enable ADC clock |
vanenzo | 8:e68460a69e2e | 137 | // Configure ADC |
vanenzo | 8:e68460a69e2e | 138 | AdcHandle.Instance = (ADC_TypeDef *)ADC1; |
vanenzo | 8:e68460a69e2e | 139 | AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2; |
vanenzo | 8:e68460a69e2e | 140 | AdcHandle.Init.Resolution = ADC_RESOLUTION12b; |
vanenzo | 8:e68460a69e2e | 141 | AdcHandle.Init.ScanConvMode = DISABLE; |
vanenzo | 8:e68460a69e2e | 142 | AdcHandle.Init.ContinuousConvMode = ENABLE; // DMA |
vanenzo | 8:e68460a69e2e | 143 | AdcHandle.Init.DiscontinuousConvMode = DISABLE; |
vanenzo | 8:e68460a69e2e | 144 | AdcHandle.Init.NbrOfDiscConversion = 0; |
vanenzo | 8:e68460a69e2e | 145 | AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; |
vanenzo | 8:e68460a69e2e | 146 | AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; |
vanenzo | 8:e68460a69e2e | 147 | AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; |
vanenzo | 8:e68460a69e2e | 148 | AdcHandle.Init.NbrOfConversion = 1; |
vanenzo | 8:e68460a69e2e | 149 | AdcHandle.Init.DMAContinuousRequests = ENABLE; // DMA |
vanenzo | 8:e68460a69e2e | 150 | AdcHandle.Init.EOCSelection = DISABLE; |
vanenzo | 8:e68460a69e2e | 151 | HAL_ADC_Init(&AdcHandle); |
vanenzo | 8:e68460a69e2e | 152 | } |
vanenzo | 8:e68460a69e2e | 153 | |
vanenzo | 8:e68460a69e2e | 154 | static DMA_HandleTypeDef DMA_Handle; |
vanenzo | 8:e68460a69e2e | 155 | |
vanenzo | 8:e68460a69e2e | 156 | void dma_init() { |
vanenzo | 8:e68460a69e2e | 157 | // DMA init ADC1 is DMA2 channel0 stream 0 or 4 use DMA2_Stream0 thd |
vanenzo | 8:e68460a69e2e | 158 | |
vanenzo | 8:e68460a69e2e | 159 | __DMA2_CLK_ENABLE(); |
vanenzo | 8:e68460a69e2e | 160 | DMA_Handle.Instance = DMA2_Stream0; |
vanenzo | 8:e68460a69e2e | 161 | DMA_Handle.State = HAL_DMA_STATE_READY; |
vanenzo | 8:e68460a69e2e | 162 | HAL_DMA_DeInit(&DMA_Handle); |
vanenzo | 8:e68460a69e2e | 163 | DMA_Handle.Init.Channel = DMA_CHANNEL_0; |
vanenzo | 8:e68460a69e2e | 164 | DMA_Handle.Init.Direction = DMA_PERIPH_TO_MEMORY; |
vanenzo | 8:e68460a69e2e | 165 | DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE; |
vanenzo | 8:e68460a69e2e | 166 | DMA_Handle.Init.MemInc = DMA_MINC_ENABLE; |
vanenzo | 8:e68460a69e2e | 167 | DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; |
vanenzo | 8:e68460a69e2e | 168 | DMA_Handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; |
vanenzo | 8:e68460a69e2e | 169 | DMA_Handle.Init.Mode = DMA_NORMAL; |
vanenzo | 8:e68460a69e2e | 170 | DMA_Handle.Init.Priority = DMA_PRIORITY_HIGH; |
vanenzo | 8:e68460a69e2e | 171 | DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; |
vanenzo | 8:e68460a69e2e | 172 | DMA_Handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL; |
vanenzo | 8:e68460a69e2e | 173 | DMA_Handle.Init.MemBurst = DMA_MBURST_SINGLE; |
vanenzo | 8:e68460a69e2e | 174 | DMA_Handle.Init.PeriphBurst = DMA_PBURST_SINGLE; |
vanenzo | 8:e68460a69e2e | 175 | HAL_DMA_Init(&DMA_Handle); |
vanenzo | 8:e68460a69e2e | 176 | |
vanenzo | 8:e68460a69e2e | 177 | __HAL_LINKDMA(&AdcHandle, DMA_Handle, DMA_Handle); |
vanenzo | 8:e68460a69e2e | 178 | } |
vanenzo | 8:e68460a69e2e | 179 | |
vanenzo | 8:e68460a69e2e | 180 | void adc_readn( uint16_t * data, uint32_t nelems) { |
vanenzo | 8:e68460a69e2e | 181 | ADC_ChannelConfTypeDef sConfig; |
vanenzo | 8:e68460a69e2e | 182 | sConfig.Channel = ADC_CHANNEL_14; // PC_4 |
vanenzo | 8:e68460a69e2e | 183 | sConfig.Rank = 1; |
vanenzo | 8:e68460a69e2e | 184 | sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES; |
vanenzo | 8:e68460a69e2e | 185 | sConfig.Offset = 0; |
vanenzo | 8:e68460a69e2e | 186 | HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); |
vanenzo | 8:e68460a69e2e | 187 | HAL_ADC_Start_DMA(&AdcHandle, (uint32_t *)data, nelems); |
vanenzo | 8:e68460a69e2e | 188 | while (DMA_Handle.Instance->CR & DMA_SxCR_EN); // spin |
vanenzo | 8:e68460a69e2e | 189 | HAL_ADC_Stop(&AdcHandle); |
vanenzo | 8:e68460a69e2e | 190 | } |
vanenzo | 8:e68460a69e2e | 191 | |
vanenzo | 8:e68460a69e2e | 192 | void button_check(); |
vanenzo | 8:e68460a69e2e | 193 | |
vanenzo | 8:e68460a69e2e | 194 | Timer t; |
vanenzo | 8:e68460a69e2e | 195 | |
vanenzo | 8:e68460a69e2e | 196 | int main() |
vanenzo | 8:e68460a69e2e | 197 | { |
vanenzo | 8:e68460a69e2e | 198 | adzero = 0; |
vanenzo | 8:e68460a69e2e | 199 | serial.baud(256000); |
vanenzo | 8:e68460a69e2e | 200 | while(true) { |
vanenzo | 8:e68460a69e2e | 201 | emux_init(); |
vanenzo | 8:e68460a69e2e | 202 | IE = 0;emux();IG = 0; II = 0;igmux();imux(); |
vanenzo | 8:e68460a69e2e | 203 | yp=0; |
vanenzo | 8:e68460a69e2e | 204 | memset(yprint,0,sizeof yprint); |
vanenzo | 8:e68460a69e2e | 205 | ddsstop;dacstop;DDS.format(16,2); |
vanenzo | 8:e68460a69e2e | 206 | ddsstart; DDS.write(0x21C2); |
vanenzo | 8:e68460a69e2e | 207 | ddsstart; DDS.write(0x20C2); |
vanenzo | 8:e68460a69e2e | 208 | ddsstop; // инициализация dds |
vanenzo | 8:e68460a69e2e | 209 | four(); |
vanenzo | 8:e68460a69e2e | 210 | /*ctest(); |
vanenzo | 8:e68460a69e2e | 211 | if (ct == 1) {continue;} |
vanenzo | 8:e68460a69e2e | 212 | else { |
vanenzo | 8:e68460a69e2e | 213 | printf("7\r\n"); |
vanenzo | 8:e68460a69e2e | 214 | five();};*/ |
vanenzo | 8:e68460a69e2e | 215 | request(); |
vanenzo | 8:e68460a69e2e | 216 | rasputte(); |
vanenzo | 8:e68460a69e2e | 217 | mux_group(); |
vanenzo | 8:e68460a69e2e | 218 | form = 1; freqdata = 1; amp = 0.1;sinus(); |
vanenzo | 8:e68460a69e2e | 219 | sq=0.0; |
vanenzo | 8:e68460a69e2e | 220 | for (yp = 0; yp < 256; yp++) {printf("%.5g\r\n",yprint[yp]);}; |
vanenzo | 8:e68460a69e2e | 221 | memset(yprint,0,sizeof yprint); |
vanenzo | 8:e68460a69e2e | 222 | } |
vanenzo | 8:e68460a69e2e | 223 | |
vanenzo | 8:e68460a69e2e | 224 | } |
vanenzo | 8:e68460a69e2e | 225 | |
vanenzo | 8:e68460a69e2e | 226 | |
vanenzo | 8:e68460a69e2e | 227 | void ctest() |
vanenzo | 8:e68460a69e2e | 228 | { |
vanenzo | 8:e68460a69e2e | 229 | ct = 0; |
vanenzo | 8:e68460a69e2e | 230 | int mg = 0; |
vanenzo | 8:e68460a69e2e | 231 | int mj = 0; |
vanenzo | 8:e68460a69e2e | 232 | sign=1; PA=1; preamp(); |
vanenzo | 8:e68460a69e2e | 233 | form = 1; freqdata = 50; amp = 1; |
vanenzo | 8:e68460a69e2e | 234 | sinus(); |
vanenzo | 8:e68460a69e2e | 235 | for (mg = 0; mg < 10; mg++) { |
vanenzo | 8:e68460a69e2e | 236 | IE = mg; emux(); |
vanenzo | 8:e68460a69e2e | 237 | for (mj = 0; mj < 15; mj+=2) { |
vanenzo | 8:e68460a69e2e | 238 | II = mj; IG = mj+1; DI1 = mj; //DI2 = mj+1; |
vanenzo | 8:e68460a69e2e | 239 | igmux(); imux(); DI1mux(); //DI2mux(); |
vanenzo | 8:e68460a69e2e | 240 | if ((analog_value.read_u16() > 2500) &&(test_button.read() == 1)) |
vanenzo | 8:e68460a69e2e | 241 | {printf("%i,%i\r\n",mg+1, mj+1); printf("%i,%i\r\n",mg+1, mj+2);ct = 1;} |
vanenzo | 8:e68460a69e2e | 242 | } |
vanenzo | 8:e68460a69e2e | 243 | |
vanenzo | 8:e68460a69e2e | 244 | } |
vanenzo | 8:e68460a69e2e | 245 | mclkstop; |
vanenzo | 8:e68460a69e2e | 246 | } |
vanenzo | 8:e68460a69e2e | 247 | |
vanenzo | 0:957268dd05c4 | 248 | |
vanenzo | 8:e68460a69e2e | 249 | void four() |
vanenzo | 8:e68460a69e2e | 250 | { |
vanenzo | 8:e68460a69e2e | 251 | do { |
vanenzo | 8:e68460a69e2e | 252 | fflush (stdout); |
vanenzo | 8:e68460a69e2e | 253 | scanf ("%2s",buffer); |
vanenzo | 8:e68460a69e2e | 254 | } while (strcmp (key4,buffer) != 0); |
vanenzo | 8:e68460a69e2e | 255 | fflush (stdout); |
vanenzo | 8:e68460a69e2e | 256 | } |
vanenzo | 8:e68460a69e2e | 257 | |
vanenzo | 8:e68460a69e2e | 258 | void five() |
vanenzo | 8:e68460a69e2e | 259 | { |
vanenzo | 8:e68460a69e2e | 260 | do { |
vanenzo | 8:e68460a69e2e | 261 | fflush (stdout); |
vanenzo | 8:e68460a69e2e | 262 | scanf ("%2s",buffer); |
vanenzo | 8:e68460a69e2e | 263 | } while (strcmp (key5,buffer) != 0); |
vanenzo | 8:e68460a69e2e | 264 | fflush (stdout); |
vanenzo | 8:e68460a69e2e | 265 | } |
vanenzo | 8:e68460a69e2e | 266 | |
vanenzo | 8:e68460a69e2e | 267 | void amplitude () |
vanenzo | 8:e68460a69e2e | 268 | { |
vanenzo | 8:e68460a69e2e | 269 | uint16_t ampt; |
vanenzo | 8:e68460a69e2e | 270 | uint16_t ampReg; |
vanenzo | 8:e68460a69e2e | 271 | ampt = uint16_t(819.2*(5.0-amp)); |
vanenzo | 8:e68460a69e2e | 272 | ampReg = uint16_t(ampt & 0xFFF); |
vanenzo | 8:e68460a69e2e | 273 | DAC.format(16,1); |
vanenzo | 8:e68460a69e2e | 274 | dacstart; |
vanenzo | 8:e68460a69e2e | 275 | DAC.write(ampReg*4); |
vanenzo | 8:e68460a69e2e | 276 | dacstop; |
vanenzo | 8:e68460a69e2e | 277 | } |
vanenzo | 8:e68460a69e2e | 278 | |
vanenzo | 8:e68460a69e2e | 279 | void freq () |
vanenzo | 8:e68460a69e2e | 280 | { |
vanenzo | 8:e68460a69e2e | 281 | ddsstart; |
vanenzo | 8:e68460a69e2e | 282 | float FreqReg; |
vanenzo | 8:e68460a69e2e | 283 | uint32_t ftemp; |
vanenzo | 8:e68460a69e2e | 284 | uint16_t Uptemp, Lowtemp; |
vanenzo | 8:e68460a69e2e | 285 | FreqReg = 26.8435456 * (uint32_t)freqdata*1000; |
vanenzo | 8:e68460a69e2e | 286 | ftemp = (uint32_t)FreqReg; |
vanenzo | 8:e68460a69e2e | 287 | Lowtemp = (uint16_t)(ftemp & 0x3FFF); |
vanenzo | 8:e68460a69e2e | 288 | Uptemp = (uint16_t)((ftemp/16384) & 0x3FFF); |
vanenzo | 8:e68460a69e2e | 289 | DDS.write(Lowtemp + 0x4000); |
vanenzo | 8:e68460a69e2e | 290 | ddsstart; |
vanenzo | 8:e68460a69e2e | 291 | DDS.write(Uptemp + 0x4000); |
vanenzo | 8:e68460a69e2e | 292 | ddsstop; |
vanenzo | 8:e68460a69e2e | 293 | } |
vanenzo | 8:e68460a69e2e | 294 | |
vanenzo | 8:e68460a69e2e | 295 | void freqsq () |
vanenzo | 8:e68460a69e2e | 296 | { |
vanenzo | 8:e68460a69e2e | 297 | float period; |
vanenzo | 8:e68460a69e2e | 298 | period = 1000/freqdata; |
vanenzo | 8:e68460a69e2e | 299 | sq.period_us(period); |
vanenzo | 8:e68460a69e2e | 300 | sq.pulsewidth_us(period/2); |
vanenzo | 8:e68460a69e2e | 301 | } |
vanenzo | 8:e68460a69e2e | 302 | |
vanenzo | 8:e68460a69e2e | 303 | void sinus() |
vanenzo | 8:e68460a69e2e | 304 | { |
vanenzo | 8:e68460a69e2e | 305 | ddsstart; |
vanenzo | 8:e68460a69e2e | 306 | sinsoft; |
vanenzo | 8:e68460a69e2e | 307 | freq(); |
vanenzo | 8:e68460a69e2e | 308 | ddsstop; |
vanenzo | 8:e68460a69e2e | 309 | amplitude(); |
vanenzo | 8:e68460a69e2e | 310 | mclkstart; |
vanenzo | 8:e68460a69e2e | 311 | } |
vanenzo | 8:e68460a69e2e | 312 | |
vanenzo | 8:e68460a69e2e | 313 | void square() |
vanenzo | 8:e68460a69e2e | 314 | { |
vanenzo | 8:e68460a69e2e | 315 | freqsq(); |
vanenzo | 8:e68460a69e2e | 316 | ddsstart;DDS.write(0x210A);ddsstart;DDS.write(0x4000); |
vanenzo | 8:e68460a69e2e | 317 | ddsstart;DDS.write(0x4000);ddsstart;DDS.write(0x8000); |
vanenzo | 8:e68460a69e2e | 318 | ddsstart;DDS.write(0x8000);ddsstart;DDS.write(0xCC00); |
vanenzo | 8:e68460a69e2e | 319 | ddsstart;DDS.write(0xE400);ddsstart;DDS.write(0x220A); |
vanenzo | 8:e68460a69e2e | 320 | ddsstop; |
vanenzo | 8:e68460a69e2e | 321 | amplitude(); |
vanenzo | 8:e68460a69e2e | 322 | mclkstart; |
vanenzo | 8:e68460a69e2e | 323 | } |
vanenzo | 8:e68460a69e2e | 324 | |
vanenzo | 8:e68460a69e2e | 325 | void triangle() |
vanenzo | 8:e68460a69e2e | 326 | { |
vanenzo | 8:e68460a69e2e | 327 | ddsstart; |
vanenzo | 8:e68460a69e2e | 328 | trisoft; |
vanenzo | 8:e68460a69e2e | 329 | ddsstart; |
vanenzo | 8:e68460a69e2e | 330 | freq(); |
vanenzo | 8:e68460a69e2e | 331 | ddsstop; |
vanenzo | 8:e68460a69e2e | 332 | amplitude(); |
vanenzo | 8:e68460a69e2e | 333 | mclkstart; |
vanenzo | 8:e68460a69e2e | 334 | } |
vanenzo | 8:e68460a69e2e | 335 | |
vanenzo | 8:e68460a69e2e | 336 | void request() |
vanenzo | 8:e68460a69e2e | 337 | { |
vanenzo | 8:e68460a69e2e | 338 | // printf("forma, chastota\r\n"); |
vanenzo | 8:e68460a69e2e | 339 | fflush(stdout); |
vanenzo | 8:e68460a69e2e | 340 | scanf("%i,%i,%f",&form,&freqdata,&); |
vanenzo | 8:e68460a69e2e | 341 | fflush(stdout); |
vanenzo | 8:e68460a69e2e | 342 | } |
vanenzo | 8:e68460a69e2e | 343 | |
vanenzo | 8:e68460a69e2e | 344 | void rasputte() |
vanenzo | 8:e68460a69e2e | 345 | { |
vanenzo | 8:e68460a69e2e | 346 | switch(form) { |
vanenzo | 8:e68460a69e2e | 347 | case (1): |
vanenzo | 8:e68460a69e2e | 348 | sinus(); |
vanenzo | 8:e68460a69e2e | 349 | break; |
vanenzo | 8:e68460a69e2e | 350 | case (2): |
vanenzo | 8:e68460a69e2e | 351 | square(); |
vanenzo | 8:e68460a69e2e | 352 | break; |
vanenzo | 8:e68460a69e2e | 353 | case (3): |
vanenzo | 8:e68460a69e2e | 354 | triangle(); |
vanenzo | 8:e68460a69e2e | 355 | break; |
vanenzo | 8:e68460a69e2e | 356 | } |
vanenzo | 8:e68460a69e2e | 357 | } |
vanenzo | 8:e68460a69e2e | 358 | |
vanenzo | 8:e68460a69e2e | 359 | void emux_init() |
vanenzo | 8:e68460a69e2e | 360 | { |
vanenzo | 8:e68460a69e2e | 361 | P = 15; P0=&IE0; P1=&IE1; P2=&IE2; P3=&IE3; |
vanenzo | 8:e68460a69e2e | 362 | mux(); |
vanenzo | 8:e68460a69e2e | 363 | } |
vanenzo | 8:e68460a69e2e | 364 | |
vanenzo | 8:e68460a69e2e | 365 | void emux() |
vanenzo | 8:e68460a69e2e | 366 | { |
vanenzo | 8:e68460a69e2e | 367 | P = IE; P0=&IE0; P1=&IE1; P2=&IE2; P3=&IE3; |
vanenzo | 8:e68460a69e2e | 368 | mux(); |
vanenzo | 8:e68460a69e2e | 369 | } |
vanenzo | 8:e68460a69e2e | 370 | |
vanenzo | 8:e68460a69e2e | 371 | void imux() |
vanenzo | 8:e68460a69e2e | 372 | { |
vanenzo | 8:e68460a69e2e | 373 | P = II; P0=&II0; P1=&II1; P2=&II2; P3=&II3; |
vanenzo | 8:e68460a69e2e | 374 | mux(); |
vanenzo | 8:e68460a69e2e | 375 | } |
vanenzo | 8:e68460a69e2e | 376 | |
vanenzo | 8:e68460a69e2e | 377 | void igmux() |
vanenzo | 8:e68460a69e2e | 378 | { |
vanenzo | 8:e68460a69e2e | 379 | P = IG; P0=&IG0; P1=&IG1; P2=&IG2; P3=&IG3; |
vanenzo | 8:e68460a69e2e | 380 | mux(); |
vanenzo | 8:e68460a69e2e | 381 | } |
vanenzo | 8:e68460a69e2e | 382 | |
vanenzo | 8:e68460a69e2e | 383 | void DI1mux() |
vanenzo | 8:e68460a69e2e | 384 | { |
vanenzo | 8:e68460a69e2e | 385 | P = DI1; P0=&DI10; P1=&DI11; P2=&DI12; P3=&DI13; |
vanenzo | 8:e68460a69e2e | 386 | mux(); |
vanenzo | 8:e68460a69e2e | 387 | } |
vanenzo | 8:e68460a69e2e | 388 | |
vanenzo | 8:e68460a69e2e | 389 | void DI2mux() |
vanenzo | 8:e68460a69e2e | 390 | { |
vanenzo | 8:e68460a69e2e | 391 | P = DI2; P0=&DI20; P1=&DI21; P2=&DI22; P3=&DI23; |
vanenzo | 8:e68460a69e2e | 392 | mux(); |
vanenzo | 8:e68460a69e2e | 393 | } |
vanenzo | 8:e68460a69e2e | 394 | |
vanenzo | 8:e68460a69e2e | 395 | |
vanenzo | 8:e68460a69e2e | 396 | void mux() |
vanenzo | 8:e68460a69e2e | 397 | { |
vanenzo | 8:e68460a69e2e | 398 | switch (P) { |
vanenzo | 8:e68460a69e2e | 399 | case (0): {*P0=0; *P1=0; *P2=0; *P3=0;} break; |
vanenzo | 8:e68460a69e2e | 400 | case (1): {*P0=1; *P1=0; *P2=0; *P3=0;} break; |
vanenzo | 8:e68460a69e2e | 401 | case (2): {*P0=0; *P1=1; *P2=0; *P3=0;} break; |
vanenzo | 8:e68460a69e2e | 402 | case (3): {*P0=1; *P1=1; *P2=0; *P3=0;} break; |
vanenzo | 8:e68460a69e2e | 403 | case (4): {*P0=0; *P1=0; *P2=1; *P3=0;} break; |
vanenzo | 8:e68460a69e2e | 404 | case (5): {*P0=1; *P1=0; *P2=1; *P3=0;} break; |
vanenzo | 8:e68460a69e2e | 405 | case (6): {*P0=0; *P1=1; *P2=1; *P3=0;} break; |
vanenzo | 8:e68460a69e2e | 406 | case (7): {*P0=1; *P1=1; *P2=1; *P3=0;} break; |
vanenzo | 8:e68460a69e2e | 407 | case (8): {*P0=0; *P1=0; *P2=0; *P3=1;} break; |
vanenzo | 8:e68460a69e2e | 408 | case (9): {*P0=1; *P1=0; *P2=0; *P3=1;} break; |
vanenzo | 8:e68460a69e2e | 409 | case (10): {*P0=0; *P1=1; *P2=0; *P3=1;} break; |
vanenzo | 8:e68460a69e2e | 410 | case (11): {*P0=1; *P1=1; *P2=0; *P3=1;} break; |
vanenzo | 8:e68460a69e2e | 411 | case (12): {*P0=0; *P1=0; *P2=1; *P3=1;} break; |
vanenzo | 8:e68460a69e2e | 412 | case (13): {*P0=1; *P1=0; *P2=1; *P3=1;} break; |
vanenzo | 8:e68460a69e2e | 413 | case (14): {*P0=0; *P1=1; *P2=1; *P3=1;} break; |
vanenzo | 8:e68460a69e2e | 414 | case (15): {*P0=1; *P1=1; *P2=1; *P3=1;} break; |
vanenzo | 3:59a57634f1fa | 415 | } |
vanenzo | 4:2a0242bfbe0c | 416 | } |
vanenzo | 0:957268dd05c4 | 417 | |
vanenzo | 8:e68460a69e2e | 418 | void preamp() |
vanenzo | 0:957268dd05c4 | 419 | { |
vanenzo | 8:e68460a69e2e | 420 | switch (PA) |
vanenzo | 8:e68460a69e2e | 421 | { |
vanenzo | 8:e68460a69e2e | 422 | case(1): {AA0=0;AA1=0;} break; |
vanenzo | 8:e68460a69e2e | 423 | case(10): {AA0=0;AA1=1;} break; |
vanenzo | 8:e68460a69e2e | 424 | case(100): {AA0=1;AA1=0;} break; |
vanenzo | 8:e68460a69e2e | 425 | case(1000): {AA0=1;AA1=1;} break; |
vanenzo | 0:957268dd05c4 | 426 | } |
vanenzo | 5:dcaed6b6b3cb | 427 | } |
vanenzo | 5:dcaed6b6b3cb | 428 | |
vanenzo | 5:dcaed6b6b3cb | 429 | |
vanenzo | 8:e68460a69e2e | 430 | void mux_group() |
vanenzo | 8:e68460a69e2e | 431 | { |
vanenzo | 8:e68460a69e2e | 432 | for (IE = 0; IE < 1; IE++) { |
vanenzo | 8:e68460a69e2e | 433 | emux(); |
vanenzo | 8:e68460a69e2e | 434 | PA=1; range=1;preamp(); |
vanenzo | 8:e68460a69e2e | 435 | wait_ms(20); |
vanenzo | 8:e68460a69e2e | 436 | channel(); |
vanenzo | 8:e68460a69e2e | 437 | } |
vanenzo | 8:e68460a69e2e | 438 | mclkstop; |
vanenzo | 8:e68460a69e2e | 439 | } |
vanenzo | 8:e68460a69e2e | 440 | |
vanenzo | 8:e68460a69e2e | 441 | void channel() |
vanenzo | 5:dcaed6b6b3cb | 442 | { |
vanenzo | 8:e68460a69e2e | 443 | j = 0;//inject |
vanenzo | 8:e68460a69e2e | 444 | k = 0;//measure |
vanenzo | 8:e68460a69e2e | 445 | for (j = 0; j<16; j++) { |
vanenzo | 8:e68460a69e2e | 446 | //button_check(); |
vanenzo | 8:e68460a69e2e | 447 | if (j==15) {IG = j; II = 0;} else {IG = j; II = j+1;} |
vanenzo | 8:e68460a69e2e | 448 | DI2=j;igmux(); imux();DI2mux(); |
vanenzo | 8:e68460a69e2e | 449 | for (k = 0; k<16; k++) { |
vanenzo | 8:e68460a69e2e | 450 | DI1 = k; |
vanenzo | 8:e68460a69e2e | 451 | DI1mux(); |
vanenzo | 8:e68460a69e2e | 452 | wait_us(50); |
vanenzo | 8:e68460a69e2e | 453 | measure(); |
vanenzo | 8:e68460a69e2e | 454 | // printf("\r\n"); |
vanenzo | 8:e68460a69e2e | 455 | } |
vanenzo | 5:dcaed6b6b3cb | 456 | } |
vanenzo | 8:e68460a69e2e | 457 | |
vanenzo | 8:e68460a69e2e | 458 | /* for (j = 0; j<16; j++) { |
vanenzo | 8:e68460a69e2e | 459 | //button_check(); |
vanenzo | 8:e68460a69e2e | 460 | if (j==15) {IG = j; II = 0;} else {IG = j; II = j+1;} |
vanenzo | 8:e68460a69e2e | 461 | DI1 = II;igmux(); imux();DI1mux(); |
vanenzo | 8:e68460a69e2e | 462 | |
vanenzo | 8:e68460a69e2e | 463 | wait_ms(2); |
vanenzo | 8:e68460a69e2e | 464 | |
vanenzo | 8:e68460a69e2e | 465 | measure();}*/ |
vanenzo | 8:e68460a69e2e | 466 | /* while(1){ |
vanenzo | 8:e68460a69e2e | 467 | printf("%s\r\n", "vvod II inJect "); |
vanenzo | 8:e68460a69e2e | 468 | fflush(stdout); |
vanenzo | 8:e68460a69e2e | 469 | scanf("%i",&II);//инжект |
vanenzo | 8:e68460a69e2e | 470 | printf("%s\r\n", "vvod IG inJect "); |
vanenzo | 8:e68460a69e2e | 471 | fflush(stdout); |
vanenzo | 8:e68460a69e2e | 472 | scanf("%i",&IG);//инжектIG |
vanenzo | 8:e68460a69e2e | 473 | igmux(); imux(); |
vanenzo | 8:e68460a69e2e | 474 | //button_check(); |
vanenzo | 8:e68460a69e2e | 475 | printf("%s\r\n", "vvod DI1"); |
vanenzo | 8:e68460a69e2e | 476 | fflush(stdout); |
vanenzo | 8:e68460a69e2e | 477 | scanf("%i",&DI1);//инжект |
vanenzo | 8:e68460a69e2e | 478 | DI1mux(); measure();}*/ |
vanenzo | 8:e68460a69e2e | 479 | |
vanenzo | 5:dcaed6b6b3cb | 480 | } |
vanenzo | 5:dcaed6b6b3cb | 481 | |
vanenzo | 8:e68460a69e2e | 482 | |
vanenzo | 8:e68460a69e2e | 483 | void measure() |
vanenzo | 8:e68460a69e2e | 484 | { |
vanenzo | 8:e68460a69e2e | 485 | ranging(); |
vanenzo | 8:e68460a69e2e | 486 | adc_read(); |
vanenzo | 8:e68460a69e2e | 487 | } |
vanenzo | 8:e68460a69e2e | 488 | |
vanenzo | 8:e68460a69e2e | 489 | void ranging()//определение коэффициента усиления и знака |
vanenzo | 8:e68460a69e2e | 490 | { |
vanenzo | 8:e68460a69e2e | 491 | int s_ok=0; |
vanenzo | 8:e68460a69e2e | 492 | //IG = 0; II = 1;DI1 = II;DI2=IG;igmux();imux();DI1mux();DI2mux();wait_ms(10); |
vanenzo | 8:e68460a69e2e | 493 | PA=1; preamp(); |
vanenzo | 8:e68460a69e2e | 494 | while(s_ok==0){ |
vanenzo | 8:e68460a69e2e | 495 | adc_init(); |
vanenzo | 8:e68460a69e2e | 496 | dma_init(); |
vanenzo | 8:e68460a69e2e | 497 | memset(x,0,sizeof x); |
vanenzo | 8:e68460a69e2e | 498 | t.reset(); |
vanenzo | 8:e68460a69e2e | 499 | t.start(); |
vanenzo | 8:e68460a69e2e | 500 | adc_readn(x,40); |
vanenzo | 8:e68460a69e2e | 501 | t.stop(); |
vanenzo | 8:e68460a69e2e | 502 | printf("1000r useconds %i\r\n", t.read_us()); |
vanenzo | 8:e68460a69e2e | 503 | sort(x,x + 40); |
vanenzo | 8:e68460a69e2e | 504 | ymax = (x[38]); |
vanenzo | 8:e68460a69e2e | 505 | if (ymax <= 0) {} |
vanenzo | 8:e68460a69e2e | 506 | else if (((ymax >= 2049)&&(ymax < 2050))) {range=1000;s_ok=1;} |
vanenzo | 8:e68460a69e2e | 507 | else if (((ymax >= 2050)&&(ymax < 2068))) {range=100;s_ok=1;} |
vanenzo | 8:e68460a69e2e | 508 | else if(((ymax >= 2068)&&(ymax < 2248))) {range=10;s_ok=1;} |
vanenzo | 8:e68460a69e2e | 509 | else {range=1;s_ok=1;}; |
vanenzo | 8:e68460a69e2e | 510 | } |
vanenzo | 8:e68460a69e2e | 511 | PA = range; preamp(); |
vanenzo | 8:e68460a69e2e | 512 | memset(x,0,sizeof x); |
vanenzo | 5:dcaed6b6b3cb | 513 | } |
vanenzo | 5:dcaed6b6b3cb | 514 | |
vanenzo | 8:e68460a69e2e | 515 | void swap() |
vanenzo | 8:e68460a69e2e | 516 | { |
vanenzo | 8:e68460a69e2e | 517 | int diff = DI1; |
vanenzo | 8:e68460a69e2e | 518 | DI1 = DI2; |
vanenzo | 8:e68460a69e2e | 519 | DI2 = diff; |
vanenzo | 8:e68460a69e2e | 520 | DI1mux(); |
vanenzo | 8:e68460a69e2e | 521 | DI2mux(); |
vanenzo | 8:e68460a69e2e | 522 | } |
vanenzo | 8:e68460a69e2e | 523 | |
vanenzo | 8:e68460a69e2e | 524 | void adc_read()//измерение и вывод со всеми коэффициентами |
vanenzo | 8:e68460a69e2e | 525 | { |
vanenzo | 8:e68460a69e2e | 526 | |
vanenzo | 8:e68460a69e2e | 527 | |
vanenzo | 8:e68460a69e2e | 528 | adc_init(); |
vanenzo | 8:e68460a69e2e | 529 | dma_init(); |
vanenzo | 8:e68460a69e2e | 530 | memset(y,0,sizeof y); |
vanenzo | 8:e68460a69e2e | 531 | adc_readn(y,40); |
vanenzo | 8:e68460a69e2e | 532 | // for (yp = 0; yp < 400; yp++) {printf("%i\r\n",y[yp]);}; |
vanenzo | 8:e68460a69e2e | 533 | sort(y,y + 40); |
vanenzo | 8:e68460a69e2e | 534 | yprint[yp]=(float)(((y[39]-2048)*3.3*10)/(4096*range));yp++; |
vanenzo | 8:e68460a69e2e | 535 | memset(y,0,sizeof y); |
vanenzo | 8:e68460a69e2e | 536 | |
vanenzo | 8:e68460a69e2e | 537 | } |
vanenzo | 8:e68460a69e2e | 538 | |
vanenzo | 8:e68460a69e2e | 539 | |
vanenzo | 8:e68460a69e2e | 540 | void button_check() |
vanenzo | 8:e68460a69e2e | 541 | { |
vanenzo | 8:e68460a69e2e | 542 | if (button.read() == 1) { |
vanenzo | 5:dcaed6b6b3cb | 543 | wait_ms(10); |
vanenzo | 8:e68460a69e2e | 544 | if (button.read() == 1) { |
vanenzo | 8:e68460a69e2e | 545 | int amp1; |
vanenzo | 8:e68460a69e2e | 546 | amp1 = amp; |
vanenzo | 8:e68460a69e2e | 547 | amp = 0.1; |
vanenzo | 8:e68460a69e2e | 548 | amplitude(); |
vanenzo | 8:e68460a69e2e | 549 | while (button.read() == 1); |
vanenzo | 8:e68460a69e2e | 550 | amp = amp1; |
vanenzo | 8:e68460a69e2e | 551 | amplitude(); |
vanenzo | 5:dcaed6b6b3cb | 552 | } |
vanenzo | 5:dcaed6b6b3cb | 553 | } |
vanenzo | 8:e68460a69e2e | 554 | } |