test
Dependencies: ad5422_arduino mbed LT1446 ADS1248-1 LM35-1 Flash FT813 PGA280_ADS1259
main.cpp@3:d4b106bf3a32, 2020-08-08 (annotated)
- Committer:
- nikmaos
- Date:
- Sat Aug 08 18:32:53 2020 +0000
- Revision:
- 3:d4b106bf3a32
- Parent:
- 2:04090a362742
- Child:
- 4:d53895f65eb7
808
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 | 3:d4b106bf3a32 | 39 | //настройка SPI для дисплея (надо поменять чтобы избежать конфликта с внешними платами) |
nikmaos | 3:d4b106bf3a32 | 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 | 3:d4b106bf3a32 | 235 | { |
nikmaos | 3:d4b106bf3a32 | 236 | uint8_t i=0; |
nikmaos | 3:d4b106bf3a32 | 237 | uint8_t j=1; //счётчик символов до точки |
nikmaos | 3:d4b106bf3a32 | 238 | uint8_t p=0; //позиция точки |
nikmaos | 3:d4b106bf3a32 | 239 | float result=1; //временно используем чтобы определить знак числа |
nikmaos | 3:d4b106bf3a32 | 240 | i=3; //команда выглядит как "v0=-123.456" поэтому считаем с символа - позиция которого 3 |
nikmaos | 3:d4b106bf3a32 | 241 | |
nikmaos | 3:d4b106bf3a32 | 242 | |
nikmaos | 3:d4b106bf3a32 | 243 | if(buf[i]=='-'){ |
nikmaos | 3:d4b106bf3a32 | 244 | result=-result; |
nikmaos | 3:d4b106bf3a32 | 245 | i++; |
nikmaos | 3:d4b106bf3a32 | 246 | } |
nikmaos | 3:d4b106bf3a32 | 247 | //до тех пор, пока поступают нужные символы и нет превышения длины строки |
nikmaos | 3:d4b106bf3a32 | 248 | while((i<16)&&(buf[i]>=0x30)&&(buf[i]<=0x39)||((buf[i]=='.')||(buf[i]==','))) |
nikmaos | 3:d4b106bf3a32 | 249 | { |
nikmaos | 3:d4b106bf3a32 | 250 | i++; |
nikmaos | 3:d4b106bf3a32 | 251 | //проверять на наличие точки или запятой |
nikmaos | 3:d4b106bf3a32 | 252 | if((buf[i]=='.')||(buf[i]==',')) |
nikmaos | 3:d4b106bf3a32 | 253 | { |
nikmaos | 3:d4b106bf3a32 | 254 | p=i; //запоминаем позицию плавающей запятой |
nikmaos | 3:d4b106bf3a32 | 255 | if (result>=0) |
nikmaos | 3:d4b106bf3a32 | 256 | j=i-3; //цифр до точки |
nikmaos | 3:d4b106bf3a32 | 257 | else j=i-4; |
nikmaos | 3:d4b106bf3a32 | 258 | } |
nikmaos | 3:d4b106bf3a32 | 259 | } |
nikmaos | 3:d4b106bf3a32 | 260 | |
nikmaos | 3:d4b106bf3a32 | 261 | //ниже преобразуем информацию в число |
nikmaos | 3:d4b106bf3a32 | 262 | if (result>=0){ |
nikmaos | 3:d4b106bf3a32 | 263 | result=0; |
nikmaos | 3:d4b106bf3a32 | 264 | i=i-j-4; //знаки после запятой |
nikmaos | 3:d4b106bf3a32 | 265 | while(i--){ |
nikmaos | 3:d4b106bf3a32 | 266 | result+=(buf[p+i+1]-0x30)*powf(10,-i-1); |
nikmaos | 3:d4b106bf3a32 | 267 | } |
nikmaos | 3:d4b106bf3a32 | 268 | while(j--){ |
nikmaos | 3:d4b106bf3a32 | 269 | result+=(buf[p-j-1]-0x30)*powf(10,j); |
nikmaos | 3:d4b106bf3a32 | 270 | } |
nikmaos | 3:d4b106bf3a32 | 271 | } |
nikmaos | 3:d4b106bf3a32 | 272 | else { |
nikmaos | 3:d4b106bf3a32 | 273 | result=0; |
nikmaos | 3:d4b106bf3a32 | 274 | i=i-j-5; //знаки после запятой |
nikmaos | 3:d4b106bf3a32 | 275 | while(i--){ |
nikmaos | 3:d4b106bf3a32 | 276 | result+=(buf[p+i+1]-0x30)*powf(10,-i-1); |
nikmaos | 3:d4b106bf3a32 | 277 | } |
nikmaos | 3:d4b106bf3a32 | 278 | while(j--){ |
nikmaos | 3:d4b106bf3a32 | 279 | result+=(buf[p-j-1]-0x30)*powf(10,j); |
nikmaos | 3:d4b106bf3a32 | 280 | } |
nikmaos | 3:d4b106bf3a32 | 281 | result=-result; |
nikmaos | 3:d4b106bf3a32 | 282 | } |
nikmaos | 3:d4b106bf3a32 | 283 | if (result>=0&&result<=10000) |
nikmaos | 3:d4b106bf3a32 | 284 | return result; |
nikmaos | 3:d4b106bf3a32 | 285 | else return 0; |
nikmaos | 3:d4b106bf3a32 | 286 | |
nikmaos | 3:d4b106bf3a32 | 287 | } |
nikmaos | 3:d4b106bf3a32 | 288 | void setPIDdefault(PID_t *pidx,PID_defs_t *defs) |
nikmaos | 3:d4b106bf3a32 | 289 | /*Установка для нужного пида его настроек по умолчанию*/ |
nikmaos | 3:d4b106bf3a32 | 290 | { |
nikmaos | 3:d4b106bf3a32 | 291 | pidx->kP=defs->kp; |
nikmaos | 3:d4b106bf3a32 | 292 | pidx->kI=defs->ki; |
nikmaos | 3:d4b106bf3a32 | 293 | pidx->kD=defs->kd; |
nikmaos | 3:d4b106bf3a32 | 294 | pidx->sampleTime=defs->st; |
nikmaos | 3:d4b106bf3a32 | 295 | pidx->chkd=CHKD; |
nikmaos | 3:d4b106bf3a32 | 296 | } |
nikmaos | 3:d4b106bf3a32 | 297 | |
nikmaos | 3:d4b106bf3a32 | 298 | int main() |
nikmaos | 3:d4b106bf3a32 | 299 | { |
nikmaos | 3:d4b106bf3a32 | 300 | printf("started\r\n"); |
nikmaos | 3:d4b106bf3a32 | 301 | //считывание данных настроек из памяти |
nikmaos | 3:d4b106bf3a32 | 302 | for (int i=0;i<sizeof(Mem.w)/sizeof(uint32_t);i++) |
nikmaos | 3:d4b106bf3a32 | 303 | { |
nikmaos | 3:d4b106bf3a32 | 304 | Mem.w[i]=flashRead(i*4);//sizeof(uint32_t)=4; |
nikmaos | 3:d4b106bf3a32 | 305 | } |
nikmaos | 3:d4b106bf3a32 | 306 | if ((Mem.PID.chkd!=CHKD)||(Mem.PID_R.chkd!=CHKD)) |
nikmaos | 3:d4b106bf3a32 | 307 | { |
nikmaos | 3:d4b106bf3a32 | 308 | //если метки данных нет то записать настройки ПИД по умолчанию |
nikmaos | 3:d4b106bf3a32 | 309 | UART.printf("PID is default\r\n"); |
nikmaos | 3:d4b106bf3a32 | 310 | setPIDdefault(&Mem.PID,&PID_defs); |
nikmaos | 3:d4b106bf3a32 | 311 | setPIDdefault(&Mem.PID_R,&PID_R_defs); |
nikmaos | 3:d4b106bf3a32 | 312 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 313 | } |
nikmaos | 3:d4b106bf3a32 | 314 | 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 | 315 | 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 | 316 | UART.printf("%08X\r\n",Mem.PID.chkd); |
nikmaos | 3:d4b106bf3a32 | 317 | |
nikmaos | 3:d4b106bf3a32 | 318 | //Инициализация периферийных устройств |
nikmaos | 3:d4b106bf3a32 | 319 | SPI1_MasterInitMode(1);//работают режимы 1 и 2 для платы ТЭД2 |
nikmaos | 3:d4b106bf3a32 | 320 | //SPI3_MasterInitMode(1); |
nikmaos | 3:d4b106bf3a32 | 321 | //запустить задачу проверки команды по прерыванию УАРТ |
nikmaos | 3:d4b106bf3a32 | 322 | UART.attach(&ComandCheck,Serial::RxIrq); |
nikmaos | 3:d4b106bf3a32 | 323 | /*EN1=1; |
nikmaos | 3:d4b106bf3a32 | 324 | |
nikmaos | 3:d4b106bf3a32 | 325 | ch=5; |
nikmaos | 3:d4b106bf3a32 | 326 | pga280_setAdress(ch); |
nikmaos | 3:d4b106bf3a32 | 327 | pga280_ads1259_init(ch); //инициализировать АЦП по адресу на плате ТЭД-2 = 5 (4) |
nikmaos | 3:d4b106bf3a32 | 328 | printf("\r\n"); |
nikmaos | 3:d4b106bf3a32 | 329 | tempdata=pga280_readOneRegisterDevice(PGA280_BUF_TIMEOUT_ADR,ch); |
nikmaos | 3:d4b106bf3a32 | 330 | printf("Timeout %X\n",tempdata); |
nikmaos | 3:d4b106bf3a32 | 331 | wait_ms(20); |
nikmaos | 3:d4b106bf3a32 | 332 | pga280_setGAIN(GAIN_1_PGA280,ch); |
nikmaos | 3:d4b106bf3a32 | 333 | pga280_setMUX(2,ch); |
nikmaos | 3:d4b106bf3a32 | 334 | pga280gain=3; // gain=1 (0x03) |
nikmaos | 3:d4b106bf3a32 | 335 | tempdata=pga280_readOneRegisterDevice(PGA280_ERROR_ADR,ch);//чтение ошибок |
nikmaos | 3:d4b106bf3a32 | 336 | printf("Errors %X\n",tempdata); |
nikmaos | 3:d4b106bf3a32 | 337 | /*Конец*/ |
nikmaos | 3:d4b106bf3a32 | 338 | |
nikmaos | 3:d4b106bf3a32 | 339 | |
nikmaos | 3:d4b106bf3a32 | 340 | |
nikmaos | 3:d4b106bf3a32 | 341 | |
nikmaos | 3:d4b106bf3a32 | 342 | /*Инициализация внешнего АПЦ для LM35*/ |
nikmaos | 3:d4b106bf3a32 | 343 | //создадим экземпляр АЦП если их несколько |
nikmaos | 3:d4b106bf3a32 | 344 | UART.printf("Configuring ADC\r\n"); |
nikmaos | 3:d4b106bf3a32 | 345 | DS1248_START=0; |
nikmaos | 3:d4b106bf3a32 | 346 | wait_ms(20); |
nikmaos | 3:d4b106bf3a32 | 347 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 348 | wait_ms(20); |
nikmaos | 3:d4b106bf3a32 | 349 | /*Настройка регистров в ОЗУ (описание в заголовочном файле)*/ |
nikmaos | 3:d4b106bf3a32 | 350 | ads1.MUX0.MUX_SN=1; //AIN1 |
nikmaos | 3:d4b106bf3a32 | 351 | ads1.MUX0.MUX_SP=0; //AIN0 |
nikmaos | 3:d4b106bf3a32 | 352 | ads1.MUX0.BCS=0; |
nikmaos | 3:d4b106bf3a32 | 353 | |
nikmaos | 3:d4b106bf3a32 | 354 | ads1.VBIAS.all=0; |
nikmaos | 3:d4b106bf3a32 | 355 | ads1.VBIAS.VBIAS0=0; |
nikmaos | 3:d4b106bf3a32 | 356 | |
nikmaos | 3:d4b106bf3a32 | 357 | ads1.SYS0.DR=DR20; |
nikmaos | 3:d4b106bf3a32 | 358 | ads1.SYS0.PGA=PGA_1; //=log2(PGA) пример: PGA=16 значит значение будет log2(16)=4; |
nikmaos | 3:d4b106bf3a32 | 359 | |
nikmaos | 3:d4b106bf3a32 | 360 | ads1.MUX1.MUXCAL=0; |
nikmaos | 3:d4b106bf3a32 | 361 | ads1.MUX1.REFSELT=2; |
nikmaos | 3:d4b106bf3a32 | 362 | ads1.MUX1.VREFCON=1; |
nikmaos | 3:d4b106bf3a32 | 363 | |
nikmaos | 3:d4b106bf3a32 | 364 | ads1.IDAC0.all=0; |
nikmaos | 3:d4b106bf3a32 | 365 | |
nikmaos | 3:d4b106bf3a32 | 366 | ads1.IDAC1.all=0xFF; |
nikmaos | 3:d4b106bf3a32 | 367 | |
nikmaos | 3:d4b106bf3a32 | 368 | ads1.FSC.all=1*(0x400000); //масштаб АЦП (наверное не коэффициент усиления) |
nikmaos | 3:d4b106bf3a32 | 369 | /*Конец*/ |
nikmaos | 3:d4b106bf3a32 | 370 | //Записать в чип |
nikmaos | 3:d4b106bf3a32 | 371 | ADS1248SettingReg(&ads1); |
nikmaos | 3:d4b106bf3a32 | 372 | if(ads1.SYS0.all==ADS1248ReadRegister(DS1248_REGISTER_SYS0,1)) //30.07.2020/8:40 |
nikmaos | 3:d4b106bf3a32 | 373 | UART.printf("ADS is configured \r\nMUX1 =%d\r\n",ADS1248ReadRegister(DS1248_REGISTER_SYS0,1)); |
nikmaos | 3:d4b106bf3a32 | 374 | ADSRdy.fall(&readads);//виснет без платы (решение - закомментить) |
nikmaos | 3:d4b106bf3a32 | 375 | wait_ms(20); |
nikmaos | 3:d4b106bf3a32 | 376 | //ADS1248SleepCommand();//временно отключаем чтобы при старте не началось считывание |
nikmaos | 3:d4b106bf3a32 | 377 | DS1248_START=0; |
nikmaos | 3:d4b106bf3a32 | 378 | |
nikmaos | 3:d4b106bf3a32 | 379 | /*Инициализация внещнего ЦАП*/ |
nikmaos | 3:d4b106bf3a32 | 380 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 381 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 382 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 383 | UART.printf("DAC is configured\r\n"); |
nikmaos | 3:d4b106bf3a32 | 384 | |
nikmaos | 3:d4b106bf3a32 | 385 | //обнуление режима работы ПИД |
nikmaos | 3:d4b106bf3a32 | 386 | Mem.PID.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 387 | Mem.PID_R.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 388 | /*Тестовая кнопка для включения PID*/ |
nikmaos | 3:d4b106bf3a32 | 389 | //button.fall(&pressed); |
nikmaos | 3:d4b106bf3a32 | 390 | //Калибрануть если есть дисплей |
nikmaos | 3:d4b106bf3a32 | 391 | if(TFT.IsOn()){ |
nikmaos | 3:d4b106bf3a32 | 392 | UART.printf("Process of calibration\r\n"); |
nikmaos | 3:d4b106bf3a32 | 393 | disp.Calibration(Mem.calibration,0); |
nikmaos | 3:d4b106bf3a32 | 394 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 395 | UART.printf("Calibrated\r\n");} |
nikmaos | 3:d4b106bf3a32 | 396 | disp.activeScreen = TEST_CHROM_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 397 | disp.pressedButton = NONE_PRESS; |
nikmaos | 3:d4b106bf3a32 | 398 | |
nikmaos | 3:d4b106bf3a32 | 399 | // change active screen depending on pressed area |
nikmaos | 3:d4b106bf3a32 | 400 | while(1) { |
nikmaos | 3:d4b106bf3a32 | 401 | |
nikmaos | 3:d4b106bf3a32 | 402 | if(TFT.IsOn()) |
nikmaos | 3:d4b106bf3a32 | 403 | //проверка включения дисплея |
nikmaos | 3:d4b106bf3a32 | 404 | { |
nikmaos | 3:d4b106bf3a32 | 405 | disp.pressedButton = disp.GetTouch(); |
nikmaos | 3:d4b106bf3a32 | 406 | //-------------------------------ChromTestScreen------------------------ |
nikmaos | 3:d4b106bf3a32 | 407 | if (disp.activeScreen == TEST_CHROM_SCREEN) { |
nikmaos | 3:d4b106bf3a32 | 408 | disp.ChromTest(LM35_0.temp,RAS.temp,temp,rashod_u); |
nikmaos | 3:d4b106bf3a32 | 409 | if(disp.pressedButton){ |
nikmaos | 3:d4b106bf3a32 | 410 | wait_ms(100); |
nikmaos | 3:d4b106bf3a32 | 411 | if(disp.pressedButton==CHROM_TEMP_PRESS){ |
nikmaos | 3:d4b106bf3a32 | 412 | disp.pressedButton = NONE_PRESS; |
nikmaos | 3:d4b106bf3a32 | 413 | disp.activeScreen=MENU_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 414 | } |
nikmaos | 3:d4b106bf3a32 | 415 | } |
nikmaos | 3:d4b106bf3a32 | 416 | } |
nikmaos | 3:d4b106bf3a32 | 417 | // --------------------------------------------------------------------- |
nikmaos | 3:d4b106bf3a32 | 418 | // Main menu screen |
nikmaos | 3:d4b106bf3a32 | 419 | if (disp.activeScreen == MENU_SCREEN) { |
nikmaos | 3:d4b106bf3a32 | 420 | disp.MainMenu(LM35_0.temp, LM35_0.temp);//сюда писать значения (наверное) (расход/температура) |
nikmaos | 3:d4b106bf3a32 | 421 | if (disp.pressedButton) { |
nikmaos | 3:d4b106bf3a32 | 422 | wait_ms(150); |
nikmaos | 3:d4b106bf3a32 | 423 | if (disp.pressedButton == CURR_TEMP_PRESS) { |
nikmaos | 3:d4b106bf3a32 | 424 | disp.activeScreen = CURR_TEMP_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 425 | } else if (disp.pressedButton == CURR_HUM_PRESS) { |
nikmaos | 3:d4b106bf3a32 | 426 | disp.activeScreen = CURR_HUM_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 427 | } |
nikmaos | 3:d4b106bf3a32 | 428 | disp.pressedButton = NONE_PRESS; |
nikmaos | 3:d4b106bf3a32 | 429 | } |
nikmaos | 3:d4b106bf3a32 | 430 | |
nikmaos | 3:d4b106bf3a32 | 431 | // --------------------------------------------------------------------- |
nikmaos | 3:d4b106bf3a32 | 432 | // Any other screen |
nikmaos | 3:d4b106bf3a32 | 433 | } else { |
nikmaos | 3:d4b106bf3a32 | 434 | // ---------------------------------------------------------------------------------------------- |
nikmaos | 3:d4b106bf3a32 | 435 | // You can back to main menu from any screen |
nikmaos | 3:d4b106bf3a32 | 436 | if (disp.pressedButton == MENU_PRESS) { |
nikmaos | 3:d4b106bf3a32 | 437 | disp.pressedButton = NONE_PRESS; |
nikmaos | 3:d4b106bf3a32 | 438 | disp.activeScreen = MENU_SCREEN; |
nikmaos | 3:d4b106bf3a32 | 439 | } else { |
nikmaos | 3:d4b106bf3a32 | 440 | // ---------------------------------------------------------------------------------------------- |
nikmaos | 3:d4b106bf3a32 | 441 | // Screen with current temperature / humidity |
nikmaos | 3:d4b106bf3a32 | 442 | if (disp.activeScreen == CURR_TEMP_SCREEN) { |
nikmaos | 3:d4b106bf3a32 | 443 | disp.CurrentTemperature(LM35_0.temp);//и сюда тоже |
nikmaos | 3:d4b106bf3a32 | 444 | } else if (disp.activeScreen == CURR_HUM_SCREEN) { |
nikmaos | 3:d4b106bf3a32 | 445 | disp.CurrentHumidity(LM35_0.temp);//и сюда |
nikmaos | 3:d4b106bf3a32 | 446 | } |
nikmaos | 3:d4b106bf3a32 | 447 | } |
nikmaos | 3:d4b106bf3a32 | 448 | } |
nikmaos | 3:d4b106bf3a32 | 449 | }//Проверка включения дисплея |
nikmaos | 3:d4b106bf3a32 | 450 | } |
nikmaos | 3:d4b106bf3a32 | 451 | } |
nikmaos | 3:d4b106bf3a32 | 452 | |
nikmaos | 3:d4b106bf3a32 | 453 | |
nikmaos | 3:d4b106bf3a32 | 454 | |
nikmaos | 3:d4b106bf3a32 | 455 | /*команды*/ |
vitlog | 0:98fcc06c66bf | 456 | void ComandCheck() |
vitlog | 0:98fcc06c66bf | 457 | { |
vitlog | 0:98fcc06c66bf | 458 | if(UART.getc()=='/') |
vitlog | 0:98fcc06c66bf | 459 | { |
vitlog | 0:98fcc06c66bf | 460 | UART_gets(16); //моя функция на время |
vitlog | 0:98fcc06c66bf | 461 | UART.printf("%c\r\n",str[0]); |
vitlog | 0:98fcc06c66bf | 462 | switch (str[0]){ |
nikmaos | 3:d4b106bf3a32 | 463 | /*Проверка платы SB-1 SWEN*/ |
nikmaos | 3:d4b106bf3a32 | 464 | case 'i':{ |
nikmaos | 3:d4b106bf3a32 | 465 | if (str[1]=='1') |
nikmaos | 3:d4b106bf3a32 | 466 | {SB1_SWEN=1; |
nikmaos | 3:d4b106bf3a32 | 467 | UART.printf("SW is ON\r\n");} |
nikmaos | 3:d4b106bf3a32 | 468 | else if (str[1]=='0') |
nikmaos | 3:d4b106bf3a32 | 469 | {SB1_SWEN=0; |
nikmaos | 3:d4b106bf3a32 | 470 | UART.printf("SW is OFF\r\n");} |
nikmaos | 3:d4b106bf3a32 | 471 | else if (str[1]=='a') |
nikmaos | 3:d4b106bf3a32 | 472 | { |
nikmaos | 3:d4b106bf3a32 | 473 | PosAw=1; |
nikmaos | 3:d4b106bf3a32 | 474 | PosBw=0; |
nikmaos | 3:d4b106bf3a32 | 475 | wait_ms(50); |
nikmaos | 3:d4b106bf3a32 | 476 | PosAw=0; |
nikmaos | 3:d4b106bf3a32 | 477 | PosBw=0; |
nikmaos | 3:d4b106bf3a32 | 478 | } |
nikmaos | 3:d4b106bf3a32 | 479 | else if (str[1]=='b') |
nikmaos | 3:d4b106bf3a32 | 480 | { |
nikmaos | 3:d4b106bf3a32 | 481 | PosAw=0; |
nikmaos | 3:d4b106bf3a32 | 482 | PosBw=1; |
nikmaos | 3:d4b106bf3a32 | 483 | wait_ms(50); |
nikmaos | 3:d4b106bf3a32 | 484 | PosAw=0; |
nikmaos | 3:d4b106bf3a32 | 485 | PosBw=0; |
nikmaos | 3:d4b106bf3a32 | 486 | } |
nikmaos | 3:d4b106bf3a32 | 487 | else if (str[1]=='r') |
nikmaos | 3:d4b106bf3a32 | 488 | { |
nikmaos | 3:d4b106bf3a32 | 489 | char a='0'; |
nikmaos | 3:d4b106bf3a32 | 490 | if (PosAr) |
nikmaos | 3:d4b106bf3a32 | 491 | a='a'; |
nikmaos | 3:d4b106bf3a32 | 492 | else if (PosBr) |
nikmaos | 3:d4b106bf3a32 | 493 | a='b'; |
nikmaos | 3:d4b106bf3a32 | 494 | UART.printf("POS is %c",a); |
nikmaos | 3:d4b106bf3a32 | 495 | } |
vitlog | 1:5d28312892aa | 496 | break;} |
nikmaos | 3:d4b106bf3a32 | 497 | case 'k':{//настройки ПИДа температуры колонки |
nikmaos | 3:d4b106bf3a32 | 498 | PID1.detach(); |
nikmaos | 3:d4b106bf3a32 | 499 | LT1446_0.dacB.Code=0; |
nikmaos | 3:d4b106bf3a32 | 500 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 501 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 502 | switch (str[1]){ |
nikmaos | 3:d4b106bf3a32 | 503 | case 'P':{ |
nikmaos | 3:d4b106bf3a32 | 504 | Mem.PID.kP=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 505 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 506 | UART.printf("P=%f\r\n",Mem.PID.kP); |
nikmaos | 3:d4b106bf3a32 | 507 | break; |
nikmaos | 3:d4b106bf3a32 | 508 | } |
nikmaos | 3:d4b106bf3a32 | 509 | case 'I':{ |
nikmaos | 3:d4b106bf3a32 | 510 | Mem.PID.kI=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 511 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 512 | UART.printf("I=%f\r\n",Mem.PID.kI); |
nikmaos | 3:d4b106bf3a32 | 513 | break; |
nikmaos | 3:d4b106bf3a32 | 514 | } |
nikmaos | 3:d4b106bf3a32 | 515 | case 'D':{ |
nikmaos | 3:d4b106bf3a32 | 516 | Mem.PID.kD=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 517 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 518 | UART.printf("D=%f\r\n",Mem.PID.kD); |
nikmaos | 3:d4b106bf3a32 | 519 | break; |
nikmaos | 3:d4b106bf3a32 | 520 | } |
nikmaos | 3:d4b106bf3a32 | 521 | case 'f':{ |
nikmaos | 3:d4b106bf3a32 | 522 | setPIDdefault(&Mem.PID,&PID_defs); |
nikmaos | 3:d4b106bf3a32 | 523 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 524 | UART.printf("PID is default\r\n"); |
nikmaos | 3:d4b106bf3a32 | 525 | break;} |
nikmaos | 3:d4b106bf3a32 | 526 | default:break; |
nikmaos | 3:d4b106bf3a32 | 527 | } |
nikmaos | 3:d4b106bf3a32 | 528 | //задание уставки температуры |
nikmaos | 3:d4b106bf3a32 | 529 | if ((str[1]>='0')&&(str[1]<='9')){ |
nikmaos | 3:d4b106bf3a32 | 530 | temp=(str[1]-'0')*10+(str[2]-'0'); |
nikmaos | 3:d4b106bf3a32 | 531 | UART.printf("temp= %d\r\n",temp); } |
nikmaos | 3:d4b106bf3a32 | 532 | break;} |
nikmaos | 3:d4b106bf3a32 | 533 | |
vitlog | 1:5d28312892aa | 534 | case 't':{ |
nikmaos | 3:d4b106bf3a32 | 535 | //начать чтение температуры |
nikmaos | 3:d4b106bf3a32 | 536 | //отключаем отображение для перенастройки, настраиваем, записываем, включаем обратно отображение с новым параметром |
nikmaos | 3:d4b106bf3a32 | 537 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 538 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 539 | ADS1248WakeupCommand(); |
nikmaos | 3:d4b106bf3a32 | 540 | ads1.MUX0.MUX_SN=1; //AIN1 |
nikmaos | 3:d4b106bf3a32 | 541 | ads1.MUX0.MUX_SP=0; //AIN0 |
nikmaos | 3:d4b106bf3a32 | 542 | ads1.VBIAS.all=0; |
nikmaos | 3:d4b106bf3a32 | 543 | ADS1248SettingReg(&ads1); |
nikmaos | 3:d4b106bf3a32 | 544 | UART.printf("Temperature reading started.\r\n"); |
vitlog | 1:5d28312892aa | 545 | //снять показания термодатчика |
nikmaos | 3:d4b106bf3a32 | 546 | //LM35_start(0.25); |
nikmaos | 3:d4b106bf3a32 | 547 | printer_p=&printtemp; |
nikmaos | 3:d4b106bf3a32 | 548 | lm_temp.attach(printer_p,0.1); |
vitlog | 1:5d28312892aa | 549 | break;} |
nikmaos | 3:d4b106bf3a32 | 550 | |
vitlog | 0:98fcc06c66bf | 551 | case 'p':{ |
vitlog | 0:98fcc06c66bf | 552 | pga280gain=str[1]; //присваиваем числовое значение команды взятое из символа цифры |
vitlog | 0:98fcc06c66bf | 553 | pga280gain-=0x30; |
vitlog | 0:98fcc06c66bf | 554 | ch=5; |
vitlog | 0:98fcc06c66bf | 555 | pga280_setGAIN(pga280gain,ch); |
vitlog | 0:98fcc06c66bf | 556 | ch=0; |
vitlog | 0:98fcc06c66bf | 557 | break;} |
nikmaos | 3:d4b106bf3a32 | 558 | |
nikmaos | 3:d4b106bf3a32 | 559 | case 'g': { //включить нужный ПИД |
nikmaos | 3:d4b106bf3a32 | 560 | if(str[1]=='p') |
nikmaos | 3:d4b106bf3a32 | 561 | { |
nikmaos | 3:d4b106bf3a32 | 562 | switch(str[2]) |
nikmaos | 3:d4b106bf3a32 | 563 | {//gp1 |
nikmaos | 3:d4b106bf3a32 | 564 | case '1'://первый - температура |
nikmaos | 3:d4b106bf3a32 | 565 | { |
nikmaos | 3:d4b106bf3a32 | 566 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 567 | pressed(); |
nikmaos | 3:d4b106bf3a32 | 568 | printer_p=&printPID; |
nikmaos | 3:d4b106bf3a32 | 569 | lm_temp.attach(printer_p,0.25); |
nikmaos | 3:d4b106bf3a32 | 570 | break;} |
nikmaos | 3:d4b106bf3a32 | 571 | case '2'://второй - расход |
nikmaos | 3:d4b106bf3a32 | 572 | {//gp2 |
nikmaos | 3:d4b106bf3a32 | 573 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 574 | pid2_start(); |
nikmaos | 3:d4b106bf3a32 | 575 | printer_p=&printPID; |
nikmaos | 3:d4b106bf3a32 | 576 | lm_temp.attach(printer_p,0.25); |
nikmaos | 3:d4b106bf3a32 | 577 | break;} |
nikmaos | 3:d4b106bf3a32 | 578 | |
nikmaos | 3:d4b106bf3a32 | 579 | //остановить работу ПИД регуляторов. |
nikmaos | 3:d4b106bf3a32 | 580 | case 's':// /gps |
nikmaos | 3:d4b106bf3a32 | 581 | { |
nikmaos | 3:d4b106bf3a32 | 582 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 583 | PID1.detach(); |
nikmaos | 3:d4b106bf3a32 | 584 | PID2.detach(); |
nikmaos | 3:d4b106bf3a32 | 585 | Mem.PID.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 586 | Mem.PID_R.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 587 | LT1446_0.dacB.Code=0; |
nikmaos | 3:d4b106bf3a32 | 588 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 589 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 590 | UART.printf("PIDs is stopped\r\n"); |
nikmaos | 3:d4b106bf3a32 | 591 | break;} |
nikmaos | 3:d4b106bf3a32 | 592 | } |
nikmaos | 3:d4b106bf3a32 | 593 | } |
nikmaos | 3:d4b106bf3a32 | 594 | //запустить задачу чтения АЦП каждые 40 мс (25 герц) |
nikmaos | 3:d4b106bf3a32 | 595 | //adctask.attach(&readADC,0.04); |
nikmaos | 3:d4b106bf3a32 | 596 | break;} |
nikmaos | 3:d4b106bf3a32 | 597 | |
nikmaos | 3:d4b106bf3a32 | 598 | case's': {//остановить постоянное отображение |
nikmaos | 3:d4b106bf3a32 | 599 | //adctask.detach(); |
vitlog | 1:5d28312892aa | 600 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 601 | Mem.PID.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 602 | Mem.PID_R.enabled=0; |
nikmaos | 3:d4b106bf3a32 | 603 | //LM35_stop(); |
nikmaos | 3:d4b106bf3a32 | 604 | ADS1248SleepCommand(); |
nikmaos | 3:d4b106bf3a32 | 605 | DS1248_START=0; |
vitlog | 0:98fcc06c66bf | 606 | break;} |
nikmaos | 3:d4b106bf3a32 | 607 | |
nikmaos | 3:d4b106bf3a32 | 608 | case 'd':{//LTC1446 задание значений на ЦАП оба канала |
vitlog | 0:98fcc06c66bf | 609 | //MBFlagRegister.DAC=1; |
nikmaos | 3:d4b106bf3a32 | 610 | if (str[1]=='a')//команда = "da=xxxx" где хххх - код ЦАП |
nikmaos | 3:d4b106bf3a32 | 611 | { |
nikmaos | 3:d4b106bf3a32 | 612 | LT1446_0.dacA.Code=(str[2]-0x30)*1000+(str[3]-0x30)*100+(str[4]-0x30)*10+(str[5]-0x30); |
nikmaos | 3:d4b106bf3a32 | 613 | UART.printf("%d\r\n",LT1446_0.dacA.Code); |
nikmaos | 3:d4b106bf3a32 | 614 | } |
nikmaos | 3:d4b106bf3a32 | 615 | if (str[1]=='b') |
nikmaos | 3:d4b106bf3a32 | 616 | { |
nikmaos | 3:d4b106bf3a32 | 617 | LT1446_0.dacB.Code=(str[2]-0x30)*1000+(str[3]-0x30)*100+(str[4]-0x30)*10+(str[5]-0x30); |
nikmaos | 3:d4b106bf3a32 | 618 | UART.printf("%d\r\n",LT1446_0.dacB.Code); |
nikmaos | 3:d4b106bf3a32 | 619 | } |
nikmaos | 3:d4b106bf3a32 | 620 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 621 | break;} |
vitlog | 0:98fcc06c66bf | 622 | case 'e':{ |
vitlog | 0:98fcc06c66bf | 623 | tempdata=pga280_readOneRegisterDevice(PGA280_ERROR_ADR,5);//чтение ошибок |
vitlog | 0:98fcc06c66bf | 624 | printf("ERRORS %X\n",tempdata); |
vitlog | 0:98fcc06c66bf | 625 | break;} |
nikmaos | 3:d4b106bf3a32 | 626 | case 'r':{//выключить ПИД 2 перед манипуляциями с ним |
nikmaos | 3:d4b106bf3a32 | 627 | PID2.detach(); |
nikmaos | 3:d4b106bf3a32 | 628 | //задающее воздействие =0; |
nikmaos | 3:d4b106bf3a32 | 629 | LT1446_0.dacA.Code=0; |
nikmaos | 3:d4b106bf3a32 | 630 | LT1446_0.dacB.Code=0; |
nikmaos | 3:d4b106bf3a32 | 631 | LTCwrite(<1446_0); |
nikmaos | 3:d4b106bf3a32 | 632 | //обработка команд |
nikmaos | 3:d4b106bf3a32 | 633 | switch (str[1]){ |
nikmaos | 3:d4b106bf3a32 | 634 | case 'P':{ |
nikmaos | 3:d4b106bf3a32 | 635 | Mem.PID_R.kP=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 636 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 637 | UART.printf("P=%f\r\n",Mem.PID_R.kP); |
nikmaos | 3:d4b106bf3a32 | 638 | break; |
nikmaos | 3:d4b106bf3a32 | 639 | } |
nikmaos | 3:d4b106bf3a32 | 640 | case 'I':{ |
nikmaos | 3:d4b106bf3a32 | 641 | Mem.PID_R.kI=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 642 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 643 | UART.printf("I=%f\r\n",Mem.PID_R.kI); |
nikmaos | 3:d4b106bf3a32 | 644 | break; |
nikmaos | 3:d4b106bf3a32 | 645 | } |
nikmaos | 3:d4b106bf3a32 | 646 | case 'D':{ |
nikmaos | 3:d4b106bf3a32 | 647 | Mem.PID_R.kD=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 648 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 649 | UART.printf("D=%f\r\n",Mem.PID_R.kD); |
nikmaos | 3:d4b106bf3a32 | 650 | break; |
nikmaos | 3:d4b106bf3a32 | 651 | } |
nikmaos | 3:d4b106bf3a32 | 652 | case 'f':{// /rf |
nikmaos | 3:d4b106bf3a32 | 653 | setPIDdefault(&Mem.PID_R,&PID_defs); |
nikmaos | 3:d4b106bf3a32 | 654 | Mem_write(); |
nikmaos | 3:d4b106bf3a32 | 655 | UART.printf("PID is default\r\n"); |
nikmaos | 3:d4b106bf3a32 | 656 | break;} |
nikmaos | 3:d4b106bf3a32 | 657 | case 'g':{//запуск чтения расхода /rg |
nikmaos | 3:d4b106bf3a32 | 658 | lm_temp.detach(); |
nikmaos | 3:d4b106bf3a32 | 659 | DS1248_START=1; |
nikmaos | 3:d4b106bf3a32 | 660 | ADS1248WakeupCommand(); |
nikmaos | 3:d4b106bf3a32 | 661 | ads1.MUX0.MUX_SN=3; //AIN3 |
nikmaos | 3:d4b106bf3a32 | 662 | ads1.MUX0.MUX_SP=2; //AIN2 |
nikmaos | 3:d4b106bf3a32 | 663 | ads1.VBIAS.VBIAS3=1; |
nikmaos | 3:d4b106bf3a32 | 664 | ADS1248SettingReg(&ads1); |
nikmaos | 3:d4b106bf3a32 | 665 | UART.printf("Rashod reading started.\r\n"); |
nikmaos | 3:d4b106bf3a32 | 666 | printer_p=&printtemp; |
nikmaos | 3:d4b106bf3a32 | 667 | lm_temp.attach(printer_p,0.1); |
nikmaos | 3:d4b106bf3a32 | 668 | break;} |
nikmaos | 3:d4b106bf3a32 | 669 | |
nikmaos | 3:d4b106bf3a32 | 670 | case 'u':{ // ru=xx.xx; точка обязательна |
nikmaos | 3:d4b106bf3a32 | 671 | //задание уставки расхода |
nikmaos | 3:d4b106bf3a32 | 672 | rashod_u=BufToFloat(str); |
nikmaos | 3:d4b106bf3a32 | 673 | UART.printf("Rashod = %0.3f\r\n",rashod_u); |
nikmaos | 3:d4b106bf3a32 | 674 | break;} |
nikmaos | 3:d4b106bf3a32 | 675 | default:break; |
nikmaos | 3:d4b106bf3a32 | 676 | } |
nikmaos | 3:d4b106bf3a32 | 677 | |
nikmaos | 3:d4b106bf3a32 | 678 | if((str[1]=='e')&&(str[2]=='s')&&(str[3]=='e')&&(str[4]=='t')){ |
vitlog | 0:98fcc06c66bf | 679 | //перезагрука |
vitlog | 0:98fcc06c66bf | 680 | printf("System Reset\r\n"); |
nikmaos | 3:d4b106bf3a32 | 681 | NVIC_SystemReset();} |
nikmaos | 3:d4b106bf3a32 | 682 | if ((str[1]=='e')&&(str[2]=='c')&&(str[3]=='a')&&(str[4]=='l')){ |
nikmaos | 3:d4b106bf3a32 | 683 | disp.Calibration(Mem.calibration,1); |
nikmaos | 3:d4b106bf3a32 | 684 | UART.printf("Recalibrated\r\n"); |
nikmaos | 3:d4b106bf3a32 | 685 | }; |
vitlog | 0:98fcc06c66bf | 686 | break;} |
vitlog | 0:98fcc06c66bf | 687 | default: |
vitlog | 0:98fcc06c66bf | 688 | //MBFlagRegister.TMLS=0; //починка зависания (не работает) |
vitlog | 0:98fcc06c66bf | 689 | break; |
vitlog | 0:98fcc06c66bf | 690 | } |
vitlog | 0:98fcc06c66bf | 691 | } |
vitlog | 0:98fcc06c66bf | 692 | } |
vitlog | 0:98fcc06c66bf | 693 |