test

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

Committer:
nikmaos
Date:
Thu Aug 13 14:37:39 2020 +0000
Revision:
5:21240fa1ee4c
Parent:
4:d53895f65eb7
Child:
6:cfe7cb0bdb1a
13.08

Who changed what in which revision?

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