test
Dependencies: ad5422_arduino mbed LT1446 ADS1248-1 LM35-1 Flash FT813 PGA280_ADS1259
main.cpp@5:21240fa1ee4c, 2020-08-13 (annotated)
- Committer:
- nikmaos
- Date:
- Thu Aug 13 14:37:39 2020 +0000
- Revision:
- 5:21240fa1ee4c
- Parent:
- 4:d53895f65eb7
- Child:
- 6:cfe7cb0bdb1a
13.08
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vitlog | 0:98fcc06c66bf | 1 | #include "PerifConfig.h" |
vitlog | 0:98fcc06c66bf | 2 | #include "PGA280.h" |
vitlog | 0:98fcc06c66bf | 3 | #include "ADS1259.h" |
vitlog | 0:98fcc06c66bf | 4 | #include "PGA280ADS1259.h" |
vitlog | 0:98fcc06c66bf | 5 | #include "main.h" |
vitlog | 1:5d28312892aa | 6 | #include "ad5422_arduino.h" |
vitlog | 1:5d28312892aa | 7 | #include "lm35.h" |
vitlog | 1:5d28312892aa | 8 | #include "LT1446.h" |
nikmaos | 3:d4b106bf3a32 | 9 | #include "ads1248.h" |
nikmaos | 3:d4b106bf3a32 | 10 | #include "flashwrapper.h" |
nikmaos | 3:d4b106bf3a32 | 11 | #include <cmath> |
nikmaos | 3:d4b106bf3a32 | 12 | #include "FT_Platform.h" |
nikmaos | 3:d4b106bf3a32 | 13 | #include "display.h" |
vitlog | 1:5d28312892aa | 14 | |
nikmaos | 3:d4b106bf3a32 | 15 | //коэффициенты по умолчанию температура колонки |
nikmaos | 3:d4b106bf3a32 | 16 | #define E_PCOEFF 0.5F //Пропорциональный коэффициент ПИД регулятора (Из EEPROM) |
nikmaos | 3:d4b106bf3a32 | 17 | #define E_ICOEFF 1500.0F //Постоянная времени интегрирования ПИД регулятора в секундах (Из EEPROM) (был 3000) |
nikmaos | 3:d4b106bf3a32 | 18 | #define E_DCOEFF 0.1F |
nikmaos | 3:d4b106bf3a32 | 19 | #define PID_SAMPLE_TIME 0.25F //Период ПИД |
nikmaos | 3:d4b106bf3a32 | 20 | // --//-- расхода |
nikmaos | 3:d4b106bf3a32 | 21 | #define R_PCOEFF 0.11F //Пропорциональный коэффициент ПИД регулятора (Из EEPROM) |
nikmaos | 3:d4b106bf3a32 | 22 | #define R_ICOEFF 3000.0F //Постоянная времени интегрирования ПИД регулятора в секундах (Из EEPROM) (был 3000) |
nikmaos | 3:d4b106bf3a32 | 23 | #define R_DCOEFF 0.1F |
nikmaos | 3:d4b106bf3a32 | 24 | #define R_PID_SAMPLE_TIME 0.25F |
vitlog | 1:5d28312892aa | 25 | |
nikmaos | 3:d4b106bf3a32 | 26 | #define CHKD (0x43484B44) //константа для проверки записанных данных (необходима контрольная сумма) |
vitlog | 1:5d28312892aa | 27 | #define TEMP 35 |
vitlog | 1:5d28312892aa | 28 | |
vitlog | 0:98fcc06c66bf | 29 | |
vitlog | 0:98fcc06c66bf | 30 | /*Таймер для вызова функции каждые 40 мс*/ |
vitlog | 1:5d28312892aa | 31 | Ticker lm_temp; |
vitlog | 0:98fcc06c66bf | 32 | Ticker adctask; |
nikmaos | 3:d4b106bf3a32 | 33 | Ticker PID1; //ПИД для нагрева колонки |
nikmaos | 3:d4b106bf3a32 | 34 | Ticker PID2; //ПИД для расхода |
vitlog | 0:98fcc06c66bf | 35 | /*Конец*/ |
nikmaos | 3:d4b106bf3a32 | 36 | //InterruptIn button(USER_BUTTON); |
nikmaos | 3:d4b106bf3a32 | 37 | InterruptIn ADSRdy(PG_3); |
vitlog | 0:98fcc06c66bf | 38 | |
nikmaos | 4:d53895f65eb7 | 39 | //настройка SPI для дисплея |
nikmaos | 4:d53895f65eb7 | 40 | FT813 TFT (D11, D12, D13, D10, D9, D8); //mosi, miso, sck, ss, int, pd |
nikmaos | 3:d4b106bf3a32 | 41 | Display disp(&TFT); |
nikmaos | 3:d4b106bf3a32 | 42 | //конец |
nikmaos | 3:d4b106bf3a32 | 43 | |
nikmaos | 3:d4b106bf3a32 | 44 | ADS1248_t ads1;//экземпляр ЦАП 1446 в памяти |
nikmaos | 3:d4b106bf3a32 | 45 | LM35_t RAS; |
nikmaos | 3:d4b106bf3a32 | 46 | PID_prom_t TempCol; |
nikmaos | 3:d4b106bf3a32 | 47 | PID_prom_t Rashod; |
nikmaos | 3:d4b106bf3a32 | 48 | PID_defs_t PID_defs={E_PCOEFF,E_ICOEFF,E_DCOEFF,PID_SAMPLE_TIME}; |
nikmaos | 3:d4b106bf3a32 | 49 | PID_defs_t PID_R_defs={R_PCOEFF,R_ICOEFF,R_DCOEFF,R_PID_SAMPLE_TIME}; |
nikmaos | 3:d4b106bf3a32 | 50 | volatile uint8_t temp=0;// уставка температуры колонки |
nikmaos | 3:d4b106bf3a32 | 51 | volatile float rashod_u=0; //уставка расхода |
vitlog | 0:98fcc06c66bf | 52 | char mbflag; |
vitlog | 0:98fcc06c66bf | 53 | unsigned char pga280gain; |
vitlog | 0:98fcc06c66bf | 54 | char UComandFlag; |
vitlog | 0:98fcc06c66bf | 55 | volatile unsigned char UComand; |
vitlog | 0:98fcc06c66bf | 56 | volatile long tempdata=0; |
nikmaos | 3:d4b106bf3a32 | 57 | char ch=0; //адрес на плате ТЭД-2 = 6 |
vitlog | 0:98fcc06c66bf | 58 | float x=0; |
vitlog | 0:98fcc06c66bf | 59 | float k; |
vitlog | 0:98fcc06c66bf | 60 | unsigned char str[]; |
vitlog | 0:98fcc06c66bf | 61 | |
nikmaos | 3:d4b106bf3a32 | 62 | //указатель для подстановки нужной функции |
nikmaos | 3:d4b106bf3a32 | 63 | void (*printer_p)(void); |
vitlog | 0:98fcc06c66bf | 64 | |
vitlog | 0:98fcc06c66bf | 65 | //функция чтения АДС для выполнения в задаче |
vitlog | 0:98fcc06c66bf | 66 | void readADC() |
vitlog | 0:98fcc06c66bf | 67 | { |
vitlog | 0:98fcc06c66bf | 68 | tempdata=ads1259_readData(5); //функция может зависать (надо избавиться от бесконечного цикла) |
vitlog | 0:98fcc06c66bf | 69 | x=NormADC(tempdata); |
vitlog | 1:5d28312892aa | 70 | UART.printf("%08f\r\n",x); |
vitlog | 0:98fcc06c66bf | 71 | } |
vitlog | 0:98fcc06c66bf | 72 | |
vitlog | 1:5d28312892aa | 73 | void readtemp() |
vitlog | 1:5d28312892aa | 74 | { |
vitlog | 1:5d28312892aa | 75 | float t; |
vitlog | 1:5d28312892aa | 76 | /*Обработка ошибки*/ |
nikmaos | 3:d4b106bf3a32 | 77 | //LM35_start(0.25); |
nikmaos | 3:d4b106bf3a32 | 78 | if(ads1.MUX0.MUX_SP!=0) |
nikmaos | 3:d4b106bf3a32 | 79 | { |
nikmaos | 3:d4b106bf3a32 | 80 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 81 | ADS1248WakeupCommand(); |
nikmaos | 3:d4b106bf3a32 | 82 | ads1.MUX0.MUX_SN=1; //AIN1 |
nikmaos | 3:d4b106bf3a32 | 83 | ads1.MUX0.MUX_SP=0; //AIN0 |
nikmaos | 3:d4b106bf3a32 | 84 | ads1.VBIAS.all=0; |
nikmaos | 3:d4b106bf3a32 | 85 | ADS1248SettingReg(&ads1); |
nikmaos | 3:d4b106bf3a32 | 86 | } |
nikmaos | 3:d4b106bf3a32 | 87 | |
vitlog | 1:5d28312892aa | 88 | if (LM35_0.ready) //если данные готовы то считать и сбросить флаг (способ многозадачности) |
vitlog | 1:5d28312892aa | 89 | { |
vitlog | 1:5d28312892aa | 90 | LM35_0.ready=0; |
nikmaos | 3:d4b106bf3a32 | 91 | t=LM35_0.temp; |
nikmaos | 3:d4b106bf3a32 | 92 | TempCol.Error=temp-t; |
nikmaos | 3:d4b106bf3a32 | 93 | TempCol.Integral += TempCol.Error; |
nikmaos | 3:d4b106bf3a32 | 94 | TempCol.dError = TempCol.Error - TempCol.last_Error; |
nikmaos | 3:d4b106bf3a32 | 95 | TempCol.last_Error = TempCol.Error; |
vitlog | 1:5d28312892aa | 96 | //временно записать в калиброванное значение (нельзя так делать) |
nikmaos | 3:d4b106bf3a32 | 97 | LT1446_0.dacB.Code=(uint16_t)(PID(&Mem.PID,&TempCol) * 4095); |
nikmaos | 3:d4b106bf3a32 | 98 | LTCwrite(<1446_0); |
vitlog | 1:5d28312892aa | 99 | } |
vitlog | 1:5d28312892aa | 100 | |
vitlog | 1:5d28312892aa | 101 | } |
nikmaos | 3:d4b106bf3a32 | 102 | |
nikmaos | 3:d4b106bf3a32 | 103 | void readRashod() |
vitlog | 1:5d28312892aa | 104 | { |
nikmaos | 3:d4b106bf3a32 | 105 | float r; |
nikmaos | 3:d4b106bf3a32 | 106 | //Если не настроен, то настраиваем нужный канал чтения |
nikmaos | 3:d4b106bf3a32 | 107 | if(ads1.MUX0.MUX_SP!=2) |
vitlog | 1:5d28312892aa | 108 | { |
nikmaos | 3:d4b106bf3a32 | 109 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 110 | ADS1248WakeupCommand(); |
nikmaos | 3:d4b106bf3a32 | 111 | ads1.MUX0.MUX_SN=3; //AIN3 |
nikmaos | 3:d4b106bf3a32 | 112 | ads1.MUX0.MUX_SP=2; //AIN2 |
nikmaos | 3:d4b106bf3a32 | 113 | ads1.VBIAS.VBIAS3=1; |
nikmaos | 3:d4b106bf3a32 | 114 | ADS1248SettingReg(&ads1); |
nikmaos | 3:d4b106bf3a32 | 115 | } |
nikmaos | 3:d4b106bf3a32 | 116 | //используем тот же тип из-за схожести |
nikmaos | 3:d4b106bf3a32 | 117 | if(RAS.ready)//Если данные готовы для считывания.. |
nikmaos | 3:d4b106bf3a32 | 118 | {RAS.ready=0; |
nikmaos | 3:d4b106bf3a32 | 119 | r=RAS.temp; |
nikmaos | 3:d4b106bf3a32 | 120 | Rashod.Error=rashod_u-r; |
nikmaos | 3:d4b106bf3a32 | 121 | Rashod.Integral += Rashod.Error;// |
nikmaos | 3:d4b106bf3a32 | 122 | Rashod.dError = Rashod.Error - Rashod.last_Error; |
nikmaos | 3:d4b106bf3a32 | 123 | Rashod.last_Error = Rashod.Error; |
nikmaos | 3:d4b106bf3a32 | 124 | LT1446_0.dacA.Code=(uint16_t)(PID(&Mem.PID_R,&Rashod) * 4095); |
nikmaos | 3:d4b106bf3a32 | 125 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 126 | //Pressure.write(PID(&Mem.PID_R,&Rashod)); |
nikmaos | 3:d4b106bf3a32 | 127 | } |
nikmaos | 3:d4b106bf3a32 | 128 | } |
nikmaos | 3:d4b106bf3a32 | 129 | |
nikmaos | 3:d4b106bf3a32 | 130 | void printtemp() |
nikmaos | 3:d4b106bf3a32 | 131 | //отобразить температуру 1 раз |
nikmaos | 3:d4b106bf3a32 | 132 | { |
nikmaos | 3:d4b106bf3a32 | 133 | if (LM35_0.ready||RAS.ready) //если данные готовы то считать |
nikmaos | 3:d4b106bf3a32 | 134 | { |
nikmaos | 3:d4b106bf3a32 | 135 | UART.printf("TempCol %0.2f\t|\tRashod %0.4f ml (%0.4fV)\r\n",LM35_0.temp,RAS.temp,RAS.volts); |
vitlog | 1:5d28312892aa | 136 | } |
vitlog | 1:5d28312892aa | 137 | |
vitlog | 1:5d28312892aa | 138 | } |
vitlog | 0:98fcc06c66bf | 139 | |
nikmaos | 3:d4b106bf3a32 | 140 | void printPID() |
nikmaos | 3:d4b106bf3a32 | 141 | { |
nikmaos | 3:d4b106bf3a32 | 142 | /*функция отобображает в терминале значения не в момент расчёта ПИДа, |
nikmaos | 3:d4b106bf3a32 | 143 | но этого по идее достаточно для оценки результата работы, |
nikmaos | 3:d4b106bf3a32 | 144 | так как отображаются последние записанные в переменную данные*/ |
nikmaos | 3:d4b106bf3a32 | 145 | if ((Mem.PID.enabled==1)&&(Mem.PID_R.enabled==0)) //Если включен только первый ПИД |
nikmaos | 3:d4b106bf3a32 | 146 | { |
nikmaos | 3:d4b106bf3a32 | 147 | UART.printf("PID_t: Power %04d temp %0.2f\r\n",LT1446_0.dacB.Code,LM35_0.temp); |
nikmaos | 3:d4b106bf3a32 | 148 | } |
nikmaos | 3:d4b106bf3a32 | 149 | else if ((Mem.PID_R.enabled==1)&&(Mem.PID.enabled==0)) //Если включен только второй ПИД |
nikmaos | 3:d4b106bf3a32 | 150 | { |
nikmaos | 3:d4b106bf3a32 | 151 | UART.printf("PID_R: Power %04d rashod %0.4f ml (%0.4fV)\r\n",LT1446_0.dacA.Code,RAS.temp,RAS.volts); |
nikmaos | 3:d4b106bf3a32 | 152 | } |
nikmaos | 3:d4b106bf3a32 | 153 | else if ((Mem.PID_R.enabled==1)&&(Mem.PID.enabled==1)) //Если включены оба ПИД |
nikmaos | 3:d4b106bf3a32 | 154 | { |
nikmaos | 3:d4b106bf3a32 | 155 | UART.printf("PID_t: Power %04d temp %0.2f | ",LT1446_0.dacB.Code,LM35_0.temp); |
nikmaos | 3:d4b106bf3a32 | 156 | UART.printf("PID_R: Power %04d rashod %0.4f ml (%0.4fV)\r\n",LT1446_0.dacA.Code,RAS.temp,RAS.volts); |
nikmaos | 3:d4b106bf3a32 | 157 | } |
nikmaos | 3:d4b106bf3a32 | 158 | } |
nikmaos | 3:d4b106bf3a32 | 159 | |
vitlog | 0:98fcc06c66bf | 160 | float inline NormADC(long data) |
vitlog | 0:98fcc06c66bf | 161 | { |
vitlog | 0:98fcc06c66bf | 162 | x=data*2.5/0x800000; |
vitlog | 0:98fcc06c66bf | 163 | //x=x*8/(1<<pga280gain); |
vitlog | 0:98fcc06c66bf | 164 | return x; |
vitlog | 0:98fcc06c66bf | 165 | } |
vitlog | 0:98fcc06c66bf | 166 | |
nikmaos | 3:d4b106bf3a32 | 167 | |
nikmaos | 3:d4b106bf3a32 | 168 | /*Собственно сам расчёт ПИД. В аргумент подставляется |
nikmaos | 3:d4b106bf3a32 | 169 | конкретный ПИД (температура или расход) и его промежуточные значения (вклады)*/ |
nikmaos | 3:d4b106bf3a32 | 170 | float PID (PID_t *pidx, PID_prom_t *prom) |
nikmaos | 3:d4b106bf3a32 | 171 | { |
nikmaos | 3:d4b106bf3a32 | 172 | float P = pidx->kP * prom->Error; |
nikmaos | 3:d4b106bf3a32 | 173 | float I = pidx->kP / pidx->kI * pidx->sampleTime * prom->Integral; |
nikmaos | 3:d4b106bf3a32 | 174 | float D = pidx->kP * pidx->kD / pidx->sampleTime * prom->dError; |
nikmaos | 3:d4b106bf3a32 | 175 | float control = P + I + D; |
nikmaos | 3:d4b106bf3a32 | 176 | if (control > 1.0) return 1.0; |
nikmaos | 3:d4b106bf3a32 | 177 | if (control < 0.0) return 0.0; |
nikmaos | 3:d4b106bf3a32 | 178 | return control; |
nikmaos | 3:d4b106bf3a32 | 179 | } |
nikmaos | 3:d4b106bf3a32 | 180 | |
nikmaos | 3:d4b106bf3a32 | 181 | //включить пид1 |
nikmaos | 3:d4b106bf3a32 | 182 | void pressed() |
nikmaos | 3:d4b106bf3a32 | 183 | { |
nikmaos | 3:d4b106bf3a32 | 184 | /*Включить АЦП*/ |
nikmaos | 3:d4b106bf3a32 | 185 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 186 | ADS1248WakeupCommand(); |
nikmaos | 3:d4b106bf3a32 | 187 | /*Выключить постоянное оторажение температуры*/ |
nikmaos | 3:d4b106bf3a32 | 188 | |
nikmaos | 3:d4b106bf3a32 | 189 | //запустить ПИД |
nikmaos | 3:d4b106bf3a32 | 190 | PID1.attach(&readtemp,0.25); |
nikmaos | 3:d4b106bf3a32 | 191 | Mem.PID.enabled=1; |
nikmaos | 3:d4b106bf3a32 | 192 | UART.printf("PID is ON\r\n"); |
nikmaos | 3:d4b106bf3a32 | 193 | } |
nikmaos | 3:d4b106bf3a32 | 194 | |
nikmaos | 3:d4b106bf3a32 | 195 | //включить пид2 |
nikmaos | 3:d4b106bf3a32 | 196 | void pid2_start() |
nikmaos | 3:d4b106bf3a32 | 197 | { |
nikmaos | 3:d4b106bf3a32 | 198 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 199 | ADS1248WakeupCommand(); |
nikmaos | 3:d4b106bf3a32 | 200 | PID2.attach(&readRashod,0.25); |
nikmaos | 3:d4b106bf3a32 | 201 | Mem.PID_R.enabled=1; |
nikmaos | 3:d4b106bf3a32 | 202 | UART.printf("PID_R is ON\r\n"); |
nikmaos | 3:d4b106bf3a32 | 203 | } |
nikmaos | 3:d4b106bf3a32 | 204 | |
nikmaos | 3:d4b106bf3a32 | 205 | void readads() |
nikmaos | 3:d4b106bf3a32 | 206 | /*чтение АЦП в режиме |
nikmaos | 3:d4b106bf3a32 | 207 | -только первый канал |
nikmaos | 3:d4b106bf3a32 | 208 | -только второй канал |
nikmaos | 3:d4b106bf3a32 | 209 | -оба канала |
nikmaos | 3:d4b106bf3a32 | 210 | или как вариант: позиция бита означает какие каналы считываются если их больше чем 2*/ |
nikmaos | 3:d4b106bf3a32 | 211 | { |
nikmaos | 3:d4b106bf3a32 | 212 | double v=0; |
nikmaos | 3:d4b106bf3a32 | 213 | v=2.048*ADS1248ReadData(&ads1)/0x800000; |
nikmaos | 3:d4b106bf3a32 | 214 | if(ads1.MUX0.MUX_SP==0) |
nikmaos | 3:d4b106bf3a32 | 215 | { |
nikmaos | 3:d4b106bf3a32 | 216 | LM35_0.temp=v*100; |
nikmaos | 3:d4b106bf3a32 | 217 | LM35_0.ready=1; |
nikmaos | 3:d4b106bf3a32 | 218 | } |
nikmaos | 3:d4b106bf3a32 | 219 | if (ads1.MUX0.MUX_SP==2) |
nikmaos | 3:d4b106bf3a32 | 220 | { |
nikmaos | 3:d4b106bf3a32 | 221 | RAS.volts=v; |
nikmaos | 3:d4b106bf3a32 | 222 | RAS.temp=v*26.316-0.263;// мл/мин (сделать уставку) |
nikmaos | 3:d4b106bf3a32 | 223 | RAS.ready=1; |
nikmaos | 3:d4b106bf3a32 | 224 | } |
nikmaos | 3:d4b106bf3a32 | 225 | |
nikmaos | 3:d4b106bf3a32 | 226 | } |
nikmaos | 3:d4b106bf3a32 | 227 | |
nikmaos | 3:d4b106bf3a32 | 228 | void Mem_write() |
nikmaos | 3:d4b106bf3a32 | 229 | { |
nikmaos | 3:d4b106bf3a32 | 230 | flashWrite(0,Mem.w,(sizeof(Mem.w)/sizeof(uint32_t))); |
nikmaos | 3:d4b106bf3a32 | 231 | } |
nikmaos | 3:d4b106bf3a32 | 232 | |
nikmaos | 3:d4b106bf3a32 | 233 | float BufToFloat(unsigned char *buf) |
nikmaos | 3:d4b106bf3a32 | 234 | /*Преобразование строки из 16 символов в float*/ |
nikmaos | 4:d53895f65eb7 | 235 | /*Нельзя первым символом вводить точку, перед неей обязательно нужна цифра |
nikmaos | 4:d53895f65eb7 | 236 | Числа вводятся в формате 1.0 или 1,0 (точка обяательна даже если дробной части нет)*/ |
nikmaos | 4:d53895f65eb7 | 237 | { |
nikmaos | 4:d53895f65eb7 | 238 | int8_t n=-1; //начало (при старте его нет) |
nikmaos | 3:d4b106bf3a32 | 239 | uint8_t i=0; |
nikmaos | 4:d53895f65eb7 | 240 | int8_t j=-1; //счётчик символов до точки |
nikmaos | 3:d4b106bf3a32 | 241 | uint8_t p=0; //позиция точки |
nikmaos | 3:d4b106bf3a32 | 242 | float result=1; //временно используем чтобы определить знак числа |
nikmaos | 3:d4b106bf3a32 | 243 | |
nikmaos | 4:d53895f65eb7 | 244 | //while(str[i]!=) |
nikmaos | 4:d53895f65eb7 | 245 | //команда выглядит как "/v0=-123.456" поэтому считаем с символа "-" позиция которого 3 (4 знак в массиве) |
nikmaos | 4:d53895f65eb7 | 246 | //проверка на отрицательность и первый знак |
nikmaos | 4:d53895f65eb7 | 247 | for (i=0;i<16;i++) |
nikmaos | 4:d53895f65eb7 | 248 | { |
nikmaos | 4:d53895f65eb7 | 249 | if(buf[i]=='-'){ |
nikmaos | 4:d53895f65eb7 | 250 | result=-result; |
nikmaos | 4:d53895f65eb7 | 251 | n=i; |
nikmaos | 4:d53895f65eb7 | 252 | i++; |
nikmaos | 4:d53895f65eb7 | 253 | break; |
nikmaos | 4:d53895f65eb7 | 254 | } |
nikmaos | 4:d53895f65eb7 | 255 | if((buf[i]>=0x30)&&(buf[i]<=0x39)) |
nikmaos | 4:d53895f65eb7 | 256 | { |
nikmaos | 4:d53895f65eb7 | 257 | n=i; |
nikmaos | 4:d53895f65eb7 | 258 | break; |
nikmaos | 4:d53895f65eb7 | 259 | } |
nikmaos | 4:d53895f65eb7 | 260 | } |
nikmaos | 4:d53895f65eb7 | 261 | if(n<0) return 0; |
nikmaos | 3:d4b106bf3a32 | 262 | //до тех пор, пока поступают нужные символы и нет превышения длины строки |
nikmaos | 4:d53895f65eb7 | 263 | while((i<16)&&(buf[i]>=0x30)&&(buf[i]<=0x39)||((buf[i]=='.')||(buf[i]==',')||(buf[i]=='-'))) |
nikmaos | 4:d53895f65eb7 | 264 | { |
nikmaos | 4:d53895f65eb7 | 265 | i++; |
nikmaos | 3:d4b106bf3a32 | 266 | //проверять на наличие точки или запятой |
nikmaos | 4:d53895f65eb7 | 267 | if((buf[i]=='.')||(buf[i]==',')) |
nikmaos | 3:d4b106bf3a32 | 268 | { |
nikmaos | 4:d53895f65eb7 | 269 | if(p==0){ //если точка ещё не попадалась |
nikmaos | 4:d53895f65eb7 | 270 | p=i; //запоминаем позицию плавающей запятой |
nikmaos | 3:d4b106bf3a32 | 271 | if (result>=0) |
nikmaos | 4:d53895f65eb7 | 272 | j=i-n; //цифр до точки (3 начало) |
nikmaos | 4:d53895f65eb7 | 273 | else j=i-n-1;} //на 1 символ больше из-за "-" |
nikmaos | 4:d53895f65eb7 | 274 | else break; //если попалась ещё одна точка |
nikmaos | 4:d53895f65eb7 | 275 | } |
nikmaos | 4:d53895f65eb7 | 276 | } |
nikmaos | 4:d53895f65eb7 | 277 | |
nikmaos | 5:21240fa1ee4c | 278 | /*Добавить проверку на целое число!! |
nikmaos | 5:21240fa1ee4c | 279 | Добавить проверку на первый символ "точка" |
nikmaos | 5:21240fa1ee4c | 280 | */ |
nikmaos | 3:d4b106bf3a32 | 281 | |
nikmaos | 3:d4b106bf3a32 | 282 | //ниже преобразуем информацию в число |
nikmaos | 4:d53895f65eb7 | 283 | if (result>=0){ |
nikmaos | 3:d4b106bf3a32 | 284 | result=0; |
nikmaos | 4:d53895f65eb7 | 285 | i=i-j-n-1; //знаки после запятой |
nikmaos | 3:d4b106bf3a32 | 286 | while(i--){ |
nikmaos | 3:d4b106bf3a32 | 287 | result+=(buf[p+i+1]-0x30)*powf(10,-i-1); |
nikmaos | 3:d4b106bf3a32 | 288 | } |
nikmaos | 4:d53895f65eb7 | 289 | while(j--){ |
nikmaos | 3:d4b106bf3a32 | 290 | result+=(buf[p-j-1]-0x30)*powf(10,j); |
nikmaos | 3:d4b106bf3a32 | 291 | } |
nikmaos | 3:d4b106bf3a32 | 292 | } |
nikmaos | 4:d53895f65eb7 | 293 | else {//строка на 1 знак больше |
nikmaos | 3:d4b106bf3a32 | 294 | result=0; |
nikmaos | 4:d53895f65eb7 | 295 | i=i-j-n-2; //знаки после запятой |
nikmaos | 3:d4b106bf3a32 | 296 | while(i--){ |
nikmaos | 3:d4b106bf3a32 | 297 | result+=(buf[p+i+1]-0x30)*powf(10,-i-1); |
nikmaos | 3:d4b106bf3a32 | 298 | } |
nikmaos | 3:d4b106bf3a32 | 299 | while(j--){ |
nikmaos | 3:d4b106bf3a32 | 300 | result+=(buf[p-j-1]-0x30)*powf(10,j); |
nikmaos | 3:d4b106bf3a32 | 301 | } |
nikmaos | 3:d4b106bf3a32 | 302 | result=-result; |
nikmaos | 3:d4b106bf3a32 | 303 | } |
nikmaos | 5:21240fa1ee4c | 304 | if (result>-9999.9&&result<9999.99)//заменить на проверку адекватности |
nikmaos | 3:d4b106bf3a32 | 305 | return result; |
nikmaos | 5:21240fa1ee4c | 306 | else if (result<=-9999.99) |
nikmaos | 5:21240fa1ee4c | 307 | return (-9999.99); |
nikmaos | 5:21240fa1ee4c | 308 | else if (result>=9999.99)//заменить на проверку адекватности |
nikmaos | 5:21240fa1ee4c | 309 | return (9999.99); |
nikmaos | 3:d4b106bf3a32 | 310 | else return 0; |
nikmaos | 3:d4b106bf3a32 | 311 | } |
nikmaos | 4:d53895f65eb7 | 312 | |
nikmaos | 3:d4b106bf3a32 | 313 | void setPIDdefault(PID_t *pidx,PID_defs_t *defs) |
nikmaos | 3:d4b106bf3a32 | 314 | /*Установка для нужного пида его настроек по умолчанию*/ |
nikmaos | 3:d4b106bf3a32 | 315 | { |
nikmaos | 3:d4b106bf3a32 | 316 | pidx->kP=defs->kp; |
nikmaos | 3:d4b106bf3a32 | 317 | pidx->kI=defs->ki; |
nikmaos | 3:d4b106bf3a32 | 318 | pidx->kD=defs->kd; |
nikmaos | 3:d4b106bf3a32 | 319 | pidx->sampleTime=defs->st; |
nikmaos | 3:d4b106bf3a32 | 320 | pidx->chkd=CHKD; |
nikmaos | 3:d4b106bf3a32 | 321 | } |
nikmaos | 3:d4b106bf3a32 | 322 | |
nikmaos | 3:d4b106bf3a32 | 323 | int main() |
nikmaos | 4:d53895f65eb7 | 324 | { |
nikmaos | 5:21240fa1ee4c | 325 | UART.printf("SystemClock %d\r\n",SystemCoreClock); |
nikmaos | 3:d4b106bf3a32 | 326 | //считывание данных настроек из памяти |
nikmaos | 3:d4b106bf3a32 | 327 | for (int i=0;i<sizeof(Mem.w)/sizeof(uint32_t);i++) |
nikmaos | 3:d4b106bf3a32 | 328 | { |
nikmaos | 3:d4b106bf3a32 | 329 | Mem.w[i]=flashRead(i*4);//sizeof(uint32_t)=4; |
nikmaos | 3:d4b106bf3a32 | 330 | } |
nikmaos | 3:d4b106bf3a32 | 331 | if ((Mem.PID.chkd!=CHKD)||(Mem.PID_R.chkd!=CHKD)) |
nikmaos | 3:d4b106bf3a32 | 332 | { |
nikmaos | 3:d4b106bf3a32 | 333 | //если метки данных нет то записать настройки ПИД по умолчанию |
nikmaos | 3:d4b106bf3a32 | 334 | UART.printf("PID is default\r\n"); |
nikmaos | 3:d4b106bf3a32 | 335 | setPIDdefault(&Mem.PID,&PID_defs); |
nikmaos | 3:d4b106bf3a32 | 336 | setPIDdefault(&Mem.PID_R,&PID_R_defs); |
nikmaos | 3:d4b106bf3a32 | 337 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 338 | } |
nikmaos | 3:d4b106bf3a32 | 339 | UART.printf("PID:\r\nKp=%0.3f\r\nkI=%0.3f\r\nkD=%0.3f\r\n",Mem.PID.kP,Mem.PID.kI,Mem.PID.kD); |
nikmaos | 3:d4b106bf3a32 | 340 | UART.printf("PID_R:\r\nKp=%0.3f\r\nkI=%0.3f\r\nkD=%0.3f\r\n",Mem.PID_R.kP,Mem.PID_R.kI,Mem.PID_R.kD); |
nikmaos | 3:d4b106bf3a32 | 341 | UART.printf("%08X\r\n",Mem.PID.chkd); |
nikmaos | 3:d4b106bf3a32 | 342 | |
nikmaos | 3:d4b106bf3a32 | 343 | //Инициализация периферийных устройств |
nikmaos | 3:d4b106bf3a32 | 344 | SPI1_MasterInitMode(1);//работают режимы 1 и 2 для платы ТЭД2 |
nikmaos | 3:d4b106bf3a32 | 345 | //SPI3_MasterInitMode(1); |
nikmaos | 3:d4b106bf3a32 | 346 | //запустить задачу проверки команды по прерыванию УАРТ |
nikmaos | 3:d4b106bf3a32 | 347 | UART.attach(&ComandCheck,Serial::RxIrq); |
nikmaos | 3:d4b106bf3a32 | 348 | /*EN1=1; |
nikmaos | 3:d4b106bf3a32 | 349 | |
nikmaos | 3:d4b106bf3a32 | 350 | ch=5; |
nikmaos | 3:d4b106bf3a32 | 351 | pga280_setAdress(ch); |
nikmaos | 3:d4b106bf3a32 | 352 | pga280_ads1259_init(ch); //инициализировать АЦП по адресу на плате ТЭД-2 = 5 (4) |
nikmaos | 3:d4b106bf3a32 | 353 | printf("\r\n"); |
nikmaos | 3:d4b106bf3a32 | 354 | tempdata=pga280_readOneRegisterDevice(PGA280_BUF_TIMEOUT_ADR,ch); |
nikmaos | 3:d4b106bf3a32 | 355 | printf("Timeout %X\n",tempdata); |
nikmaos | 3:d4b106bf3a32 | 356 | wait_ms(20); |
nikmaos | 3:d4b106bf3a32 | 357 | pga280_setGAIN(GAIN_1_PGA280,ch); |
nikmaos | 3:d4b106bf3a32 | 358 | pga280_setMUX(2,ch); |
nikmaos | 3:d4b106bf3a32 | 359 | pga280gain=3; // gain=1 (0x03) |
nikmaos | 3:d4b106bf3a32 | 360 | tempdata=pga280_readOneRegisterDevice(PGA280_ERROR_ADR,ch);//чтение ошибок |
nikmaos | 3:d4b106bf3a32 | 361 | printf("Errors %X\n",tempdata); |
nikmaos | 3:d4b106bf3a32 | 362 | /*Конец*/ |
nikmaos | 3:d4b106bf3a32 | 363 | |
nikmaos | 3:d4b106bf3a32 | 364 | |
nikmaos | 3:d4b106bf3a32 | 365 | |
nikmaos | 3:d4b106bf3a32 | 366 | |
nikmaos | 3:d4b106bf3a32 | 367 | /*Инициализация внешнего АПЦ для LM35*/ |
nikmaos | 3:d4b106bf3a32 | 368 | //создадим экземпляр АЦП если их несколько |
nikmaos | 3:d4b106bf3a32 | 369 | UART.printf("Configuring ADC\r\n"); |
nikmaos | 3:d4b106bf3a32 | 370 | DS1248_START=0; |
nikmaos | 3:d4b106bf3a32 | 371 | wait_ms(20); |
nikmaos | 3:d4b106bf3a32 | 372 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 373 | wait_ms(20); |
nikmaos | 3:d4b106bf3a32 | 374 | /*Настройка регистров в ОЗУ (описание в заголовочном файле)*/ |
nikmaos | 3:d4b106bf3a32 | 375 | ads1.MUX0.MUX_SN=1; //AIN1 |
nikmaos | 3:d4b106bf3a32 | 376 | ads1.MUX0.MUX_SP=0; //AIN0 |
nikmaos | 3:d4b106bf3a32 | 377 | ads1.MUX0.BCS=0; |
nikmaos | 3:d4b106bf3a32 | 378 | |
nikmaos | 3:d4b106bf3a32 | 379 | ads1.VBIAS.all=0; |
nikmaos | 3:d4b106bf3a32 | 380 | ads1.VBIAS.VBIAS0=0; |
nikmaos | 3:d4b106bf3a32 | 381 | |
nikmaos | 3:d4b106bf3a32 | 382 | ads1.SYS0.DR=DR20; |
nikmaos | 3:d4b106bf3a32 | 383 | ads1.SYS0.PGA=PGA_1; //=log2(PGA) пример: PGA=16 значит значение будет log2(16)=4; |
nikmaos | 3:d4b106bf3a32 | 384 | |
nikmaos | 3:d4b106bf3a32 | 385 | ads1.MUX1.MUXCAL=0; |
nikmaos | 3:d4b106bf3a32 | 386 | ads1.MUX1.REFSELT=2; |
nikmaos | 3:d4b106bf3a32 | 387 | ads1.MUX1.VREFCON=1; |
nikmaos | 3:d4b106bf3a32 | 388 | |
nikmaos | 3:d4b106bf3a32 | 389 | ads1.IDAC0.all=0; |
nikmaos | 3:d4b106bf3a32 | 390 | |
nikmaos | 3:d4b106bf3a32 | 391 | ads1.IDAC1.all=0xFF; |
nikmaos | 3:d4b106bf3a32 | 392 | |
nikmaos | 3:d4b106bf3a32 | 393 | ads1.FSC.all=1*(0x400000); //масштаб АЦП (наверное не коэффициент усиления) |
nikmaos | 3:d4b106bf3a32 | 394 | /*Конец*/ |
nikmaos | 3:d4b106bf3a32 | 395 | //Записать в чип |
nikmaos | 3:d4b106bf3a32 | 396 | ADS1248SettingReg(&ads1); |
nikmaos | 3:d4b106bf3a32 | 397 | if(ads1.SYS0.all==ADS1248ReadRegister(DS1248_REGISTER_SYS0,1)) //30.07.2020/8:40 |
nikmaos | 4:d53895f65eb7 | 398 | UART.printf("ADS is configured\r\n"); |
nikmaos | 3:d4b106bf3a32 | 399 | ADSRdy.fall(&readads);//виснет без платы (решение - закомментить) |
nikmaos | 3:d4b106bf3a32 | 400 | wait_ms(20); |
nikmaos | 3:d4b106bf3a32 | 401 | //ADS1248SleepCommand();//временно отключаем чтобы при старте не началось считывание |
nikmaos | 3:d4b106bf3a32 | 402 | DS1248_START=0; |
nikmaos | 3:d4b106bf3a32 | 403 | |
nikmaos | 3:d4b106bf3a32 | 404 | /*Инициализация внещнего ЦАП*/ |
nikmaos | 3:d4b106bf3a32 | 405 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 406 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 407 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 408 | UART.printf("DAC is configured\r\n"); |
nikmaos | 3:d4b106bf3a32 | 409 | |
nikmaos | 3:d4b106bf3a32 | 410 | //обнуление режима работы ПИД |
nikmaos | 3:d4b106bf3a32 | 411 | Mem.PID.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 412 | Mem.PID_R.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 413 | /*Тестовая кнопка для включения PID*/ |
nikmaos | 3:d4b106bf3a32 | 414 | //button.fall(&pressed); |
nikmaos | 3:d4b106bf3a32 | 415 | //Калибрануть если есть дисплей |
nikmaos | 3:d4b106bf3a32 | 416 | if(TFT.IsOn()){ |
nikmaos | 3:d4b106bf3a32 | 417 | UART.printf("Process of calibration\r\n"); |
nikmaos | 3:d4b106bf3a32 | 418 | disp.Calibration(Mem.calibration,0); |
nikmaos | 3:d4b106bf3a32 | 419 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 420 | UART.printf("Calibrated\r\n");} |
nikmaos | 5:21240fa1ee4c | 421 | disp.activeScreen = PID_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 422 | disp.pressedButton = NONE_PRESS; |
nikmaos | 5:21240fa1ee4c | 423 | disp.str_edit[0]='_'; |
nikmaos | 5:21240fa1ee4c | 424 | disp.cursor=0; |
nikmaos | 3:d4b106bf3a32 | 425 | |
nikmaos | 5:21240fa1ee4c | 426 | //ADS1248CalibrateSoft(&ads1,BufToFloat); //эксперимент |
nikmaos | 4:d53895f65eb7 | 427 | |
nikmaos | 3:d4b106bf3a32 | 428 | // change active screen depending on pressed area |
nikmaos | 3:d4b106bf3a32 | 429 | while(1) { |
nikmaos | 3:d4b106bf3a32 | 430 | |
nikmaos | 5:21240fa1ee4c | 431 | if(TFT.IsOn())//проверка включения дисплея |
nikmaos | 3:d4b106bf3a32 | 432 | { |
nikmaos | 3:d4b106bf3a32 | 433 | disp.pressedButton = disp.GetTouch(); |
nikmaos | 5:21240fa1ee4c | 434 | |
nikmaos | 3:d4b106bf3a32 | 435 | //-------------------------------ChromTestScreen------------------------ |
nikmaos | 3:d4b106bf3a32 | 436 | if (disp.activeScreen == TEST_CHROM_SCREEN) { |
nikmaos | 3:d4b106bf3a32 | 437 | disp.ChromTest(LM35_0.temp,RAS.temp,temp,rashod_u); |
nikmaos | 3:d4b106bf3a32 | 438 | if(disp.pressedButton){ |
nikmaos | 3:d4b106bf3a32 | 439 | wait_ms(100); |
nikmaos | 3:d4b106bf3a32 | 440 | if(disp.pressedButton==CHROM_TEMP_PRESS){ |
nikmaos | 3:d4b106bf3a32 | 441 | disp.pressedButton = NONE_PRESS; |
nikmaos | 3:d4b106bf3a32 | 442 | disp.activeScreen=MENU_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 443 | } |
nikmaos | 3:d4b106bf3a32 | 444 | } |
nikmaos | 3:d4b106bf3a32 | 445 | } |
nikmaos | 3:d4b106bf3a32 | 446 | // --------------------------------------------------------------------- |
nikmaos | 5:21240fa1ee4c | 447 | //=------------------------------PID Screen----------------------------- |
nikmaos | 5:21240fa1ee4c | 448 | if (disp.activeScreen == PID_SCREEN) { |
nikmaos | 5:21240fa1ee4c | 449 | if(disp.pressedButton>=SEL_P1&&disp.pressedButton<=SEL_D2) |
nikmaos | 5:21240fa1ee4c | 450 | disp.selectedEditor=(selectedEditor_t)disp.pressedButton; |
nikmaos | 5:21240fa1ee4c | 451 | // else disp.selectedEditor=(selectedEditor_t)NONE_PRESS; |
nikmaos | 5:21240fa1ee4c | 452 | disp.PidScreen(&BufToFloat,LM35_0.temp,RAS.temp,LT1446_0.dacB.Code,LT1446_0.dacA.Code,&Mem.PID,&Mem.PID_R);} |
nikmaos | 5:21240fa1ee4c | 453 | wait_ms(100); |
nikmaos | 5:21240fa1ee4c | 454 | |
nikmaos | 5:21240fa1ee4c | 455 | //=--------------------------------------------------------------------- |
nikmaos | 5:21240fa1ee4c | 456 | |
nikmaos | 3:d4b106bf3a32 | 457 | // Main menu screen |
nikmaos | 3:d4b106bf3a32 | 458 | if (disp.activeScreen == MENU_SCREEN) { |
nikmaos | 3:d4b106bf3a32 | 459 | disp.MainMenu(LM35_0.temp, LM35_0.temp);//сюда писать значения (наверное) (расход/температура) |
nikmaos | 3:d4b106bf3a32 | 460 | if (disp.pressedButton) { |
nikmaos | 3:d4b106bf3a32 | 461 | wait_ms(150); |
nikmaos | 3:d4b106bf3a32 | 462 | if (disp.pressedButton == CURR_TEMP_PRESS) { |
nikmaos | 3:d4b106bf3a32 | 463 | disp.activeScreen = CURR_TEMP_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 464 | } else if (disp.pressedButton == CURR_HUM_PRESS) { |
nikmaos | 3:d4b106bf3a32 | 465 | disp.activeScreen = CURR_HUM_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 466 | } |
nikmaos | 3:d4b106bf3a32 | 467 | disp.pressedButton = NONE_PRESS; |
nikmaos | 3:d4b106bf3a32 | 468 | } |
nikmaos | 3:d4b106bf3a32 | 469 | |
nikmaos | 3:d4b106bf3a32 | 470 | // --------------------------------------------------------------------- |
nikmaos | 3:d4b106bf3a32 | 471 | // Any other screen |
nikmaos | 3:d4b106bf3a32 | 472 | } else { |
nikmaos | 3:d4b106bf3a32 | 473 | // ---------------------------------------------------------------------------------------------- |
nikmaos | 3:d4b106bf3a32 | 474 | // You can back to main menu from any screen |
nikmaos | 3:d4b106bf3a32 | 475 | if (disp.pressedButton == MENU_PRESS) { |
nikmaos | 3:d4b106bf3a32 | 476 | disp.pressedButton = NONE_PRESS; |
nikmaos | 3:d4b106bf3a32 | 477 | disp.activeScreen = MENU_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 478 | } else { |
nikmaos | 3:d4b106bf3a32 | 479 | // ---------------------------------------------------------------------------------------------- |
nikmaos | 3:d4b106bf3a32 | 480 | // Screen with current temperature / humidity |
nikmaos | 3:d4b106bf3a32 | 481 | if (disp.activeScreen == CURR_TEMP_SCREEN) { |
nikmaos | 3:d4b106bf3a32 | 482 | disp.CurrentTemperature(LM35_0.temp);//и сюда тоже |
nikmaos | 3:d4b106bf3a32 | 483 | } else if (disp.activeScreen == CURR_HUM_SCREEN) { |
nikmaos | 3:d4b106bf3a32 | 484 | disp.CurrentHumidity(LM35_0.temp);//и сюда |
nikmaos | 3:d4b106bf3a32 | 485 | } |
nikmaos | 3:d4b106bf3a32 | 486 | } |
nikmaos | 3:d4b106bf3a32 | 487 | } |
nikmaos | 4:d53895f65eb7 | 488 | }//Проверка включения дисплея |
nikmaos | 3:d4b106bf3a32 | 489 | } |
nikmaos | 3:d4b106bf3a32 | 490 | } |
nikmaos | 3:d4b106bf3a32 | 491 | |
nikmaos | 3:d4b106bf3a32 | 492 | |
nikmaos | 3:d4b106bf3a32 | 493 | |
nikmaos | 3:d4b106bf3a32 | 494 | /*команды*/ |
vitlog | 0:98fcc06c66bf | 495 | void ComandCheck() |
nikmaos | 4:d53895f65eb7 | 496 | { |
nikmaos | 4:d53895f65eb7 | 497 | UART_gets(16); //моя функция на время |
nikmaos | 4:d53895f65eb7 | 498 | if(str[0]=='/') |
vitlog | 0:98fcc06c66bf | 499 | { |
nikmaos | 4:d53895f65eb7 | 500 | UART.printf("%c\r\n",str[1]); |
nikmaos | 4:d53895f65eb7 | 501 | switch (str[1]){ |
nikmaos | 3:d4b106bf3a32 | 502 | /*Проверка платы SB-1 SWEN*/ |
nikmaos | 3:d4b106bf3a32 | 503 | case 'i':{ |
nikmaos | 4:d53895f65eb7 | 504 | if (str[2]=='1') |
nikmaos | 3:d4b106bf3a32 | 505 | {SB1_SWEN=1; |
nikmaos | 3:d4b106bf3a32 | 506 | UART.printf("SW is ON\r\n");} |
nikmaos | 4:d53895f65eb7 | 507 | else if (str[2]=='0') |
nikmaos | 3:d4b106bf3a32 | 508 | {SB1_SWEN=0; |
nikmaos | 3:d4b106bf3a32 | 509 | UART.printf("SW is OFF\r\n");} |
nikmaos | 4:d53895f65eb7 | 510 | else if (str[2]=='a') |
nikmaos | 3:d4b106bf3a32 | 511 | { |
nikmaos | 3:d4b106bf3a32 | 512 | PosAw=1; |
nikmaos | 3:d4b106bf3a32 | 513 | PosBw=0; |
nikmaos | 3:d4b106bf3a32 | 514 | wait_ms(50); |
nikmaos | 3:d4b106bf3a32 | 515 | PosAw=0; |
nikmaos | 3:d4b106bf3a32 | 516 | PosBw=0; |
nikmaos | 3:d4b106bf3a32 | 517 | } |
nikmaos | 4:d53895f65eb7 | 518 | else if (str[2]=='b') |
nikmaos | 3:d4b106bf3a32 | 519 | { |
nikmaos | 3:d4b106bf3a32 | 520 | PosAw=0; |
nikmaos | 3:d4b106bf3a32 | 521 | PosBw=1; |
nikmaos | 3:d4b106bf3a32 | 522 | wait_ms(50); |
nikmaos | 3:d4b106bf3a32 | 523 | PosAw=0; |
nikmaos | 3:d4b106bf3a32 | 524 | PosBw=0; |
nikmaos | 3:d4b106bf3a32 | 525 | } |
nikmaos | 4:d53895f65eb7 | 526 | else if (str[2]=='r') |
nikmaos | 3:d4b106bf3a32 | 527 | { |
nikmaos | 3:d4b106bf3a32 | 528 | char a='0'; |
nikmaos | 3:d4b106bf3a32 | 529 | if (PosAr) |
nikmaos | 3:d4b106bf3a32 | 530 | a='a'; |
nikmaos | 3:d4b106bf3a32 | 531 | else if (PosBr) |
nikmaos | 3:d4b106bf3a32 | 532 | a='b'; |
nikmaos | 3:d4b106bf3a32 | 533 | UART.printf("POS is %c",a); |
nikmaos | 3:d4b106bf3a32 | 534 | } |
vitlog | 1:5d28312892aa | 535 | break;} |
nikmaos | 3:d4b106bf3a32 | 536 | case 'k':{//настройки ПИДа температуры колонки |
nikmaos | 3:d4b106bf3a32 | 537 | PID1.detach(); |
nikmaos | 3:d4b106bf3a32 | 538 | LT1446_0.dacB.Code=0; |
nikmaos | 3:d4b106bf3a32 | 539 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 540 | LTCwrite(<1446_0); |
nikmaos | 4:d53895f65eb7 | 541 | switch (str[2]){ |
nikmaos | 3:d4b106bf3a32 | 542 | case 'P':{ |
nikmaos | 3:d4b106bf3a32 | 543 | Mem.PID.kP=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 544 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 545 | UART.printf("P=%f\r\n",Mem.PID.kP); |
nikmaos | 3:d4b106bf3a32 | 546 | break; |
nikmaos | 3:d4b106bf3a32 | 547 | } |
nikmaos | 3:d4b106bf3a32 | 548 | case 'I':{ |
nikmaos | 3:d4b106bf3a32 | 549 | Mem.PID.kI=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 550 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 551 | UART.printf("I=%f\r\n",Mem.PID.kI); |
nikmaos | 3:d4b106bf3a32 | 552 | break; |
nikmaos | 3:d4b106bf3a32 | 553 | } |
nikmaos | 3:d4b106bf3a32 | 554 | case 'D':{ |
nikmaos | 3:d4b106bf3a32 | 555 | Mem.PID.kD=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 556 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 557 | UART.printf("D=%f\r\n",Mem.PID.kD); |
nikmaos | 3:d4b106bf3a32 | 558 | break; |
nikmaos | 3:d4b106bf3a32 | 559 | } |
nikmaos | 3:d4b106bf3a32 | 560 | case 'f':{ |
nikmaos | 3:d4b106bf3a32 | 561 | setPIDdefault(&Mem.PID,&PID_defs); |
nikmaos | 3:d4b106bf3a32 | 562 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 563 | UART.printf("PID is default\r\n"); |
nikmaos | 3:d4b106bf3a32 | 564 | break;} |
nikmaos | 3:d4b106bf3a32 | 565 | default:break; |
nikmaos | 3:d4b106bf3a32 | 566 | } |
nikmaos | 3:d4b106bf3a32 | 567 | //задание уставки температуры |
nikmaos | 4:d53895f65eb7 | 568 | if ((str[2]>='0')&&(str[2]<='9')){ |
nikmaos | 4:d53895f65eb7 | 569 | temp=(str[2]-'0')*10+(str[3]-'0'); |
nikmaos | 3:d4b106bf3a32 | 570 | UART.printf("temp= %d\r\n",temp); } |
nikmaos | 3:d4b106bf3a32 | 571 | break;} |
nikmaos | 3:d4b106bf3a32 | 572 | |
vitlog | 1:5d28312892aa | 573 | case 't':{ |
nikmaos | 3:d4b106bf3a32 | 574 | //начать чтение температуры |
nikmaos | 3:d4b106bf3a32 | 575 | //отключаем отображение для перенастройки, настраиваем, записываем, включаем обратно отображение с новым параметром |
nikmaos | 3:d4b106bf3a32 | 576 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 577 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 578 | ADS1248WakeupCommand(); |
nikmaos | 3:d4b106bf3a32 | 579 | ads1.MUX0.MUX_SN=1; //AIN1 |
nikmaos | 3:d4b106bf3a32 | 580 | ads1.MUX0.MUX_SP=0; //AIN0 |
nikmaos | 3:d4b106bf3a32 | 581 | ads1.VBIAS.all=0; |
nikmaos | 3:d4b106bf3a32 | 582 | ADS1248SettingReg(&ads1); |
nikmaos | 3:d4b106bf3a32 | 583 | UART.printf("Temperature reading started.\r\n"); |
vitlog | 1:5d28312892aa | 584 | //снять показания термодатчика |
nikmaos | 3:d4b106bf3a32 | 585 | //LM35_start(0.25); |
nikmaos | 3:d4b106bf3a32 | 586 | printer_p=&printtemp; |
nikmaos | 3:d4b106bf3a32 | 587 | lm_temp.attach(printer_p,0.1); |
vitlog | 1:5d28312892aa | 588 | break;} |
nikmaos | 3:d4b106bf3a32 | 589 | |
vitlog | 0:98fcc06c66bf | 590 | case 'p':{ |
nikmaos | 4:d53895f65eb7 | 591 | pga280gain=str[2]; //присваиваем числовое значение команды взятое из символа цифры |
vitlog | 0:98fcc06c66bf | 592 | pga280gain-=0x30; |
vitlog | 0:98fcc06c66bf | 593 | ch=5; |
vitlog | 0:98fcc06c66bf | 594 | pga280_setGAIN(pga280gain,ch); |
vitlog | 0:98fcc06c66bf | 595 | ch=0; |
vitlog | 0:98fcc06c66bf | 596 | break;} |
nikmaos | 3:d4b106bf3a32 | 597 | |
nikmaos | 3:d4b106bf3a32 | 598 | case 'g': { //включить нужный ПИД |
nikmaos | 4:d53895f65eb7 | 599 | if(str[2]=='p') |
nikmaos | 3:d4b106bf3a32 | 600 | { |
nikmaos | 4:d53895f65eb7 | 601 | switch(str[3]) |
nikmaos | 3:d4b106bf3a32 | 602 | {//gp1 |
nikmaos | 3:d4b106bf3a32 | 603 | case '1'://первый - температура |
nikmaos | 3:d4b106bf3a32 | 604 | { |
nikmaos | 3:d4b106bf3a32 | 605 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 606 | pressed(); |
nikmaos | 3:d4b106bf3a32 | 607 | printer_p=&printPID; |
nikmaos | 3:d4b106bf3a32 | 608 | lm_temp.attach(printer_p,0.25); |
nikmaos | 3:d4b106bf3a32 | 609 | break;} |
nikmaos | 3:d4b106bf3a32 | 610 | case '2'://второй - расход |
nikmaos | 3:d4b106bf3a32 | 611 | {//gp2 |
nikmaos | 3:d4b106bf3a32 | 612 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 613 | pid2_start(); |
nikmaos | 3:d4b106bf3a32 | 614 | printer_p=&printPID; |
nikmaos | 3:d4b106bf3a32 | 615 | lm_temp.attach(printer_p,0.25); |
nikmaos | 3:d4b106bf3a32 | 616 | break;} |
nikmaos | 3:d4b106bf3a32 | 617 | |
nikmaos | 3:d4b106bf3a32 | 618 | //остановить работу ПИД регуляторов. |
nikmaos | 3:d4b106bf3a32 | 619 | case 's':// /gps |
nikmaos | 3:d4b106bf3a32 | 620 | { |
nikmaos | 3:d4b106bf3a32 | 621 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 622 | PID1.detach(); |
nikmaos | 3:d4b106bf3a32 | 623 | PID2.detach(); |
nikmaos | 3:d4b106bf3a32 | 624 | Mem.PID.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 625 | Mem.PID_R.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 626 | LT1446_0.dacB.Code=0; |
nikmaos | 3:d4b106bf3a32 | 627 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 628 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 629 | UART.printf("PIDs is stopped\r\n"); |
nikmaos | 3:d4b106bf3a32 | 630 | break;} |
nikmaos | 3:d4b106bf3a32 | 631 | } |
nikmaos | 3:d4b106bf3a32 | 632 | } |
nikmaos | 3:d4b106bf3a32 | 633 | //запустить задачу чтения АЦП каждые 40 мс (25 герц) |
nikmaos | 3:d4b106bf3a32 | 634 | //adctask.attach(&readADC,0.04); |
nikmaos | 3:d4b106bf3a32 | 635 | break;} |
nikmaos | 3:d4b106bf3a32 | 636 | |
nikmaos | 3:d4b106bf3a32 | 637 | case's': {//остановить постоянное отображение |
nikmaos | 3:d4b106bf3a32 | 638 | //adctask.detach(); |
vitlog | 1:5d28312892aa | 639 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 640 | Mem.PID.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 641 | Mem.PID_R.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 642 | //LM35_stop(); |
nikmaos | 3:d4b106bf3a32 | 643 | ADS1248SleepCommand(); |
nikmaos | 3:d4b106bf3a32 | 644 | DS1248_START=0; |
vitlog | 0:98fcc06c66bf | 645 | break;} |
nikmaos | 3:d4b106bf3a32 | 646 | |
nikmaos | 3:d4b106bf3a32 | 647 | case 'd':{//LTC1446 задание значений на ЦАП оба канала |
vitlog | 0:98fcc06c66bf | 648 | //MBFlagRegister.DAC=1; |
nikmaos | 4:d53895f65eb7 | 649 | if (str[2]=='a')//команда = "da=xxxx" где хххх - код ЦАП |
nikmaos | 3:d4b106bf3a32 | 650 | { |
nikmaos | 4:d53895f65eb7 | 651 | LT1446_0.dacA.Code=(str[3]-0x30)*1000+(str[4]-0x30)*100+(str[5]-0x30)*10+(str[6]-0x30); |
nikmaos | 3:d4b106bf3a32 | 652 | UART.printf("%d\r\n",LT1446_0.dacA.Code); |
nikmaos | 3:d4b106bf3a32 | 653 | } |
nikmaos | 3:d4b106bf3a32 | 654 | if (str[1]=='b') |
nikmaos | 3:d4b106bf3a32 | 655 | { |
nikmaos | 4:d53895f65eb7 | 656 | LT1446_0.dacB.Code=(str[3]-0x30)*1000+(str[4]-0x30)*100+(str[5]-0x30)*10+(str[6]-0x30); |
nikmaos | 3:d4b106bf3a32 | 657 | UART.printf("%d\r\n",LT1446_0.dacB.Code); |
nikmaos | 3:d4b106bf3a32 | 658 | } |
nikmaos | 3:d4b106bf3a32 | 659 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 660 | break;} |
vitlog | 0:98fcc06c66bf | 661 | case 'e':{ |
vitlog | 0:98fcc06c66bf | 662 | tempdata=pga280_readOneRegisterDevice(PGA280_ERROR_ADR,5);//чтение ошибок |
vitlog | 0:98fcc06c66bf | 663 | printf("ERRORS %X\n",tempdata); |
vitlog | 0:98fcc06c66bf | 664 | break;} |
nikmaos | 3:d4b106bf3a32 | 665 | case 'r':{//выключить ПИД 2 перед манипуляциями с ним |
nikmaos | 3:d4b106bf3a32 | 666 | PID2.detach(); |
nikmaos | 3:d4b106bf3a32 | 667 | //задающее воздействие =0; |
nikmaos | 3:d4b106bf3a32 | 668 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 669 | LT1446_0.dacB.Code=0; |
nikmaos | 3:d4b106bf3a32 | 670 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 671 | //обработка команд |
nikmaos | 4:d53895f65eb7 | 672 | switch (str[2]){ |
nikmaos | 3:d4b106bf3a32 | 673 | case 'P':{ |
nikmaos | 3:d4b106bf3a32 | 674 | Mem.PID_R.kP=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 675 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 676 | UART.printf("P=%f\r\n",Mem.PID_R.kP); |
nikmaos | 3:d4b106bf3a32 | 677 | break; |
nikmaos | 3:d4b106bf3a32 | 678 | } |
nikmaos | 3:d4b106bf3a32 | 679 | case 'I':{ |
nikmaos | 3:d4b106bf3a32 | 680 | Mem.PID_R.kI=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 681 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 682 | UART.printf("I=%f\r\n",Mem.PID_R.kI); |
nikmaos | 3:d4b106bf3a32 | 683 | break; |
nikmaos | 3:d4b106bf3a32 | 684 | } |
nikmaos | 3:d4b106bf3a32 | 685 | case 'D':{ |
nikmaos | 3:d4b106bf3a32 | 686 | Mem.PID_R.kD=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 687 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 688 | UART.printf("D=%f\r\n",Mem.PID_R.kD); |
nikmaos | 3:d4b106bf3a32 | 689 | break; |
nikmaos | 3:d4b106bf3a32 | 690 | } |
nikmaos | 3:d4b106bf3a32 | 691 | case 'f':{// /rf |
nikmaos | 3:d4b106bf3a32 | 692 | setPIDdefault(&Mem.PID_R,&PID_defs); |
nikmaos | 3:d4b106bf3a32 | 693 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 694 | UART.printf("PID is default\r\n"); |
nikmaos | 3:d4b106bf3a32 | 695 | break;} |
nikmaos | 3:d4b106bf3a32 | 696 | case 'g':{//запуск чтения расхода /rg |
nikmaos | 3:d4b106bf3a32 | 697 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 698 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 699 | ADS1248WakeupCommand(); |
nikmaos | 3:d4b106bf3a32 | 700 | ads1.MUX0.MUX_SN=3; //AIN3 |
nikmaos | 3:d4b106bf3a32 | 701 | ads1.MUX0.MUX_SP=2; //AIN2 |
nikmaos | 3:d4b106bf3a32 | 702 | ads1.VBIAS.VBIAS3=1; |
nikmaos | 3:d4b106bf3a32 | 703 | ADS1248SettingReg(&ads1); |
nikmaos | 3:d4b106bf3a32 | 704 | UART.printf("Rashod reading started.\r\n"); |
nikmaos | 3:d4b106bf3a32 | 705 | printer_p=&printtemp; |
nikmaos | 3:d4b106bf3a32 | 706 | lm_temp.attach(printer_p,0.1); |
nikmaos | 3:d4b106bf3a32 | 707 | break;} |
nikmaos | 3:d4b106bf3a32 | 708 | |
nikmaos | 3:d4b106bf3a32 | 709 | case 'u':{ // ru=xx.xx; точка обязательна |
nikmaos | 3:d4b106bf3a32 | 710 | //задание уставки расхода |
nikmaos | 3:d4b106bf3a32 | 711 | rashod_u=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 712 | UART.printf("Rashod = %0.3f\r\n",rashod_u); |
nikmaos | 3:d4b106bf3a32 | 713 | break;} |
nikmaos | 3:d4b106bf3a32 | 714 | default:break; |
nikmaos | 3:d4b106bf3a32 | 715 | } |
nikmaos | 3:d4b106bf3a32 | 716 | |
nikmaos | 4:d53895f65eb7 | 717 | if((str[2]=='e')&&(str[3]=='s')&&(str[4]=='e')&&(str[5]=='t')){ |
nikmaos | 4:d53895f65eb7 | 718 | //перезагрука |
vitlog | 0:98fcc06c66bf | 719 | printf("System Reset\r\n"); |
nikmaos | 3:d4b106bf3a32 | 720 | NVIC_SystemReset();} |
nikmaos | 4:d53895f65eb7 | 721 | if ((str[2]=='e')&&(str[3]=='c')&&(str[4]=='a')&&(str[5]=='l')){ |
nikmaos | 3:d4b106bf3a32 | 722 | disp.Calibration(Mem.calibration,1); |
nikmaos | 3:d4b106bf3a32 | 723 | UART.printf("Recalibrated\r\n"); |
nikmaos | 3:d4b106bf3a32 | 724 | }; |
vitlog | 0:98fcc06c66bf | 725 | break;} |
nikmaos | 4:d53895f65eb7 | 726 | default: |
vitlog | 0:98fcc06c66bf | 727 | //MBFlagRegister.TMLS=0; //починка зависания (не работает) |
nikmaos | 4:d53895f65eb7 | 728 | break; |
nikmaos | 4:d53895f65eb7 | 729 | } |
nikmaos | 4:d53895f65eb7 | 730 | } |
vitlog | 0:98fcc06c66bf | 731 | } |
vitlog | 0:98fcc06c66bf | 732 |