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