test

Dependencies:   ad5422_arduino mbed LT1446 ADS1248-1 LM35-1 Flash FT813 PGA280_ADS1259

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?

UserRevisionLine numberNew 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(&LT1446_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(&LT1446_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(&LT1446_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(&LT1446_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(&LT1446_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(&LT1446_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(&LT1446_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(&LT1446_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(&LT1446_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