test

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

Committer:
nikmaos
Date:
Tue Aug 11 19:13:43 2020 +0000
Revision:
4:d53895f65eb7
Parent:
3:d4b106bf3a32
Child:
5:21240fa1ee4c
1108

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