Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of LG by
SPI.c@172:ef7bf1663645, 2016-06-17 (annotated)
- Committer:
- Kovalev_D
- Date:
- Fri Jun 17 13:54:50 2016 +0000
- Revision:
- 172:ef7bf1663645
- Parent:
- 171:d227a6045305
- Child:
- 175:daffcc97d532
adc 0-65535
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
igor_v | 0:8ad47e2b6f00 | 1 | #include "Global.h" |
igor_v | 0:8ad47e2b6f00 | 2 | struct SPI Spi; |
Kovalev_D | 112:4a96133a1311 | 3 | //unsigned int Temp_AMP; |
Kovalev_D | 96:1c8536458119 | 4 | unsigned int Temp_AMP64P; |
igor_v | 29:c783288001b5 | 5 | |
Kovalev_D | 153:7086895c6ee3 | 6 | int ttt = 0; |
Kovalev_D | 99:3d8f206ceac2 | 7 | unsigned int Count_AMP, ADD_AMP, Cur_Amp; |
Kovalev_D | 99:3d8f206ceac2 | 8 | int Znak_Amp; |
Kovalev_D | 109:ee0cff33ad3b | 9 | int AD_Regul = 0; |
Kovalev_D | 141:c6de20b9b483 | 10 | int temp9; |
Kovalev_D | 148:7ce8c1fd00f7 | 11 | int AD_MAX=0; |
Kovalev_D | 160:6170df6f5a5c | 12 | int k=0,l=0,r=0; |
Kovalev_D | 152:cff1321ab25e | 13 | int flagmod=0; |
Kovalev_D | 86:398da56ef751 | 14 | unsigned int Temp_ADC_2; |
Kovalev_D | 86:398da56ef751 | 15 | unsigned int Temp_ADC_3; |
Kovalev_D | 86:398da56ef751 | 16 | unsigned int Temp_ADC_4; |
Kovalev_D | 86:398da56ef751 | 17 | unsigned int Temp_ADC_5; |
Kovalev_D | 147:1aed74f19a8f | 18 | unsigned int TempA; |
Kovalev_D | 158:0c8342e1837a | 19 | unsigned int TempTermLM; |
igor_v | 29:c783288001b5 | 20 | |
Kovalev_D | 95:dd51e577e114 | 21 | unsigned int Buff_ADC_1 [32]; |
Kovalev_D | 95:dd51e577e114 | 22 | unsigned int Buff_ADC_2 [32]; |
Kovalev_D | 95:dd51e577e114 | 23 | unsigned int Buff_ADC_3 [32]; |
Kovalev_D | 95:dd51e577e114 | 24 | unsigned int Buff_ADC_4 [32]; |
igor_v | 51:81f47b817071 | 25 | |
igor_v | 29:c783288001b5 | 26 | unsigned int Buff_ADC_5 [256]; |
igor_v | 29:c783288001b5 | 27 | unsigned int Buff_AMP [256]; |
Kovalev_D | 96:1c8536458119 | 28 | unsigned int Buff_AMP64P [256]; |
igor_v | 110:6406b7ac0442 | 29 | |
Kovalev_D | 147:1aed74f19a8f | 30 | void ADS_Acum(void) |
Kovalev_D | 147:1aed74f19a8f | 31 | { |
Kovalev_D | 157:1069c80f4944 | 32 | Spi.ADC_NewData = 0; |
Kovalev_D | 157:1069c80f4944 | 33 | Gyro.Termo = Spi.ADC1; |
Kovalev_D | 157:1069c80f4944 | 34 | Gyro.In1 = Spi.ADC2; |
Kovalev_D | 157:1069c80f4944 | 35 | Gyro.In2 = Spi.ADC3; |
Kovalev_D | 157:1069c80f4944 | 36 | Gyro.DeltaT = Spi.ADC4; |
Kovalev_D | 170:d099c3025f87 | 37 | |
Kovalev_D | 172:ef7bf1663645 | 38 | TempA = (0xffff - Spi.ADC5); // перевернем знак и умножим на два (было 32000...0 стало 0 ...32000 /*сдвиг(<<1) стало 0 ...64000*/) |
Kovalev_D | 170:d099c3025f87 | 39 | TempTermLM = Spi.ADC1; |
Kovalev_D | 170:d099c3025f87 | 40 | |
Kovalev_D | 157:1069c80f4944 | 41 | Gyro.ADF_Accum += TempA; |
Kovalev_D | 157:1069c80f4944 | 42 | Gyro.ADS_Accum += TempA; |
Kovalev_D | 158:0c8342e1837a | 43 | Gyro.ADS_AccumTermLM+=TempTermLM; |
Kovalev_D | 157:1069c80f4944 | 44 | Gyro.ADF_Count ++; |
Kovalev_D | 157:1069c80f4944 | 45 | Gyro.ADS_Count ++; |
Kovalev_D | 147:1aed74f19a8f | 46 | |
Kovalev_D | 157:1069c80f4944 | 47 | if (Gyro.ADF_Count > 15) { // если прошло 16 тактов виброподвеса |
Kovalev_D | 172:ef7bf1663645 | 48 | Gyro.AD_Fast = Gyro.ADF_Accum << 11; //обновляем данные и приводим в один масштаб |
Kovalev_D | 157:1069c80f4944 | 49 | Gyro.ADF_Count = 0;// |
Kovalev_D | 157:1069c80f4944 | 50 | Gyro.ADF_Accum = 0; |
Kovalev_D | 157:1069c80f4944 | 51 | Gyro.ADF_NewData = 1; |
Kovalev_D | 157:1069c80f4944 | 52 | } |
Kovalev_D | 157:1069c80f4944 | 53 | if (Gyro.ADS_Count > 255) { // если прошло 256 тактов виброподвеса |
Kovalev_D | 172:ef7bf1663645 | 54 | Gyro.AD_Slow = Gyro.ADS_Accum << 7; //обновляем данные и приводим в один масштаб |
Kovalev_D | 158:0c8342e1837a | 55 | Gyro.TermLM = Gyro.ADS_AccumTermLM << 3; |
Kovalev_D | 157:1069c80f4944 | 56 | Gyro.ADS_Count = 0; |
Kovalev_D | 157:1069c80f4944 | 57 | Gyro.ADS_Accum = 0; |
Kovalev_D | 158:0c8342e1837a | 58 | Gyro.ADS_AccumTermLM=0; |
Kovalev_D | 157:1069c80f4944 | 59 | Gyro.ADS_NewData = 1; |
Kovalev_D | 158:0c8342e1837a | 60 | |
Kovalev_D | 157:1069c80f4944 | 61 | } |
Kovalev_D | 147:1aed74f19a8f | 62 | } |
igor_v | 110:6406b7ac0442 | 63 | |
igor_v | 114:5cc38a53d8a7 | 64 | void SPI_Exchange(void) // новая функция чтения, в нецй не должно быть ничего лишнего |
Kovalev_D | 157:1069c80f4944 | 65 | { |
Kovalev_D | 157:1069c80f4944 | 66 | unsigned int DummySPI; |
Kovalev_D | 157:1069c80f4944 | 67 | Spi.ADC5_Accum += LPC_SSP0->DR; // Чтение АЦП |
igor_v | 110:6406b7ac0442 | 68 | Spi.ADC4_Accum += LPC_SSP0->DR; |
igor_v | 110:6406b7ac0442 | 69 | Spi.ADC3_Accum += LPC_SSP0->DR; |
igor_v | 110:6406b7ac0442 | 70 | Spi.ADC2_Accum += LPC_SSP0->DR; |
igor_v | 110:6406b7ac0442 | 71 | Spi.ADC1_Accum += LPC_SSP0->DR; |
Kovalev_D | 157:1069c80f4944 | 72 | while (LPC_SSP0->SR & RX_SSP_notEMPT) { |
Kovalev_D | 170:d099c3025f87 | 73 | DummySPI = LPC_SSP0->DR; //если буфер SPI не пуст.//очистить буфер. |
Kovalev_D | 157:1069c80f4944 | 74 | } |
Kovalev_D | 157:1069c80f4944 | 75 | |
Kovalev_D | 157:1069c80f4944 | 76 | |
Kovalev_D | 112:4a96133a1311 | 77 | DAC_OutPut(); |
Kovalev_D | 157:1069c80f4944 | 78 | |
Kovalev_D | 157:1069c80f4944 | 79 | if (CountV31 == 0) { // просто фильтруем по 32 точкам. |
Kovalev_D | 157:1069c80f4944 | 80 | // выставояем бит, что есть новы данные |
Kovalev_D | 157:1069c80f4944 | 81 | Spi.ADC1 = Spi.ADC1_Accum >> 5; // подгоотавливаем данные (в той эе сетке) те ADC1 0..65535 |
Kovalev_D | 157:1069c80f4944 | 82 | Spi.ADC2 = Spi.ADC2_Accum >> 5; |
Kovalev_D | 157:1069c80f4944 | 83 | Spi.ADC3 = Spi.ADC3_Accum >> 5; |
Kovalev_D | 157:1069c80f4944 | 84 | Spi.ADC4 = Spi.ADC4_Accum >> 5; |
Kovalev_D | 157:1069c80f4944 | 85 | Spi.ADC5 = Spi.ADC5_Accum >> 5; |
Kovalev_D | 157:1069c80f4944 | 86 | Spi.ADC1_Accum = 0; // сбрасывкем аккамулятор |
Kovalev_D | 157:1069c80f4944 | 87 | Spi.ADC2_Accum = 0; |
Kovalev_D | 157:1069c80f4944 | 88 | Spi.ADC3_Accum = 0; |
Kovalev_D | 157:1069c80f4944 | 89 | Spi.ADC4_Accum = 0; |
Kovalev_D | 157:1069c80f4944 | 90 | Spi.ADC5_Accum = 0; |
Kovalev_D | 157:1069c80f4944 | 91 | Spi.ADC_NewData = 1; |
Kovalev_D | 157:1069c80f4944 | 92 | } |
Kovalev_D | 128:1e4675a36c93 | 93 | |
Kovalev_D | 113:8be429494918 | 94 | |
Kovalev_D | 112:4a96133a1311 | 95 | } |
Kovalev_D | 113:8be429494918 | 96 | |
Kovalev_D | 141:c6de20b9b483 | 97 | |
Kovalev_D | 141:c6de20b9b483 | 98 | |
Kovalev_D | 159:38f39c0c143f | 99 | void ShowMod(void)//технологическая функция для просмотра мод на всем диапазпне цап |
Kovalev_D | 158:0c8342e1837a | 100 | { |
Kovalev_D | 158:0c8342e1837a | 101 | |
Kovalev_D | 158:0c8342e1837a | 102 | ////////////////////////////////////////////////////////////////////////////////////////////////// |
Kovalev_D | 158:0c8342e1837a | 103 | //////////////////////////////////смотрим все моды///////////////////////////////////////////////// |
Kovalev_D | 158:0c8342e1837a | 104 | /////////////////////////////////////////////////////////////////////////////////////////////////// |
Kovalev_D | 158:0c8342e1837a | 105 | if( (Gyro.PLC_Lern<1092)&&(Gyro.PLC_Error2Mode != 0))//пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. |
Kovalev_D | 158:0c8342e1837a | 106 | { |
Kovalev_D | 158:0c8342e1837a | 107 | Gyro.PLC_Error2Mode--; |
Kovalev_D | 158:0c8342e1837a | 108 | Gyro.PLC_Lern++; |
Kovalev_D | 158:0c8342e1837a | 109 | Spi.DAC_B += 0x3c; |
Kovalev_D | 158:0c8342e1837a | 110 | if(AD_MAX < Gyro.AD_Slow) AD_MAX = Gyro.AD_Slow; |
Kovalev_D | 158:0c8342e1837a | 111 | sprintf((Time),"%d %d %d %d \r\n",Gyro.TermLM,Spi.DAC_B, Gyro.AD_Slow, AD_MAX); |
Kovalev_D | 158:0c8342e1837a | 112 | WriteCon(Time); |
Kovalev_D | 168:f4a6abb18358 | 113 | } |
Kovalev_D | 169:140743e3bb96 | 114 | else {Gyro.ModJump=0;} |
Kovalev_D | 158:0c8342e1837a | 115 | } |
Kovalev_D | 144:083c667ba848 | 116 | |
Kovalev_D | 144:083c667ba848 | 117 | |
Kovalev_D | 144:083c667ba848 | 118 | |
Kovalev_D | 144:083c667ba848 | 119 | |
Kovalev_D | 144:083c667ba848 | 120 | |
Kovalev_D | 159:38f39c0c143f | 121 | void PlcRegul(void) //Программа расчет напряжения для модулятора(//выполняется 1.25 микросек.) |
Kovalev_D | 144:083c667ba848 | 122 | { |
Kovalev_D | 162:44e4ded32c6a | 123 | //LoopOn |
Kovalev_D | 157:1069c80f4944 | 124 | int PLC_In; |
Kovalev_D | 157:1069c80f4944 | 125 | int tempDac; |
Kovalev_D | 153:7086895c6ee3 | 126 | |
Kovalev_D | 151:d565ce4d58c8 | 127 | |
Kovalev_D | 172:ef7bf1663645 | 128 | PLC_In =Gyro.AD_Slow; //выбираем даные для фильтрации |
Kovalev_D | 172:ef7bf1663645 | 129 | // PLC_In = (unsigned int)(PLC_In>>1); |
Kovalev_D | 157:1069c80f4944 | 130 | Gyro.PLC_Delta = PLC_In - Gyro.PLC_Old; // узнаем приращение |
Kovalev_D | 157:1069c80f4944 | 131 | Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld; //приращение с учетом знака (и количества) прошлого приращения |
Kovalev_D | 157:1069c80f4944 | 132 | Gyro.PLC_Old = PLC_In; // запоминание значения |
Kovalev_D | 157:1069c80f4944 | 133 | |
Kovalev_D | 172:ef7bf1663645 | 134 | if(Gyro.flagGph_W){ |
Kovalev_D | 172:ef7bf1663645 | 135 | //Gyro.flagGph_W=0; |
Kovalev_D | 172:ef7bf1663645 | 136 | AD_MAX=0; |
Kovalev_D | 172:ef7bf1663645 | 137 | //Gyro.PLC_Lern =0; |
Kovalev_D | 172:ef7bf1663645 | 138 | //Gyro.PLC_Error2Mode=150; |
Kovalev_D | 172:ef7bf1663645 | 139 | Gyro.flagGph_W--; |
Kovalev_D | 172:ef7bf1663645 | 140 | // r=0; |
Kovalev_D | 172:ef7bf1663645 | 141 | } |
Kovalev_D | 172:ef7bf1663645 | 142 | // 3600 (размер моды порядка 3000) |
Kovalev_D | 160:6170df6f5a5c | 143 | if((Gyro.PLC_Lern < 150) && (Gyro.PLC_Error2Mode != 0)) { //пробигаем по нескольким значениям цап(60*0х3с=0хВВ8) для определения максимальной амплитуды. |
Kovalev_D | 160:6170df6f5a5c | 144 | Gyro.PLC_Lern++; //инкрементируем счетчик поиска максимальной амплитуды |
Kovalev_D | 160:6170df6f5a5c | 145 | Spi.DAC_B += 0x3c; //добовляем в значение цапа 60 |
Kovalev_D | 172:ef7bf1663645 | 146 | if(AD_MAX < PLC_In){AD_MAX = PLC_In;} //если максимальная амплитуда меньше текущей записываем новую максимальную амплитуду. |
Kovalev_D | 172:ef7bf1663645 | 147 | else if ((AD_MAX>PLC_In)&&(AD_MAX>1502800000)) r++; //если текущая амплитуда меньше максимально найденной то инкрементируем счетчик. |
Kovalev_D | 160:6170df6f5a5c | 148 | if (r>5){Gyro.PLC_Lern=150;Gyro.PLC_Error2Mode=5;} //если текущая амплитуда меньше максимально найденной в течении 5 тактов то выходим из поиска |
Kovalev_D | 160:6170df6f5a5c | 149 | |
Kovalev_D | 160:6170df6f5a5c | 150 | Gyro.CuruAngle = 0; //не считаем угол пока ищем максивальную амплитуду. |
Kovalev_D | 157:1069c80f4944 | 151 | } //работает только первые ~30-40 секунд (37 сек). |
Kovalev_D | 153:7086895c6ee3 | 152 | |
Kovalev_D | 153:7086895c6ee3 | 153 | |
Kovalev_D | 172:ef7bf1663645 | 154 | |
Kovalev_D | 172:ef7bf1663645 | 155 | if(AD_MAX < PLC_In) {AD_MAX = PLC_In; l=0;} //обновление максимального значения амплитуды обнуление счетчика малого понижения амплитуды. * |
Kovalev_D | 172:ef7bf1663645 | 156 | else if((l == 150)&&(Gyro.PLC_Error2Mode == 0)) {AD_MAX -= 5107200;k=30;l=0;} //если счетчик малого понижения амплитуды больше 100(аммплитуда не обновлялась 100 раз). |
Kovalev_D | 168:f4a6abb18358 | 157 | else if(Gyro.PLC_Error2Mode == 0) l++; //инкрементируем счетчик малого понижения желаемой амплитуды (максимальной замеченной) |
Kovalev_D | 162:44e4ded32c6a | 158 | if ((k == 30)&&(Gyro.PLC_Lern > 59)) Spi.DAC_B += 200; //после уменьшения максимальной амплитуды двигаем шевелем цап |
Kovalev_D | 162:44e4ded32c6a | 159 | else if((k == 1)&&(Gyro.PLC_Lern > 59)) {Spi.DAC_B -= 200; k=0;l=0;} //для быстрог поиска новог максимума. |
Kovalev_D | 160:6170df6f5a5c | 160 | if(k>0)k--; |
Kovalev_D | 160:6170df6f5a5c | 161 | |
Kovalev_D | 172:ef7bf1663645 | 162 | Gyro.PlC_MaxD=(unsigned int)(AD_MAX-PLC_In); //ищем разницу между желаемой и действительной амплитудами. |
Kovalev_D | 160:6170df6f5a5c | 163 | |
Kovalev_D | 157:1069c80f4944 | 164 | |
Kovalev_D | 171:d227a6045305 | 165 | if(Gyro.RgConA&0x8) { // если контур регулирования замкнут |
Kovalev_D | 157:1069c80f4944 | 166 | /* else if ( Gyro.PLC_Delta > (3500 * 65536)) {Spi.DAC_B += 2500; Gyro.PLC_Error2Mode = 5; Gyro.PLC_ADC_DOld = 0;} // проверка на двух модовость |
Kovalev_D | 157:1069c80f4944 | 167 | else if ( Gyro.PLC_Delta < (-3500 * 65536)) {Spi.DAC_B += 2500; Gyro.PLC_Error2Mode = 5; Gyro.PLC_ADC_DOld = 0;} // проверка на двух модовость*/ |
Kovalev_D | 157:1069c80f4944 | 168 | if ( Gyro.PLC_Error2Mode > 0) { Gyro.PLC_Error2Mode --; Gyro.PLC_ADC_DOld = 0;} // если ошибка(нахожление в двух модовом) |
Kovalev_D | 157:1069c80f4944 | 169 | else if ( Gyro.PLC_DeltaADD > 0) { Gyro.PLC_ADC_DOld = 1;} |
Kovalev_D | 157:1069c80f4944 | 170 | else if ( Gyro.PLC_DeltaADD < 0) { Gyro.PLC_ADC_DOld = -1;} |
Kovalev_D | 157:1069c80f4944 | 171 | else { Gyro.PLC_ADC_DOld = 1;} |
Kovalev_D | 157:1069c80f4944 | 172 | } |
Kovalev_D | 157:1069c80f4944 | 173 | else {Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0;} |
Kovalev_D | 157:1069c80f4944 | 174 | |
Kovalev_D | 168:f4a6abb18358 | 175 | if(Gyro.ModJump==1) { |
Kovalev_D | 168:f4a6abb18358 | 176 | Gyro.ModJump=0; |
Kovalev_D | 169:140743e3bb96 | 177 | Spi.DAC_B += 12500; |
Kovalev_D | 169:140743e3bb96 | 178 | Gyro.PLC_Error2Mode=4; |
Kovalev_D | 168:f4a6abb18358 | 179 | } |
Kovalev_D | 171:d227a6045305 | 180 | |
Kovalev_D | 168:f4a6abb18358 | 181 | if(Gyro.ModJump==2) { |
Kovalev_D | 168:f4a6abb18358 | 182 | Gyro.ModJump=0; |
Kovalev_D | 169:140743e3bb96 | 183 | Spi.DAC_B -= 12500; |
Kovalev_D | 169:140743e3bb96 | 184 | Gyro.PLC_Error2Mode=4; |
Kovalev_D | 168:f4a6abb18358 | 185 | } |
Kovalev_D | 171:d227a6045305 | 186 | if(Gyro.RgConA&0x8) { |
Kovalev_D | 172:ef7bf1663645 | 187 | if(Gyro.PlC_MaxD>(50<<17)) { // 3 режим регулирования |
Kovalev_D | 172:ef7bf1663645 | 188 | tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); |
Kovalev_D | 171:d227a6045305 | 189 | if(tempDac>600) tempDac=600; //ограничение на регулирование если очень большая разница амплитуд |
Kovalev_D | 171:d227a6045305 | 190 | Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; //новое значение в цап (±1 * значение регулировки) |
Kovalev_D | 171:d227a6045305 | 191 | tempDac = Gyro.PLC_ADC_DOld * tempDac; //используется только для выдачи |
Kovalev_D | 171:d227a6045305 | 192 | flagmod=3; |
Kovalev_D | 171:d227a6045305 | 193 | } |
Kovalev_D | 172:ef7bf1663645 | 194 | else if(Gyro.PlC_MaxD>(12<<17)) { // 2 режим регулирования |
Kovalev_D | 172:ef7bf1663645 | 195 | tempDac=(unsigned int)(Gyro.PlC_MaxD>>19); |
Kovalev_D | 171:d227a6045305 | 196 | Spi.DAC_B += Gyro.PLC_ADC_DOld * (tempDac); |
Kovalev_D | 171:d227a6045305 | 197 | tempDac = Gyro.PLC_ADC_DOld * (tempDac); //используется только для выдачи |
Kovalev_D | 171:d227a6045305 | 198 | flagmod=2; |
Kovalev_D | 171:d227a6045305 | 199 | } |
Kovalev_D | 172:ef7bf1663645 | 200 | else if(Gyro.PlC_MaxD<(2<<17)) { //режим если дельта равна 0;Gyro.ModJump |
Kovalev_D | 171:d227a6045305 | 201 | tempDac=2; |
Kovalev_D | 171:d227a6045305 | 202 | Spi.DAC_B += Gyro.PLC_ADC_DOld * tempDac; |
Kovalev_D | 171:d227a6045305 | 203 | flagmod=0; |
Kovalev_D | 171:d227a6045305 | 204 | } |
Kovalev_D | 171:d227a6045305 | 205 | else { |
Kovalev_D | 172:ef7bf1663645 | 206 | tempDac=(unsigned int)(Gyro.PlC_MaxD>>18); // 1 режим регулирования |
Kovalev_D | 171:d227a6045305 | 207 | Spi.DAC_B += Gyro.PLC_ADC_DOld *tempDac; |
Kovalev_D | 171:d227a6045305 | 208 | tempDac = Gyro.PLC_ADC_DOld * tempDac; |
Kovalev_D | 171:d227a6045305 | 209 | flagmod=1; |
Kovalev_D | 171:d227a6045305 | 210 | } |
Kovalev_D | 171:d227a6045305 | 211 | } |
Kovalev_D | 159:38f39c0c143f | 212 | /* |
Kovalev_D | 157:1069c80f4944 | 213 | if(flagmod==3) {k++; //если максимальный режим регулирования //инкрементируем счетчик большого понижения амплитуды |
Kovalev_D | 159:38f39c0c143f | 214 | if(k>100){k=0;AD_MAX -= 6107200;} //если счетчик бльше 50 //обнуляем счетчик //уменьшаем максимальную амплитуду. |
Kovalev_D | 157:1069c80f4944 | 215 | } |
Kovalev_D | 157:1069c80f4944 | 216 | else k=0; //если это не серия максимальных регулировок обнуляем счетчик. |
Kovalev_D | 157:1069c80f4944 | 217 | |
Kovalev_D | 159:38f39c0c143f | 218 | */ |
Kovalev_D | 157:1069c80f4944 | 219 | |
Kovalev_D | 159:38f39c0c143f | 220 | if ( Spi.DAC_B < 1000 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} //проверка на переваливание за границу. |
Kovalev_D | 157:1069c80f4944 | 221 | else if ( Spi.DAC_B > 63000 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} |
Kovalev_D | 157:1069c80f4944 | 222 | |
Kovalev_D | 153:7086895c6ee3 | 223 | |
Kovalev_D | 157:1069c80f4944 | 224 | |
Kovalev_D | 157:1069c80f4944 | 225 | /////////////////////// |
Kovalev_D | 157:1069c80f4944 | 226 | //////////лог////////// |
Kovalev_D | 157:1069c80f4944 | 227 | /////////////////////// |
Kovalev_D | 157:1069c80f4944 | 228 | if(Gyro.LogPLC==1) { |
Kovalev_D | 172:ef7bf1663645 | 229 | sprintf((Time),"%d %d %d %d %d %d %d %d %d %d\r\n", Spi.DAC_B, temp9, r, tempDac, flagmod, AD_MAX, PLC_In, Gyro.CuruAngle, Gyro.TermLM, (Gyro.Frq>>16) );//выдаем в терминал для постройки граффика регулировки периметра. |
Kovalev_D | 141:c6de20b9b483 | 230 | WriteCon(Time); |
Kovalev_D | 157:1069c80f4944 | 231 | } |
Kovalev_D | 157:1069c80f4944 | 232 | } |
Kovalev_D | 141:c6de20b9b483 | 233 | |
Kovalev_D | 141:c6de20b9b483 | 234 | |
Kovalev_D | 141:c6de20b9b483 | 235 | |
Kovalev_D | 141:c6de20b9b483 | 236 | |
Kovalev_D | 141:c6de20b9b483 | 237 | /* |
Kovalev_D | 157:1069c80f4944 | 238 | |
Kovalev_D | 116:66f1f0ff2dab | 239 | void PlcRegul(void) //Программа расчет напряжения для модулятора |
Kovalev_D | 116:66f1f0ff2dab | 240 | { |
Kovalev_D | 116:66f1f0ff2dab | 241 | int PLC_In; |
Kovalev_D | 116:66f1f0ff2dab | 242 | |
igor_v | 127:6a7472d67804 | 243 | |
igor_v | 127:6a7472d67804 | 244 | PLC_In = Gyro.AD_Slow; //выбираем даные для фильтрации |
Kovalev_D | 116:66f1f0ff2dab | 245 | // PLC_In = Gyro.AD_Fast; |
Kovalev_D | 128:1e4675a36c93 | 246 | //или+,или-(знак) |
Kovalev_D | 128:1e4675a36c93 | 247 | Gyro.PLC_Delta = PLC_In - Gyro.PLC_Old; // узнаем приращение |
Kovalev_D | 128:1e4675a36c93 | 248 | // (знак) * (то на что инкрементировали цап) |
Kovalev_D | 128:1e4675a36c93 | 249 | Gyro.PLC_DeltaADD = Gyro.PLC_Delta * Gyro.PLC_ADC_DOld; //приращение с учетом знака (и количества) прошлого приращения |
Kovalev_D | 128:1e4675a36c93 | 250 | Gyro.PLC_Old = PLC_In; // запоминание значения |
igor_v | 127:6a7472d67804 | 251 | |
Kovalev_D | 128:1e4675a36c93 | 252 | if(Gyro.RgConA&0x2) // если включон контур регулирования |
Kovalev_D | 157:1069c80f4944 | 253 | { |
Kovalev_D | 140:1fbf117fc120 | 254 | if (Gyro.PLC_Error2Mode > 0) {Gyro.PLC_Error2Mode --; Gyro.PLC_ADC_DOld = 0; } // если ошибка(нахожление в двух модовом) |
Kovalev_D | 128:1e4675a36c93 | 255 | else if ( Gyro.PLC_Delta > (3000 * 65536)) {Spi.DAC_B += 2500; Gyro.PLC_Error2Mode = 5; Gyro.PLC_ADC_DOld = 0;} // проверка на двух модовость |
Kovalev_D | 128:1e4675a36c93 | 256 | else if ( Gyro.PLC_Delta < (-3000 * 65536)) {Spi.DAC_B += 2500; Gyro.PLC_Error2Mode = 5; Gyro.PLC_ADC_DOld = 0;} |
Kovalev_D | 157:1069c80f4944 | 257 | |
Kovalev_D | 157:1069c80f4944 | 258 | else if (Gyro.PLC_DeltaADD > 0) |
igor_v | 127:6a7472d67804 | 259 | { |
Kovalev_D | 157:1069c80f4944 | 260 | |
Kovalev_D | 159:38f39c0c143f | 261 | // Gyro.PLC_ADC_DOld = (Gyro.PLC_DeltaADD /6553600 )+1; |
Kovalev_D | 128:1e4675a36c93 | 262 | Gyro.PLC_ADC_DOld = 1; |
igor_v | 127:6a7472d67804 | 263 | } |
Kovalev_D | 157:1069c80f4944 | 264 | else if (Gyro.PLC_DeltaADD < 0) |
igor_v | 127:6a7472d67804 | 265 | { |
igor_v | 127:6a7472d67804 | 266 | |
Kovalev_D | 128:1e4675a36c93 | 267 | // Gyro.PLC_ADC_DOld = (Gyro.PLC_DeltaADD /6553600 )-1; |
Kovalev_D | 128:1e4675a36c93 | 268 | Gyro.PLC_ADC_DOld = -1; |
igor_v | 127:6a7472d67804 | 269 | } |
igor_v | 127:6a7472d67804 | 270 | else |
igor_v | 127:6a7472d67804 | 271 | { |
Kovalev_D | 128:1e4675a36c93 | 272 | Gyro.PLC_ADC_DOld = 1; |
igor_v | 127:6a7472d67804 | 273 | } |
igor_v | 127:6a7472d67804 | 274 | } |
Kovalev_D | 157:1069c80f4944 | 275 | else |
igor_v | 127:6a7472d67804 | 276 | { |
Kovalev_D | 128:1e4675a36c93 | 277 | Gyro.PLC_Error2Mode = 1; Gyro.PLC_DeltaADD = 0; |
igor_v | 127:6a7472d67804 | 278 | } |
Kovalev_D | 157:1069c80f4944 | 279 | |
Kovalev_D | 157:1069c80f4944 | 280 | |
Kovalev_D | 141:c6de20b9b483 | 281 | Spi.DAC_B += Gyro.PLC_ADC_DOld * 16; |
Kovalev_D | 157:1069c80f4944 | 282 | |
Kovalev_D | 157:1069c80f4944 | 283 | |
Kovalev_D | 128:1e4675a36c93 | 284 | if ( Spi.DAC_B < 1000 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} |
Kovalev_D | 128:1e4675a36c93 | 285 | if ( Spi.DAC_B > 63000 ) {Spi.DAC_B = 32000; Gyro.PLC_Error2Mode = 5; Gyro.PLC_DeltaADD = 0;} |
Kovalev_D | 157:1069c80f4944 | 286 | |
Kovalev_D | 141:c6de20b9b483 | 287 | if(Gyro.LogPLC==1) |
Kovalev_D | 141:c6de20b9b483 | 288 | { |
Kovalev_D | 157:1069c80f4944 | 289 | sprintf((Time),"%d %d %d %d %d %d\r\n", Spi.DAC_B, temp9,flagmod, AD_MAX, Gyro.AD_Slow, k);//выдаем в терминал для постройки граффика регулировки периметра. |
Kovalev_D | 157:1069c80f4944 | 290 | WriteCon(Time); |
Kovalev_D | 141:c6de20b9b483 | 291 | } |
Kovalev_D | 157:1069c80f4944 | 292 | |
Kovalev_D | 128:1e4675a36c93 | 293 | } |
Kovalev_D | 116:66f1f0ff2dab | 294 | |
Kovalev_D | 116:66f1f0ff2dab | 295 | |
Kovalev_D | 141:c6de20b9b483 | 296 | */ |
Kovalev_D | 157:1069c80f4944 | 297 | void PlcRegul_old(void) // на всякий случай |
Kovalev_D | 112:4a96133a1311 | 298 | { |
Kovalev_D | 157:1069c80f4944 | 299 | int Delta; |
Kovalev_D | 157:1069c80f4944 | 300 | |
Kovalev_D | 157:1069c80f4944 | 301 | ADD_AMP+=Spi.ADC5; |
Kovalev_D | 157:1069c80f4944 | 302 | Count_AMP++; |
Kovalev_D | 157:1069c80f4944 | 303 | if(Count_AMP>=(32*32+8)) { |
Kovalev_D | 157:1069c80f4944 | 304 | Delta = ADD_AMP - Cur_Amp; |
Kovalev_D | 157:1069c80f4944 | 305 | |
Kovalev_D | 157:1069c80f4944 | 306 | if(Gyro.RgConA&0x2) { |
Kovalev_D | 157:1069c80f4944 | 307 | if (Znak_Amp > 1) { |
Kovalev_D | 157:1069c80f4944 | 308 | Znak_Amp --; |
Kovalev_D | 157:1069c80f4944 | 309 | } else if ( Delta > 30000000 ) { |
Kovalev_D | 157:1069c80f4944 | 310 | AD_Regul += 5000000; |
Kovalev_D | 157:1069c80f4944 | 311 | Znak_Amp = 5; |
Kovalev_D | 157:1069c80f4944 | 312 | } else if ( Delta < (-3000000)) { |
Kovalev_D | 157:1069c80f4944 | 313 | AD_Regul += 5000000; |
Kovalev_D | 157:1069c80f4944 | 314 | Znak_Amp = 5; |
Kovalev_D | 157:1069c80f4944 | 315 | } else if ((Delta * Znak_Amp) > 0) { |
Kovalev_D | 157:1069c80f4944 | 316 | Znak_Amp = 1; |
Kovalev_D | 157:1069c80f4944 | 317 | AD_Regul -= (Delta * Znak_Amp * 10); |
Kovalev_D | 157:1069c80f4944 | 318 | } else { |
Kovalev_D | 157:1069c80f4944 | 319 | Znak_Amp = -1; |
Kovalev_D | 157:1069c80f4944 | 320 | AD_Regul -= (Delta * Znak_Amp * 10); |
Kovalev_D | 157:1069c80f4944 | 321 | } |
Kovalev_D | 157:1069c80f4944 | 322 | |
Kovalev_D | 157:1069c80f4944 | 323 | Spi.DAC_B = (AD_Regul + 0x1fffffff)/65536; |
Kovalev_D | 157:1069c80f4944 | 324 | } |
Kovalev_D | 157:1069c80f4944 | 325 | Cur_Amp=ADD_AMP; |
Kovalev_D | 157:1069c80f4944 | 326 | Count_AMP=0; |
Kovalev_D | 157:1069c80f4944 | 327 | ADD_AMP=0; |
Kovalev_D | 157:1069c80f4944 | 328 | } |
Kovalev_D | 157:1069c80f4944 | 329 | |
igor_v | 110:6406b7ac0442 | 330 | } |
igor_v | 110:6406b7ac0442 | 331 | |
igor_v | 110:6406b7ac0442 | 332 | |
Kovalev_D | 116:66f1f0ff2dab | 333 | |
Kovalev_D | 116:66f1f0ff2dab | 334 | |
Kovalev_D | 112:4a96133a1311 | 335 | void DAC_OutPut(void)//выдача в цапы |
igor_v | 0:8ad47e2b6f00 | 336 | { |
Kovalev_D | 157:1069c80f4944 | 337 | LPC_SSP0->DR=0x5555; |
igor_v | 29:c783288001b5 | 338 | LPC_SSP0->DR=0x5555; |
igor_v | 29:c783288001b5 | 339 | LPC_SSP0->DR=0x5555; |
igor_v | 0:8ad47e2b6f00 | 340 | |
igor_v | 110:6406b7ac0442 | 341 | if (CountV31 & 1) { //если нечетный такт то |
igor_v | 29:c783288001b5 | 342 | LPC_SSP0->DR = WRITE_DAC0; //e.команда для ЦАП_0 передавать. |
igor_v | 29:c783288001b5 | 343 | LPC_SSP0->DR = (Spi.DAC_A); //e. передача 12 бит |
Kovalev_D | 157:1069c80f4944 | 344 | } else { //если такт четный. |
Kovalev_D | 157:1069c80f4944 | 345 | LPC_SSP0->DR = WRITE_DAC1 ; //e.команда для ЦАП_1 передавать. |
Kovalev_D | 157:1069c80f4944 | 346 | |
Kovalev_D | 157:1069c80f4944 | 347 | switch( Gyro.StrayPLC_flag) { |
Kovalev_D | 157:1069c80f4944 | 348 | |
Kovalev_D | 157:1069c80f4944 | 349 | case 0://режим без воздействия |
Kovalev_D | 157:1069c80f4944 | 350 | LPC_SSP0->DR = (Spi.DAC_B); |
Kovalev_D | 157:1069c80f4944 | 351 | temp9=Spi.DAC_B; |
Kovalev_D | 157:1069c80f4944 | 352 | break; |
Kovalev_D | 157:1069c80f4944 | 353 | |
Kovalev_D | 157:1069c80f4944 | 354 | case 1://малое воздействие + |
Kovalev_D | 157:1069c80f4944 | 355 | temp9=Spi.DAC_B + Gyro.StrayPLC_Pls; |
Kovalev_D | 157:1069c80f4944 | 356 | LPC_SSP0->DR = temp9; |
Kovalev_D | 157:1069c80f4944 | 357 | break; |
Kovalev_D | 157:1069c80f4944 | 358 | |
Kovalev_D | 157:1069c80f4944 | 359 | case 3://малое воздействие - |
Kovalev_D | 157:1069c80f4944 | 360 | temp9=Spi.DAC_B + Gyro.StrayPLC_Mns; |
Kovalev_D | 157:1069c80f4944 | 361 | LPC_SSP0->DR = temp9; |
Kovalev_D | 157:1069c80f4944 | 362 | break; |
Kovalev_D | 157:1069c80f4944 | 363 | |
Kovalev_D | 157:1069c80f4944 | 364 | case 2://большое воздействие + |
Kovalev_D | 157:1069c80f4944 | 365 | temp9=Spi.DAC_B + Gyro.StrayPLC_2Mode; |
Kovalev_D | 157:1069c80f4944 | 366 | LPC_SSP0->DR = temp9;//вгоняем в многомодовый режим |
Kovalev_D | 157:1069c80f4944 | 367 | break; |
Kovalev_D | 157:1069c80f4944 | 368 | |
Kovalev_D | 157:1069c80f4944 | 369 | } |
Kovalev_D | 157:1069c80f4944 | 370 | // LPC_SSP0->DR = Spi.DAC_B; //e. передача 12 бит |
Kovalev_D | 157:1069c80f4944 | 371 | |
igor_v | 29:c783288001b5 | 372 | } |
Kovalev_D | 112:4a96133a1311 | 373 | } |
Kovalev_D | 112:4a96133a1311 | 374 | |
Kovalev_D | 112:4a96133a1311 | 375 | |
Kovalev_D | 113:8be429494918 | 376 | |
Kovalev_D | 113:8be429494918 | 377 | |
Kovalev_D | 113:8be429494918 | 378 | |
Kovalev_D | 113:8be429494918 | 379 | |
Kovalev_D | 113:8be429494918 | 380 | |
Kovalev_D | 113:8be429494918 | 381 | |
Kovalev_D | 113:8be429494918 | 382 | |
Kovalev_D | 113:8be429494918 | 383 | |
Kovalev_D | 113:8be429494918 | 384 | |
Kovalev_D | 113:8be429494918 | 385 | |
Kovalev_D | 113:8be429494918 | 386 | |
Kovalev_D | 113:8be429494918 | 387 | |
Kovalev_D | 113:8be429494918 | 388 | |
Kovalev_D | 113:8be429494918 | 389 | |
Kovalev_D | 113:8be429494918 | 390 | |
Kovalev_D | 113:8be429494918 | 391 | |
Kovalev_D | 113:8be429494918 | 392 | |
Kovalev_D | 113:8be429494918 | 393 | |
Kovalev_D | 113:8be429494918 | 394 | |
Kovalev_D | 113:8be429494918 | 395 | |
Kovalev_D | 113:8be429494918 | 396 | |
Kovalev_D | 113:8be429494918 | 397 | |
Kovalev_D | 113:8be429494918 | 398 | |
Kovalev_D | 113:8be429494918 | 399 | |
Kovalev_D | 113:8be429494918 | 400 | |
Kovalev_D | 113:8be429494918 | 401 | |
Kovalev_D | 113:8be429494918 | 402 | |
Kovalev_D | 113:8be429494918 | 403 | |
Kovalev_D | 113:8be429494918 | 404 | /* |
Kovalev_D | 112:4a96133a1311 | 405 | void SPI_Exchange(void) |
Kovalev_D | 112:4a96133a1311 | 406 | { |
Kovalev_D | 112:4a96133a1311 | 407 | unsigned int DummySPI; |
Kovalev_D | 157:1069c80f4944 | 408 | |
Kovalev_D | 112:4a96133a1311 | 409 | |
Kovalev_D | 112:4a96133a1311 | 410 | Spi.ADC5 = LPC_SSP0->DR; |
Kovalev_D | 112:4a96133a1311 | 411 | Spi.ADC4 = LPC_SSP0->DR; |
Kovalev_D | 112:4a96133a1311 | 412 | Spi.ADC3 = LPC_SSP0->DR; |
Kovalev_D | 112:4a96133a1311 | 413 | Spi.ADC2 = LPC_SSP0->DR; |
Kovalev_D | 112:4a96133a1311 | 414 | Spi.ADC1 = LPC_SSP0->DR; |
Kovalev_D | 112:4a96133a1311 | 415 | |
Kovalev_D | 112:4a96133a1311 | 416 | Input.ArrayIn[2]= Spi.ADC5; |
Kovalev_D | 157:1069c80f4944 | 417 | |
Kovalev_D | 112:4a96133a1311 | 418 | DAC_OutPut(); |
igor_v | 0:8ad47e2b6f00 | 419 | |
Kovalev_D | 99:3d8f206ceac2 | 420 | // LPC_DAC->CR = (((SinPLC[CountV64]*35/5)+24300));// модулятор |
Kovalev_D | 112:4a96133a1311 | 421 | |
Kovalev_D | 89:a0d344db227e | 422 | while (LPC_SSP0->SR & RX_SSP_notEMPT) //если буфер SPI не пуст. |
Kovalev_D | 89:a0d344db227e | 423 | DummySPI = LPC_SSP0->DR; //очистить буфер. |
igor_v | 29:c783288001b5 | 424 | |
Kovalev_D | 112:4a96133a1311 | 425 | //заполнение буферов еденичных значений АЦП. |
Kovalev_D | 157:1069c80f4944 | 426 | Buff_ADC_1 [CountV31] = Spi.ADC1; |
Kovalev_D | 112:4a96133a1311 | 427 | Buff_ADC_2 [CountV31] = Spi.ADC2; |
Kovalev_D | 112:4a96133a1311 | 428 | Buff_ADC_3 [CountV31] = Spi.ADC3; |
Kovalev_D | 112:4a96133a1311 | 429 | Buff_ADC_4 [CountV31] = Spi.ADC4; |
Kovalev_D | 95:dd51e577e114 | 430 | Buff_ADC_5 [CountV255] = Spi.ADC5; // ампл ацп. |
igor_v | 110:6406b7ac0442 | 431 | |
Kovalev_D | 157:1069c80f4944 | 432 | |
igor_v | 110:6406b7ac0442 | 433 | Temp_AMP64P += Buff_ADC_5[CountV255]; |
Kovalev_D | 96:1c8536458119 | 434 | Temp_AMP64P -= Buff_ADC_5[(CountV255-64) & 0xff]; // заполнение буфера накопленых приращений за 8 тактов |
Kovalev_D | 96:1c8536458119 | 435 | Buff_AMP64P[CountV255] = (unsigned int) (Temp_AMP64P); |
Kovalev_D | 96:1c8536458119 | 436 | |
igor_v | 29:c783288001b5 | 437 | |
Kovalev_D | 47:d902ef6f7564 | 438 | Temp_ADC_2 += Buff_ADC_2[CountV31]; |
Kovalev_D | 47:d902ef6f7564 | 439 | Temp_ADC_2 -= Buff_ADC_2[(CountV31-32) & 0xff]; |
igor_v | 29:c783288001b5 | 440 | |
Kovalev_D | 47:d902ef6f7564 | 441 | Temp_ADC_3 += Buff_ADC_3[CountV31]; |
Kovalev_D | 95:dd51e577e114 | 442 | Temp_ADC_3 -= Buff_ADC_3[(CountV31-32) & 0xff]; |
igor_v | 29:c783288001b5 | 443 | |
Kovalev_D | 47:d902ef6f7564 | 444 | Temp_ADC_4 += Buff_ADC_4[CountV31]; |
Kovalev_D | 47:d902ef6f7564 | 445 | Temp_ADC_4 -= Buff_ADC_4[(CountV31-32) & 0xff]; |
igor_v | 29:c783288001b5 | 446 | |
igor_v | 29:c783288001b5 | 447 | Temp_ADC_5 += Buff_ADC_1[CountV255]; |
igor_v | 29:c783288001b5 | 448 | Temp_ADC_5 -= Buff_ADC_1[(CountV255-32) & 0xff]; |
Kovalev_D | 112:4a96133a1311 | 449 | Spi.PLC_NewData=1; |
Kovalev_D | 113:8be429494918 | 450 | }*/ |