fork

Dependencies:   mbed

Fork of LG by igor Apu

Committer:
Kovalev_D
Date:
Wed Sep 27 13:09:24 2017 +0000
Revision:
219:2d3475d0dd1b
Parent:
209:224e7331a061
hnjtfgyy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kovalev_D 152:cff1321ab25e 1 ________________________________________________________________________________________________
Kovalev_D 152:cff1321ab25e 2 | Регистр |бит| описание | PIN | Состояние |
Kovalev_D 152:cff1321ab25e 3 | | | | | ВКЛ | ВЫКЛ |
Kovalev_D 152:cff1321ab25e 4 |------------------------|---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 5 | Gyro.PinReg | 0 | Описывает состояние ноги вибро 1 | 1.25 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 6 | |---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 7 | Ргистр управения | 1 | Описывает состояние ноги вибро 2 | 1.28 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 8 | ногами микрокнтроллера |---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 9 | | 2 | Описывает состояние подсветки | 2.12 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 10 | |---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 11 | | 3 | Описывает состояние поджига | 0.4 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 12 | |---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 13 | | 4 | Описывает состояние отладочного светодиода | 1.30 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 14 |________________________|___|______________________________________________|______|______|______|
Kovalev_D 152:cff1321ab25e 15
Kovalev_D 152:cff1321ab25e 16 ________________________________________________________________________________________________
Kovalev_D 152:cff1321ab25e 17 | Регистр |бит| описание | PIN | Состояние |
Kovalev_D 152:cff1321ab25e 18 | | | | | ВКЛ | ВЫКЛ | каждую секунду проверяется нулевой бит регистра подсветки
Kovalev_D 152:cff1321ab25e 19 |------------------------|---|----------------------------------------------|------|------|------| затем сдвигаетя вправо на один бит для след значения.
Kovalev_D 152:cff1321ab25e 20 | Gyro.BackLight | 0 | 0 сек | 2.12 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 21 | |---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 22 | сдвиговый регистр | 1 | 1 сек | 2.12 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 23 | для задания последова- |---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 24 | тельности включения | 2 | 2 сек | 2.12 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 25 |светодиодной подсветки. |---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 26 | | 3 | 3 сек | 2.12 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 27 | |---|----------------------------------------------|------|------|------|
Kovalev_D 152:cff1321ab25e 28 | | 4 | 4 сек и тд. | 2.12 | 1 | 0 |
Kovalev_D 152:cff1321ab25e 29 |________________________|___|______________________________________________|______|______|______|
Kovalev_D 152:cff1321ab25e 30
Kovalev_D 154:09888f2a229b 31 ________________________________________________________________________________________________
Kovalev_D 154:09888f2a229b 32 | Регистр |бит| описание | PIN | Состояние |
Kovalev_D 154:09888f2a229b 33 | | | | | ВКЛ | ВЫКЛ | каждую секунду проверяется нулевой бит регистра поджига
Kovalev_D 154:09888f2a229b 34 |------------------------|---|----------------------------------------------|------|------|------| затем сдвигаетя вправо на один бит для след значения.
Kovalev_D 154:09888f2a229b 35 | Gyro.Discharg | 0 | 0 сек | 0.4 | 1 | 0 |
Kovalev_D 154:09888f2a229b 36 | |---|----------------------------------------------|------|------|------|
Kovalev_D 154:09888f2a229b 37 | сдвиговый регистр | 1 | 1 сек | 0.4 | 1 | 0 |
Kovalev_D 154:09888f2a229b 38 | для задания последова- |---|----------------------------------------------|------|------|------|
Kovalev_D 154:09888f2a229b 39 | тельности включения | 2 | 2 сек | 0.4 | 1 | 0 |
Kovalev_D 154:09888f2a229b 40 |светодиодной подсветки. |---|----------------------------------------------|------|------|------|
Kovalev_D 154:09888f2a229b 41 | | 3 | 3 сек | 0.4 | 1 | 0 |
Kovalev_D 154:09888f2a229b 42 | |---|----------------------------------------------|------|------|------|
Kovalev_D 154:09888f2a229b 43 | | 4 | 4 сек и тд. | 0.4 | 1 | 0 |
Kovalev_D 154:09888f2a229b 44 |________________________|___|______________________________________________|______|______|______|
Kovalev_D 152:cff1321ab25e 45
Kovalev_D 145:f023b2f18b82 46 _______________________________________________________________________________________________________________________________________________________________________________________
Kovalev_D 145:f023b2f18b82 47 | Параметр | описание | разрядность | диапозон | пересчет |
Kovalev_D 145:f023b2f18b82 48 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 145:f023b2f18b82 49 | | Назначаемый собственный адрес устройства. | unsigned int | | |
Kovalev_D 145:f023b2f18b82 50 | Gyro.My_Addres | 0-технологический адрес. | 0xffff | 0x0000-0x0003 | ----------- |
Kovalev_D 145:f023b2f18b82 51 | | 1-3 - адрес в системе. | | | |
Kovalev_D 145:f023b2f18b82 52 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 145:f023b2f18b82 53 | | Счетчик количества положительных импульсов за 1 такт | int | 0x0000-0xffff | |
Kovalev_D 145:f023b2f18b82 54 | Gyro.CaunPlus | виброподвеса.Сумируется из буфера Buff_Restored_sin[CountV31] | не обрезается | 1 байт 2 байт | ----------- |
Kovalev_D 145:f023b2f18b82 55 | | Обнуляется на CountV31=24.??? (VibroAMPRegul()) | | выдается как 0хff | 0хff | |
Kovalev_D 145:f023b2f18b82 56 |------------------------|---------------------------------------------------------------|----------------------|-----------------------------------------------------------------------|
Kovalev_D 145:f023b2f18b82 57 | | Счетчик количества отрицательных импульсов за 1 такт | int | 0x0000-0xffff | |
Kovalev_D 145:f023b2f18b82 58 | Gyro.CaunMin | виброподвеса.Сумируется из буфера Buff_Restored_sin[CountV31] | не обрезается | 1 байт 2 байт | ----------- |
Kovalev_D 145:f023b2f18b82 59 | | Обнуляется на CountV31=24.??? (VibroAMPRegul()) | | выдается как 0хff | 0хff | |
Kovalev_D 145:f023b2f18b82 60 |------------------------|---------------------------------------------------------------|----------------------|-----------------------------------------------------------------------|
Kovalev_D 187:6bfb02c2831c 61 | |Счетчик, прирашение угла за период выдачи M_Rate - 1 раз в сек,| int | 0x0000-0xFFFF | |
Kovalev_D 145:f023b2f18b82 62 | Gyro.CuruAngle |Delta_500Hz - 1 раз в 500 Гц,Delta_Ext - по внешней защелке. | не обрезается | 1 байт 2 байт | 1 импульс = ?°?'?" |
Kovalev_D 145:f023b2f18b82 63 | |Сумируется по бувферу 32 точки (вычет виброподвеса) | | выдается как 0хff | 0хff | |
Kovalev_D 145:f023b2f18b82 64 | |Обнуляется при выдачи данных в ACK_GLD. | | | |
Kovalev_D 145:f023b2f18b82 65 |________________________|_______________________________________________________________|______________________|__________________________________|____________________________________|
Kovalev_D 145:f023b2f18b82 66 | |
Kovalev_D 145:f023b2f18b82 67 | Амплитуда синус косинус |
Kovalev_D 145:f023b2f18b82 68 |_______________________________________________________________________________________________________________________________________________________________________________________|
Kovalev_D 145:f023b2f18b82 69 | | | | | |
Kovalev_D 145:f023b2f18b82 70 | | | | 0 V - 4 V | |
Kovalev_D 187:6bfb02c2831c 71 | Spi.ADC5 | Значение амплитуды ФД в текущий момент. | unsigned int | int 32767 - 0 | int 1 = 0.000122 |
Kovalev_D 145:f023b2f18b82 72 | | Считывается из АЦП5 по SPI | не обрезается | hex 0x7fff - 0x0000 | |
Kovalev_D 145:f023b2f18b82 73 | | | | | |
Kovalev_D 145:f023b2f18b82 74 |------------------------|---------------------------------------------------------------|----------------------|-----------------------------------------------------------------------|
Kovalev_D 145:f023b2f18b82 75 | | | unsigned int | 0 V - 4 V | |
Kovalev_D 145:f023b2f18b82 76 | TempA | Перевернутое и умноженное на 2 значение Spi.ADC5. | не обрезается | int 0 - 65535 | TempA = (0x7fff - Spi.ADC5) << 1; |
Kovalev_D 145:f023b2f18b82 77 | | | | hex 0x0000 - 0xffff | |
Kovalev_D 145:f023b2f18b82 78 | | | | | |
Kovalev_D 145:f023b2f18b82 79 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 145:f023b2f18b82 80 | | | int | | |
Kovalev_D 145:f023b2f18b82 81 | Gyro.ADF_Accum | Сумма значенний Амплитуды с АЦП5 (sin(),cos()) | не обрезается | 0 - int | Gyro.ADF_Accum += TempA; |
Kovalev_D 145:f023b2f18b82 82 | | для расчтета отфильтровонного значения амплитуды | | максимальное значение | |
Kovalev_D 145:f023b2f18b82 83 | | за пол периода виброподвеса (16 тактов) (быстрый фильтр) | | | |
Kovalev_D 145:f023b2f18b82 84 |------------------------|---------------------------------------------------------------|----------------------|-----------------------------------------------------------------------|
Kovalev_D 145:f023b2f18b82 85 | | | int | | |
Kovalev_D 145:f023b2f18b82 86 | Gyro.ADS_Accum | Сумма значенний Амплитуды с АЦП5 ( sin(),cos() ) | не обрезается | 0 - int | Gyro.ADS_Accum += TempA; |
Kovalev_D 145:f023b2f18b82 87 | | для расчтета отфильтровонного значения амплитуды | | максимальное значение | |
Kovalev_D 145:f023b2f18b82 88 | | за 256 тактов виброподвеса (медленный фильтр) | | 7584065 | |
Kovalev_D 145:f023b2f18b82 89 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 145:f023b2f18b82 90 | | | int | 0 - int | |
Kovalev_D 187:6bfb02c2831c 91 | Gyro.AD_Slow | Значение Gyro.ADS_Accum и Gyro.ADF_Accum | не обрезается | максимальное значение | Gyro.AD_Fast = Gyro.ADF_Accum << 8 |
Kovalev_D 187:6bfb02c2831c 92 | | приведенные к одной разрядной сетке | | 1941520832 | |
Kovalev_D 145:f023b2f18b82 93 | | | | | |
Kovalev_D 145:f023b2f18b82 94 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 145:f023b2f18b82 95 | | | int | 0 - int | |
Kovalev_D 187:6bfb02c2831c 96 | Gyro.AD_Fast | Значение Gyro.ADS_Accum и Gyro.ADF_Accum | не обрезается | максимальное значение |Gyro.AD_Fast = Gyro.ADF_Accum << 12 |
Kovalev_D 187:6bfb02c2831c 97 | | приведенные к одной разрядной сетке | | 1941520832 | |
Kovalev_D 145:f023b2f18b82 98 | | | | | |
Kovalev_D 145:f023b2f18b82 99 |________________________|_______________________________________________________________|______________________|__________________________________|____________________________________|
Kovalev_D 145:f023b2f18b82 100 | |
Kovalev_D 145:f023b2f18b82 101 | Вибропривод |
Kovalev_D 145:f023b2f18b82 102 |_______________________________________________________________________________________________________________________________________________________________________________________|
Kovalev_D 145:f023b2f18b82 103 | Параметр | описание | разрядность | диапозон | пересчет |
Kovalev_D 145:f023b2f18b82 104 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 187:6bfb02c2831c 105 | | Знач частоты ВП в Гц формат 16.16 | | пример: | |
Kovalev_D 187:6bfb02c2831c 106 | Gyro.Frq | персчитется каждй 16 | unsigned int | 300-500Гц | Gyro.Frq = Gyro.FrqHZ<<16; |
Kovalev_D 187:6bfb02c2831c 107 | | для регуливки частоты записывается в | формат 16,16 | 19660800-32768000 | |
Kovalev_D 187:6bfb02c2831c 108 | | LPC_TIM1->MR0 =(unsigned int)((103000000/(Gyro.Frq>>11) | | | |
Kovalev_D 145:f023b2f18b82 109 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 145:f023b2f18b82 110 | | | | 0 - 500 | (задается) |
Kovalev_D 145:f023b2f18b82 111 | Gyro.FrqHZ | значение частоты ВП в Гц | unsigned int | максимальное значение | Gyro.FrqHZ = Gyro.Frq>>16 |
Kovalev_D 145:f023b2f18b82 112 | | используется только для инициализации | | 500 | |
Kovalev_D 145:f023b2f18b82 113 | | начаольной частоты ВП | | | |
Kovalev_D 145:f023b2f18b82 114 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 145:f023b2f18b82 115 | | Максимально допустимая амплитуда в процентах | | | |
Kovalev_D 145:f023b2f18b82 116 | Gyro.AmpPer | используется для расчета ошумления | unsigned int | 0%-98% | (задается) |
Kovalev_D 145:f023b2f18b82 117 | | (Границ включения и отключения ног ВП) | | | |
Kovalev_D 187:6bfb02c2831c 118 | | Ширнва импульса ВП. | | | |
Kovalev_D 145:f023b2f18b82 119 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 145:f023b2f18b82 120 | | Частота ошумления ВП. При CountV31=0 входим в функцию | | | |
Kovalev_D 174:daffcc97d532 121 | Gyro.AmpT |ошумления ВП. Если PeriodCount меньше Gyro.AmpT инкрементируем| unsigned int | ------------ | Gyro.AmpT |
Kovalev_D 174:daffcc97d532 122 | |PeriodCount если счетчик больше или равен выполняем расчет | | --------------------- | = |
Kovalev_D 145:f023b2f18b82 123 | |амплитуды вибропривода. (псевдослучайно в диаппазоне) | | | rand() % Gyro.AmpTD+Gyro.AmpMin) |
Kovalev_D 146:2bea299a7c4f 124 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|-----------------------------------------------------------|
Kovalev_D 146:2bea299a7c4f 125 | | Левая и правая граница импульса ВП соответственно, | | При Gyro.FrqHZ = 500Hz : | N1 = ((Nmax*(100-Gyro.AmpPer))/Gyro.FrqHZ) |
Kovalev_D 187:6bfb02c2831c 126 | Gyro.AmpN1 | используется для создания симетричной картины импульса ВП | unsigned int | N1(1-66) | N1 = ((Nmax*(100-Gyro.AmpPer+Gyro.AmpPerDel))/Gyro.FrqHZ) |
Kovalev_D 146:2bea299a7c4f 127 | Gyro.AmpN2 | относительно его центра при ушумлении | | 66-малая амплитуда | N2 = ((Nmax/2)-Gyro.AmpN1); |
Kovalev_D 146:2bea299a7c4f 128 | | _______ ___ | | N2 (100-165) | Nmax =((100000/(Gyro.Frq>>16))-1) |
Kovalev_D 146:2bea299a7c4f 129 | | _____/ = | = \____/=|=\_______ c-центр импульса | | 100-малая амплитуда | (максимальная длительность импульса) |
Kovalev_D 146:2bea299a7c4f 130 | | 0 N1 c N2 N1 c N2 Gyro.Frq | | | при данной частоте Gyro.Frq |
Kovalev_D 146:2bea299a7c4f 131 |________________________|_______________________________________________________________|______________________|__________________________________|___________________________________________________________|
Kovalev_D 146:2bea299a7c4f 132 | |
Kovalev_D 146:2bea299a7c4f 133 | АЦП и ЦАП |
Kovalev_D 146:2bea299a7c4f 134 |_______________________________________________________________________________________________________________________________________________________________________________________|
Kovalev_D 146:2bea299a7c4f 135 | | | | | Gyro.Termo=Spi.ADC1_Accum >> 5; |
Kovalev_D 146:2bea299a7c4f 136 | Gyro.Termo | данные с первого АЦП температура | unsigned int | | Spi.ADC1_Accum - накопленные |
Kovalev_D 146:2bea299a7c4f 137 | | Термодатчик типа LM337 | | 0V - 4V | данные за такт виброподвеса |
Kovalev_D 146:2bea299a7c4f 138 | | | | 0 - 65536 | |
Kovalev_D 146:2bea299a7c4f 139 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 146:2bea299a7c4f 140 | | | | | Gyro.Termo=Spi.ADC2_Accum >> 5; |
Kovalev_D 146:2bea299a7c4f 141 | Gyro.DeltaT | данные с второго АЦП | unsigned int | ------------------------------ | Spi.ADC2_Accum - накопленные |
Kovalev_D 150:29c9f7671bac 142 | | (градиент температур между двумя термодатчиками0 | | ------------------------------ | данные за такт виброподвеса |
Kovalev_D 145:f023b2f18b82 143 | | | | | |
Kovalev_D 145:f023b2f18b82 144 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 146:2bea299a7c4f 145 | | | | | Gyro.Termo=Spi.ADC3_Accum >> 5; |
Kovalev_D 146:2bea299a7c4f 146 | Gyro.In1 | ток в канале 1 | unsigned int | ----------------------------- | Spi.ADC3_Accum - накопленные |
Kovalev_D 146:2bea299a7c4f 147 | | | | ----------------------------- | данные за такт виброподвеса |
Kovalev_D 145:f023b2f18b82 148 | | | | | |
Kovalev_D 145:f023b2f18b82 149 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 146:2bea299a7c4f 150 | | | | | Gyro.Termo=Spi.ADC4_Accum >> 5; |
Kovalev_D 146:2bea299a7c4f 151 | Gyro.In2 | ток в канале 2 | unsigned int | ----------------------------- | Spi.ADC4_Accum - накопленные |
Kovalev_D 146:2bea299a7c4f 152 | | | | ----------------------------- | данные за такт виброподвеса |
Kovalev_D 146:2bea299a7c4f 153 | | | | | |
Kovalev_D 209:224e7331a061 154 |------------------------|---------------------------------------------------------------|----------------------|----------------------------------|------------------------------------|
Kovalev_D 209:224e7331a061 155
Kovalev_D 209:224e7331a061 156
Kovalev_D 209:224e7331a061 157
Kovalev_D 209:224e7331a061 158
Kovalev_D 209:224e7331a061 159
Kovalev_D 209:224e7331a061 160
Kovalev_D 209:224e7331a061 161
Kovalev_D 209:224e7331a061 162
Kovalev_D 209:224e7331a061 163
Kovalev_D 209:224e7331a061 164
Kovalev_D 209:224e7331a061 165
Kovalev_D 209:224e7331a061 166
Kovalev_D 209:224e7331a061 167
Kovalev_D 209:224e7331a061 168
Kovalev_D 209:224e7331a061 169
Kovalev_D 209:224e7331a061 170 /*
Kovalev_D 209:224e7331a061 171
Kovalev_D 209:224e7331a061 172 void PlcRegul(void)
Kovalev_D 209:224e7331a061 173 //Программа расчет напряжения для модулятора(//выполняется 1.25 микросек.)
Kovalev_D 209:224e7331a061 174 {
Kovalev_D 209:224e7331a061 175
Kovalev_D 209:224e7331a061 176 int templm=0;
Kovalev_D 209:224e7331a061 177 int PLC_In;
Kovalev_D 209:224e7331a061 178 int tempDac;
Kovalev_D 209:224e7331a061 179 if(start<=5)
Kovalev_D 209:224e7331a061 180 {
Kovalev_D 209:224e7331a061 181 if(ttt)
Kovalev_D 209:224e7331a061 182 {// +25 С°
Kovalev_D 209:224e7331a061 183 templm = (Gyro.TermoNKU-Gyro.Termo); //дельта
Kovalev_D 209:224e7331a061 184 if(templm>0) Gyro.Ktermo=1;
Kovalev_D 209:224e7331a061 185 else Gyro.Ktermo=0;
Kovalev_D 209:224e7331a061 186 Spi.DAC_B+=templm;
Kovalev_D 209:224e7331a061 187 ttt=0;
Kovalev_D 209:224e7331a061 188 }
Kovalev_D 209:224e7331a061 189 }
Kovalev_D 209:224e7331a061 190
Kovalev_D 209:224e7331a061 191 if(!(Gyro.PinReg & PinRegBitL) && (start>0)) start--;
Kovalev_D 209:224e7331a061 192
Kovalev_D 209:224e7331a061 193 else if((start==0))
Kovalev_D 209:224e7331a061 194 {
Kovalev_D 209:224e7331a061 195
Kovalev_D 209:224e7331a061 196 PLC_In = Gyro.AD_Slow; //выбираем даные для фильтрации
Kovalev_D 209:224e7331a061 197 Gyro.PLC_Delta = PLC_In - Gyro.PLC_Old; //узнаем приращение
Kovalev_D 209:224e7331a061 198 Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld; //приращение с учетом знака (и количества) прошлого приращения
Kovalev_D 209:224e7331a061 199 Gyro.PLC_Old = PLC_In; //запоминание значения
Kovalev_D 209:224e7331a061 200 if(Gyro.flagGph_W)
Kovalev_D 209:224e7331a061 201 {
Kovalev_D 209:224e7331a061 202 AD_MAX=0;
Kovalev_D 209:224e7331a061 203 Gyro.flagGph_W--;
Kovalev_D 209:224e7331a061 204 Gyro.PLC_Error2Mode=3;
Kovalev_D 209:224e7331a061 205 } //если изменился коэфициент усиления ФД //3600 (размер моды порядка 3000)
Kovalev_D 209:224e7331a061 206 if((Gyro.PLC_Lern < 150) && (Gyro.PLC_Error2Mode != 0))
Kovalev_D 209:224e7331a061 207 { //пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды.
Kovalev_D 209:224e7331a061 208
Kovalev_D 209:224e7331a061 209 if(Gyro.Ktermo)Spi.DAC_B += 0x3c; //добовляем в значение цапа 60
Kovalev_D 209:224e7331a061 210 else Spi.DAC_B -= 0x3c;
Kovalev_D 209:224e7331a061 211 if(AD_MAX < PLC_In){AD_MAX = PLC_In;} //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду.
Kovalev_D 209:224e7331a061 212 else if ((AD_MAX>PLC_In)&&(AD_MAX>1550800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик.
Kovalev_D 209:224e7331a061 213 if (r>10)
Kovalev_D 209:224e7331a061 214 {
Kovalev_D 209:224e7331a061 215 Gyro.PLC_Lern=151;
Kovalev_D 209:224e7331a061 216 Gyro.PLC_Error2Mode=3;
Kovalev_D 209:224e7331a061 217 } //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска
Kovalev_D 209:224e7331a061 218 Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду.
Kovalev_D 209:224e7331a061 219 } //работает только первые ~30-40 секунд (37 сек).
Kovalev_D 209:224e7331a061 220 if (Gyro.PLC_Lern<160) Gyro.PLC_Lern++;
Kovalev_D 209:224e7331a061 221
Kovalev_D 209:224e7331a061 222 if(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;} //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды.
Kovalev_D 209:224e7331a061 223 else l++; //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной)
Kovalev_D 209:224e7331a061 224 if((l > 300)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 2107200;k=15;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). m
Kovalev_D 209:224e7331a061 225 if ((k == 15)&&(Gyro.PLC_Lern > 150)) Spi.DAC_B += 75; //после уменьшения максимальной амплитуды двигаем шевелем цап
Kovalev_D 209:224e7331a061 226 else if((k == 1)&&(Gyro.PLC_Lern > 150)) {Spi.DAC_B -= 75; k=0;l=0;} //для быстрог поиска новог максимума.
Kovalev_D 209:224e7331a061 227 if(k>0)k--;
Kovalev_D 209:224e7331a061 228
Kovalev_D 209:224e7331a061 229 Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In); //ищем разницу между желаемой и действительной амплитудами.
Kovalev_D 209:224e7331a061 230
Kovalev_D 209:224e7331a061 231 if(Gyro.ModJump==1) { ///прыжок с моды на моду. (-->)
Kovalev_D 209:224e7331a061 232 Gyro.OldCuruAngle = Gyro.CuruAngle;
Kovalev_D 209:224e7331a061 233 Gyro.ModJump=0;
Kovalev_D 209:224e7331a061 234 Spi.DAC_B += 4300;
Kovalev_D 209:224e7331a061 235 Gyro.PLC_Error2Mode=1;
Kovalev_D 209:224e7331a061 236 Gyro.StopCuruAngle=2;
Kovalev_D 209:224e7331a061 237 }
Kovalev_D 209:224e7331a061 238
Kovalev_D 209:224e7331a061 239 if(Gyro.ModJump==2) { ///прыжок с моды на моду. (<--)
Kovalev_D 209:224e7331a061 240 Gyro.OldCuruAngle = Gyro.CuruAngle;
Kovalev_D 209:224e7331a061 241 Gyro.ModJump=0;
Kovalev_D 209:224e7331a061 242 Spi.DAC_B -= 5250;
Kovalev_D 209:224e7331a061 243 Gyro.PLC_Error2Mode=1;
Kovalev_D 209:224e7331a061 244 Gyro.StopCuruAngle=2;
Kovalev_D 209:224e7331a061 245 }
Kovalev_D 209:224e7331a061 246
Kovalev_D 209:224e7331a061 247 if(Gyro.RgConA&0x8) { // если контур регулирования замкнут
Kovalev_D 209:224e7331a061 248 if ( Gyro.PLC_Error2Mode > 0) { Gyro.PLC_Error2Mode --; Gyro.PLC_ADC_DOld = 0;} // если ошибка(нахожление в двух модовом)
Kovalev_D 209:224e7331a061 249 else if ( Gyro.PLC_DeltaADD > 0) { Gyro.PLC_ADC_DOld = 1;}
Kovalev_D 209:224e7331a061 250 else if ( Gyro.PLC_DeltaADD < 0) { Gyro.PLC_ADC_DOld = -1;}
Kovalev_D 209:224e7331a061 251 else { Gyro.PLC_ADC_DOld = 1;}
Kovalev_D 209:224e7331a061 252 }
Kovalev_D 209:224e7331a061 253 else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;}
Kovalev_D 209:224e7331a061 254
Kovalev_D 209:224e7331a061 255 ///прыжок с моды на моду.
Kovalev_D 209:224e7331a061 256
Kovalev_D 209:224e7331a061 257
Kovalev_D 209:224e7331a061 258
Kovalev_D 209:224e7331a061 259
Kovalev_D 209:224e7331a061 260
Kovalev_D 209:224e7331a061 261 tempADC5=0x7fff-Spi.ADC5;
Kovalev_D 209:224e7331a061 262 // контур замкнут включен лазер
Kovalev_D 209:224e7331a061 263 if((Gyro.RgConA&0x8) && (tempADC5>1000))
Kovalev_D 209:224e7331a061 264 {
Kovalev_D 209:224e7331a061 265 if(Gyro.PlC_MaxD>(50<<17)) { // 3 режим регулирования
Kovalev_D 209:224e7331a061 266 tempDac=(unsigned int)(Gyro.PlC_MaxD>>19);
Kovalev_D 209:224e7331a061 267 if(tempDac>600) tempDac=600; //ограничение на регулирование если очень большая разница амплитуд
Kovalev_D 209:224e7331a061 268 Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; //новое значение в цап (±1 * значение регулировки)
Kovalev_D 209:224e7331a061 269 tempDac = Gyro.PLC_ADC_DOld * tempDac; //используется только для выдачи
Kovalev_D 209:224e7331a061 270 flagmod=3;
Kovalev_D 209:224e7331a061 271 }
Kovalev_D 209:224e7331a061 272 else if(Gyro.PlC_MaxD>(12<<17)) { // 2 режим регулирования
Kovalev_D 209:224e7331a061 273 tempDac=(unsigned int)(Gyro.PlC_MaxD>>19);
Kovalev_D 209:224e7331a061 274 Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac);
Kovalev_D 209:224e7331a061 275 tempDac = Gyro.PLC_ADC_DOld * (tempDac); //используется только для выдачи
Kovalev_D 209:224e7331a061 276 flagmod=2;
Kovalev_D 209:224e7331a061 277 }
Kovalev_D 209:224e7331a061 278 else if(Gyro.PlC_MaxD<(2<<17)) { //режим если дельта равна 0;
Kovalev_D 209:224e7331a061 279 tempDac=2;
Kovalev_D 209:224e7331a061 280 Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac;
Kovalev_D 209:224e7331a061 281 flagmod=0;
Kovalev_D 209:224e7331a061 282 }
Kovalev_D 209:224e7331a061 283 else {
Kovalev_D 209:224e7331a061 284 tempDac=2; // 1 режим регулирования
Kovalev_D 209:224e7331a061 285 Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac;
Kovalev_D 209:224e7331a061 286 tempDac = Gyro.PLC_ADC_DOld * tempDac;
Kovalev_D 209:224e7331a061 287 flagmod=1;
Kovalev_D 209:224e7331a061 288 }
Kovalev_D 209:224e7331a061 289 }
Kovalev_D 209:224e7331a061 290
Kovalev_D 209:224e7331a061 291
Kovalev_D 209:224e7331a061 292 if ( Spi.DAC_B < 15300 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} //проверка на переваливание за границу.
Kovalev_D 209:224e7331a061 293 else if ( Spi.DAC_B > 53000) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;}
Kovalev_D 209:224e7331a061 294
Kovalev_D 209:224e7331a061 295 }
Kovalev_D 209:224e7331a061 296 if(Gyro.StopCuruAngle) {Gyro.CuruAngle = Gyro.OldCuruAngle; Gyro.StopCuruAngle--;}
Kovalev_D 209:224e7331a061 297 ///////////////////////
Kovalev_D 209:224e7331a061 298 //////////лог//////////
Kovalev_D 209:224e7331a061 299 ///////////////////////
Kovalev_D 209:224e7331a061 300 if(Gyro.LogPLC==1) {
Kovalev_D 209:224e7331a061 301
Kovalev_D 209:224e7331a061 302 sprintf((Time),"%d %d %d %d %d %d %d %d %d \r\n",Gyro.CuruAngle, Gyro.Frq, Gyro.MaxAmp, Spi.DAC_B, tempDac, flagmod, AD_MAX, PLC_In, Gyro.Termo);//выдаем в терминал для постройки граффика регулировки периметра.
Kovalev_D 209:224e7331a061 303 Gyro.CuruAngle=0;
Kovalev_D 209:224e7331a061 304 Gyro.tempdelta=0;
Kovalev_D 209:224e7331a061 305 Gyro.tempdelta2=0;
Kovalev_D 209:224e7331a061 306 WriteCon(Time);
Kovalev_D 209:224e7331a061 307
Kovalev_D 209:224e7331a061 308 }
Kovalev_D 209:224e7331a061 309 }
Kovalev_D 209:224e7331a061 310
Kovalev_D 209:224e7331a061 311
Kovalev_D 209:224e7331a061 312
Kovalev_D 209:224e7331a061 313 */
Kovalev_D 209:224e7331a061 314
Kovalev_D 209:224e7331a061 315
Kovalev_D 209:224e7331a061 316
Kovalev_D 209:224e7331a061 317
Kovalev_D 209:224e7331a061 318 void CalcAmpD(void)
Kovalev_D 209:224e7331a061 319 {
Kovalev_D 209:224e7331a061 320 // GyroP.Str.wall++;
Kovalev_D 209:224e7331a061 321 // if(GyroP.Str.wall>16)
Kovalev_D 209:224e7331a061 322 // {
Kovalev_D 209:224e7331a061 323 // GyroP.Str.wall=0;
Kovalev_D 209:224e7331a061 324 // klk++;
Kovalev_D 209:224e7331a061 325 // if(klk>32) klk = 0;
Kovalev_D 209:224e7331a061 326 // }
Kovalev_D 209:224e7331a061 327 unsigned int Nmax=0;
Kovalev_D 209:224e7331a061 328 Gyro.AmpPerDel = ModArrayTriangle[klk];
Kovalev_D 209:224e7331a061 329
Kovalev_D 209:224e7331a061 330 tempi++;
Kovalev_D 209:224e7331a061 331 srand(Global_Time);//инициализация функции rand() для получения новых случайных велечин.
Kovalev_D 209:224e7331a061 332 Gyro.AmpT = (rand() %8-4);// ОШУМЛЕНИЕ amp
Kovalev_D 209:224e7331a061 333
Kovalev_D 209:224e7331a061 334 Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1);
Kovalev_D 209:224e7331a061 335 Gyro.AmpN1=(unsigned int)((Nmax*((100-Gyro.AmpPer)+Gyro.AmpPerDel+Gyro.AmpT))/(Gyro.Frq>>16)); //левая граница амплитуды
Kovalev_D 209:224e7331a061 336 Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды
Kovalev_D 209:224e7331a061 337
Kovalev_D 209:224e7331a061 338 LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро
Kovalev_D 209:224e7331a061 339 // LPC_TIM1->MR0 +=(Gyro.AmpT<<5);
Kovalev_D 209:224e7331a061 340 }
Kovalev_D 209:224e7331a061 341 .
Kovalev_D 209:224e7331a061 342
Kovalev_D 209:224e7331a061 343
Kovalev_D 209:224e7331a061 344
Kovalev_D 209:224e7331a061 345 /*
Kovalev_D 209:224e7331a061 346 void Calc2AmpN(void)//расчет точек старта и стопа импульса вибропривода и расчет частоты ошумления.
Kovalev_D 209:224e7331a061 347 {
Kovalev_D 209:224e7331a061 348 Gyro.AmpSC=0;
Kovalev_D 209:224e7331a061 349 static int PeriodCount = 0;
Kovalev_D 209:224e7331a061 350 unsigned int Nmax=0;
Kovalev_D 209:224e7331a061 351 Gyro.AmpSC = Gyro.MaxAmp - OldMaxAmp ;
Kovalev_D 209:224e7331a061 352 if(Gyro.AmpSC<0) Gyro.AmpSC=Gyro.AmpSC*(-1);
Kovalev_D 209:224e7331a061 353 OldMaxAmp=Gyro.MaxAmp;
Kovalev_D 209:224e7331a061 354
Kovalev_D 209:224e7331a061 355 if(Gyro.AmpSC <55)countA++;
Kovalev_D 209:224e7331a061 356 if(countA >2)
Kovalev_D 209:224e7331a061 357 {
Kovalev_D 209:224e7331a061 358 countA=0;
Kovalev_D 209:224e7331a061 359 srand(Global_Time);
Kovalev_D 209:224e7331a061 360 if(Cheng_AMP_Flag)
Kovalev_D 209:224e7331a061 361 {
Kovalev_D 209:224e7331a061 362 Cheng_AMP_Flag=0;
Kovalev_D 209:224e7331a061 363 Gyro.AmpPerDel = (rand() % Gyro.AmpTD+Gyro.AmpMin);// ОШУМЛЕНИЕ amp
Kovalev_D 209:224e7331a061 364 Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1);
Kovalev_D 209:224e7331a061 365 Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer+Gyro.AmpPerDel))/(Gyro.Frq>>16)); //левая граница амплитуды
Kovalev_D 209:224e7331a061 366 Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды
Kovalev_D 209:224e7331a061 367 }
Kovalev_D 209:224e7331a061 368 else
Kovalev_D 209:224e7331a061 369 {
Kovalev_D 209:224e7331a061 370 Cheng_AMP_Flag=1;
Kovalev_D 209:224e7331a061 371 Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1);
Kovalev_D 209:224e7331a061 372 Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer))/(Gyro.Frq>>16)); //левая граница амплитуды
Kovalev_D 209:224e7331a061 373 Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды
Kovalev_D 209:224e7331a061 374 }
Kovalev_D 209:224e7331a061 375 } //8046
Kovalev_D 209:224e7331a061 376
Kovalev_D 209:224e7331a061 377 LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро
Kovalev_D 209:224e7331a061 378 }*/
Kovalev_D 209:224e7331a061 379 /*
Kovalev_D 209:224e7331a061 380 void CalcAmpN(void)//расчет точек старта и стопа импульса вибропривода и расчет частоты ошумления.
Kovalev_D 209:224e7331a061 381 {
Kovalev_D 209:224e7331a061 382 Gyro.AmpSC=0;
Kovalev_D 209:224e7331a061 383 static int PeriodCount = 0;
Kovalev_D 209:224e7331a061 384 unsigned int Nmax=0;
Kovalev_D 209:224e7331a061 385 Gyro.AmpSC = Gyro.MaxAmp - OldMaxAmp ;
Kovalev_D 209:224e7331a061 386 if(Gyro.AmpSC<0) Gyro.AmpSC=Gyro.AmpSC*(-1);
Kovalev_D 209:224e7331a061 387 OldMaxAmp=Gyro.MaxAmp;
Kovalev_D 209:224e7331a061 388
Kovalev_D 209:224e7331a061 389 if(Gyro.AmpSC <5)countA++;
Kovalev_D 209:224e7331a061 390 if(countA >3)
Kovalev_D 209:224e7331a061 391 {
Kovalev_D 209:224e7331a061 392 countA=0;
Kovalev_D 209:224e7331a061 393
Kovalev_D 209:224e7331a061 394 Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1);
Kovalev_D 209:224e7331a061 395 Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer+Gyro.AmpPerDel))/(Gyro.Frq>>16)); //левая граница амплитуды
Kovalev_D 209:224e7331a061 396 Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды
Kovalev_D 209:224e7331a061 397 Cheng_AMP_Flag=1;
Kovalev_D 209:224e7331a061 398
Kovalev_D 209:224e7331a061 399 tempDP=Gyro.AmpPerDel;
Kovalev_D 209:224e7331a061 400 srand(Global_Time);//инициализация функции rand() для получения новых случайных велечин.
Kovalev_D 209:224e7331a061 401 if(Gyro.flag==1) Gyro.AmpPerDel = 1;
Kovalev_D 209:224e7331a061 402 else Gyro.AmpPerDel = (rand() % Gyro.AmpTD+Gyro.AmpMin);// ОШУМЛЕНИЕ amp
Kovalev_D 209:224e7331a061 403 } //8046
Kovalev_D 209:224e7331a061 404
Kovalev_D 209:224e7331a061 405 LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро
Kovalev_D 209:224e7331a061 406 }
Kovalev_D 209:224e7331a061 407
Kovalev_D 209:224e7331a061 408 */
Kovalev_D 209:224e7331a061 409
Kovalev_D 209:224e7331a061 410 /*
Kovalev_D 209:224e7331a061 411 void CalcAmpD(void)
Kovalev_D 209:224e7331a061 412 {
Kovalev_D 209:224e7331a061 413 unsigned int Nmax=0;
Kovalev_D 209:224e7331a061 414 countA++;
Kovalev_D 209:224e7331a061 415 if( countA>1)
Kovalev_D 209:224e7331a061 416 {
Kovalev_D 209:224e7331a061 417 countA=0;
Kovalev_D 209:224e7331a061 418
Kovalev_D 209:224e7331a061 419 Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1);
Kovalev_D 209:224e7331a061 420 Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer-Gyro.AmpPerDel))/(Gyro.Frq>>16)); //левая граница амплитуды
Kovalev_D 209:224e7331a061 421 Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды
Kovalev_D 209:224e7331a061 422 Cheng_AMP_Flag=1;
Kovalev_D 209:224e7331a061 423
Kovalev_D 209:224e7331a061 424 // if(Gyro.flag==1) Gyro.AmpPerDel = 1;
Kovalev_D 209:224e7331a061 425
Kovalev_D 209:224e7331a061 426
Kovalev_D 209:224e7331a061 427 switch(Znak) {
Kovalev_D 209:224e7331a061 428 case 0:
Kovalev_D 209:224e7331a061 429 Gyro.AmpPerDel++;
Kovalev_D 209:224e7331a061 430 if (Gyro.AmpPerDel>10){Znak=1; fnoize++;}
Kovalev_D 209:224e7331a061 431 break;
Kovalev_D 209:224e7331a061 432
Kovalev_D 209:224e7331a061 433 case 1:
Kovalev_D 209:224e7331a061 434 Gyro.AmpPerDel--;
Kovalev_D 209:224e7331a061 435 if (Gyro.AmpPerDel<1)Znak=0;
Kovalev_D 209:224e7331a061 436 if (fnoize>6)Znak=2;
Kovalev_D 209:224e7331a061 437 break;
Kovalev_D 209:224e7331a061 438
Kovalev_D 209:224e7331a061 439 case 2:
Kovalev_D 209:224e7331a061 440 Gyro.AmpPerDel++;
Kovalev_D 209:224e7331a061 441 if (Gyro.AmpPerDel>7){Znak=3; fnoize++;}
Kovalev_D 209:224e7331a061 442 break;
Kovalev_D 209:224e7331a061 443
Kovalev_D 209:224e7331a061 444 case 3:
Kovalev_D 209:224e7331a061 445 Gyro.AmpPerDel--;
Kovalev_D 209:224e7331a061 446 if (Gyro.AmpPerDel<1)Znak=2;
Kovalev_D 209:224e7331a061 447 if (fnoize>12){Znak=4;}
Kovalev_D 209:224e7331a061 448 break;
Kovalev_D 209:224e7331a061 449
Kovalev_D 209:224e7331a061 450 case 4:
Kovalev_D 209:224e7331a061 451 Gyro.AmpPerDel++;
Kovalev_D 209:224e7331a061 452 if (Gyro.AmpPerDel>15){Znak=5; fnoize++;}
Kovalev_D 209:224e7331a061 453 break;
Kovalev_D 209:224e7331a061 454
Kovalev_D 209:224e7331a061 455 case 5:
Kovalev_D 209:224e7331a061 456 Gyro.AmpPerDel--;
Kovalev_D 209:224e7331a061 457 if (Gyro.AmpPerDel<1)Znak=4;
Kovalev_D 209:224e7331a061 458 if (fnoize>18){Znak=6;}
Kovalev_D 209:224e7331a061 459 break;
Kovalev_D 209:224e7331a061 460
Kovalev_D 209:224e7331a061 461 case 6:
Kovalev_D 209:224e7331a061 462 Gyro.AmpPerDel++;
Kovalev_D 209:224e7331a061 463 if (Gyro.AmpPerDel>6){Znak=7;fnoize++;}
Kovalev_D 209:224e7331a061 464 break;
Kovalev_D 209:224e7331a061 465
Kovalev_D 209:224e7331a061 466 case 7:
Kovalev_D 209:224e7331a061 467 Gyro.AmpPerDel--;
Kovalev_D 209:224e7331a061 468 if (Gyro.AmpPerDel<1)Znak=6;
Kovalev_D 209:224e7331a061 469 if (fnoize>24){Znak=0;fnoize=0;}
Kovalev_D 209:224e7331a061 470 break;
Kovalev_D 209:224e7331a061 471 }
Kovalev_D 209:224e7331a061 472 }
Kovalev_D 209:224e7331a061 473 LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро
Kovalev_D 209:224e7331a061 474 }
Kovalev_D 209:224e7331a061 475 */
Kovalev_D 209:224e7331a061 476
Kovalev_D 209:224e7331a061 477
Kovalev_D 209:224e7331a061 478
Kovalev_D 209:224e7331a061 479 int Mrand(void)
Kovalev_D 209:224e7331a061 480 {
Kovalev_D 209:224e7331a061 481 int b=0;
Kovalev_D 209:224e7331a061 482 z=z*Gyro.AD_Slow;
Kovalev_D 209:224e7331a061 483 b = ((z>>10) & 0xf)+20;
Kovalev_D 209:224e7331a061 484 /* sprintf((Time),"%d\r\n", b);
Kovalev_D 209:224e7331a061 485 WriteCon(Time);*/
Kovalev_D 209:224e7331a061 486 return b;
Kovalev_D 209:224e7331a061 487 }
Kovalev_D 209:224e7331a061 488
Kovalev_D 209:224e7331a061 489
Kovalev_D 209:224e7331a061 490
Kovalev_D 209:224e7331a061 491 /*дол лучших времен
Kovalev_D 209:224e7331a061 492 unsigned long mwc()
Kovalev_D 209:224e7331a061 493 {
Kovalev_D 209:224e7331a061 494 static unsigned long x3456789,
Kovalev_D 209:224e7331a061 495 y=362436069,
Kovalev_D 209:224e7331a061 496 z=77465321,
Kovalev_D 209:224e7331a061 497 c=13579;
Kovalev_D 209:224e7331a061 498 unsigned long long t;
Kovalev_D 209:224e7331a061 499 tС6905990LL*x+c;
Kovalev_D 209:224e7331a061 500 x=y;
Kovalev_D 209:224e7331a061 501 y=z;
Kovalev_D 209:224e7331a061 502 c=(t>>32);
Kovalev_D 209:224e7331a061 503 return z=(t&0xffffffff);
Kovalev_D 209:224e7331a061 504 }
Kovalev_D 209:224e7331a061 505 */