Continuation (clone) mbed-os5-inerrupt_serial_readable_FIFO_12 Connected EEPROM. Now the settings are retrieved from it upon reboot. A watchdog timer has been created that expires after 100ms.

Dependencies:   _24LCXXX

Committer:
Aleksk
Date:
Fri May 15 08:37:36 2020 +0000
Revision:
3:712f751b4974
Parent:
2:8230a5a4cc13
Continuation (clone) mbed-os5-inerrupt_serial_readable_FIFO_12; Connected EEPROM. Now the settings are retrieved from it upon reboot. A watchdog timer has been created that expires after 100ms.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Aleksk 3:712f751b4974 1 // Продолжение (клон )mbed-os5-inerrupt_serial_readable_FIFO_12
Aleksk 3:712f751b4974 2 // Подключена EEPROM. Теперь уставки извлекаются из неё при перезагрузке.
Aleksk 2:8230a5a4cc13 3 // Создан сторожевой таймер, который истекает через 100мс
Aleksk 0:f2aaa8c6decf 4 #include "mbed.h"
Aleksk 2:8230a5a4cc13 5 #include "_24LCXXX.h"
Aleksk 2:8230a5a4cc13 6
Aleksk 2:8230a5a4cc13 7 I2C i2c(PB_9,PB_8); // sda, scl
Aleksk 2:8230a5a4cc13 8 _24LCXXX eeprom(&i2c, 0x50);
Aleksk 0:f2aaa8c6decf 9
Aleksk 0:f2aaa8c6decf 10 AnalogIn analog_value(A0); //подключение аналогового входа A0
Aleksk 0:f2aaa8c6decf 11 DigitalOut led(LED1);
Aleksk 0:f2aaa8c6decf 12 DigitalOut digital_4(PB_5); //initialize digital pin 4 as an output (high pressure air bulb charge).
Aleksk 0:f2aaa8c6decf 13 DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge
Aleksk 0:f2aaa8c6decf 14 RawSerial pc(USBTX, USBRX, 115200); // tx, rx for F411RE in port command string
Aleksk 0:f2aaa8c6decf 15 RawSerial plotter(PA_9, PA_10, 115200); // tx, rx for F411RE out port for serial_plotter
Aleksk 0:f2aaa8c6decf 16 EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5
Aleksk 0:f2aaa8c6decf 17 Timer timer; //инициализация таймера
Aleksk 2:8230a5a4cc13 18 //========УСТАВКИ========
Aleksk 2:8230a5a4cc13 19 uint8_t flag_autoset = 0; //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
Aleksk 2:8230a5a4cc13 20 uint8_t flag_plotter = 0; //отладочный флаг. При 0 - запрет печати в плоттер, при 1 - разрешение
Aleksk 2:8230a5a4cc13 21 int value = 0; //set begin value "pressure" 1...3300
Aleksk 2:8230a5a4cc13 22 uint8_t delta_value = 0; //set delta pressure 1...99
Aleksk 2:8230a5a4cc13 23 //=======================
Aleksk 0:f2aaa8c6decf 24 int value_auto=250 ; //set begin value auto "pressure"
Aleksk 0:f2aaa8c6decf 25 int sensor_value =0; //напряжение с аналогового входа А0 (текущее давление)
Aleksk 2:8230a5a4cc13 26 int counter_cycle1 = 0; //счётчик цикла while(true)
Aleksk 2:8230a5a4cc13 27 int counter_cycle2 = 0; //счётчик внутри функции auto_set
Aleksk 0:f2aaa8c6decf 28 int sig = 1; //знак инкримента для автоустаки
Aleksk 0:f2aaa8c6decf 29 // FIFO_buffer must be full (only char and '\0')
Aleksk 0:f2aaa8c6decf 30 //#define maxnsym 24 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
Aleksk 0:f2aaa8c6decf 31 #define maxnsym 26 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
Aleksk 0:f2aaa8c6decf 32 char Source[maxnsym]="$press,1000,25,0,0,2050**"; //23 char- string ,весь массив со строкой для поиска 23+1(null terminal)=24
Aleksk 0:f2aaa8c6decf 33 //уставки и контрольная сумма умноженная на два, должны быть больше нуля
Aleksk 0:f2aaa8c6decf 34 char trueSource[maxnsym]; //верифицированная строка для callback
Aleksk 2:8230a5a4cc13 35 char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback
Aleksk 0:f2aaa8c6decf 36
Aleksk 0:f2aaa8c6decf 37 volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором
Aleksk 0:f2aaa8c6decf 38 volatile bool flag_comand_detected = false; //если строка декодирована правильно то true
Aleksk 2:8230a5a4cc13 39 volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана
Aleksk 2:8230a5a4cc13 40 //_____________________________________________________________________________
Aleksk 2:8230a5a4cc13 41 void save_EEPROM () {
Aleksk 2:8230a5a4cc13 42 int data2;
Aleksk 2:8230a5a4cc13 43 pc.printf("EEPROM write------\r\n");
Aleksk 2:8230a5a4cc13 44 eeprom.byte_write(0, delta_value);
Aleksk 2:8230a5a4cc13 45 eeprom.byte_write(1, flag_autoset);
Aleksk 2:8230a5a4cc13 46 eeprom.byte_write(2, flag_plotter);
Aleksk 2:8230a5a4cc13 47 data2 = value;
Aleksk 2:8230a5a4cc13 48 eeprom.nbyte_write( 10, &data2, sizeof(int));
Aleksk 2:8230a5a4cc13 49 }
Aleksk 2:8230a5a4cc13 50 //_____________________________________________________________________________
Aleksk 2:8230a5a4cc13 51 void load_EEPROM () {
Aleksk 2:8230a5a4cc13 52 uint8_t data1;
Aleksk 2:8230a5a4cc13 53 int data2;
Aleksk 2:8230a5a4cc13 54 pc.printf("EEPROM read------\r\n");
Aleksk 2:8230a5a4cc13 55 eeprom.nbyte_read( 0, &data1, 1 );
Aleksk 2:8230a5a4cc13 56 pc.printf("adress 0 =%d \r\n",data1);
Aleksk 2:8230a5a4cc13 57 delta_value=data1;
Aleksk 2:8230a5a4cc13 58 eeprom.nbyte_read( 1, &data1, 1 );
Aleksk 2:8230a5a4cc13 59 pc.printf("adress 1 =%d \r\n",data1);
Aleksk 2:8230a5a4cc13 60 flag_autoset=data1;
Aleksk 2:8230a5a4cc13 61 eeprom.nbyte_read( 2, &data1, 1 );
Aleksk 2:8230a5a4cc13 62 pc.printf("adress 2 =%d \r\n",data1);
Aleksk 2:8230a5a4cc13 63 flag_plotter=data1;
Aleksk 2:8230a5a4cc13 64 eeprom.nbyte_read( 10, &data2, sizeof(int) );
Aleksk 2:8230a5a4cc13 65 pc.printf("adress 10 = %d \r\n",data2);
Aleksk 2:8230a5a4cc13 66 value=data2;
Aleksk 2:8230a5a4cc13 67 }
Aleksk 0:f2aaa8c6decf 68 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 69 void substring(char *s,char *d,int pos,int len) {
Aleksk 0:f2aaa8c6decf 70 //usage: substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 71 char *t;
Aleksk 0:f2aaa8c6decf 72 s=s+(pos-1);
Aleksk 0:f2aaa8c6decf 73 t=s+len;
Aleksk 0:f2aaa8c6decf 74 while (s!=t) {
Aleksk 0:f2aaa8c6decf 75 *d=*s;
Aleksk 0:f2aaa8c6decf 76 s++;
Aleksk 0:f2aaa8c6decf 77 d++;
Aleksk 0:f2aaa8c6decf 78 }
Aleksk 0:f2aaa8c6decf 79 *d='\0';
Aleksk 0:f2aaa8c6decf 80 }
Aleksk 0:f2aaa8c6decf 81 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 82 void onDataReceived(); // callback
Aleksk 0:f2aaa8c6decf 83 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 84 void read_serial(void) {
Aleksk 0:f2aaa8c6decf 85 char Destination[50];
Aleksk 0:f2aaa8c6decf 86 int pos,len;
Aleksk 0:f2aaa8c6decf 87 int controlSum1, controlSum2;
Aleksk 0:f2aaa8c6decf 88 int value_, delta_value_, flag_autoset_, flag_plotter_;
Aleksk 0:f2aaa8c6decf 89 int ch = '$'; // Код искомого символа
Aleksk 0:f2aaa8c6decf 90 int indexCh; // Char on position
Aleksk 0:f2aaa8c6decf 91 char *ach; // Указатель на искомую переменную в строке, по которой осуществляется поиск.
Aleksk 0:f2aaa8c6decf 92 while(pc.readable()) {
Aleksk 0:f2aaa8c6decf 93 chr_a = pc.getc();
Aleksk 0:f2aaa8c6decf 94 //_____FIFO_buffer_begin_____
Aleksk 0:f2aaa8c6decf 95 for ( int i = 2; i < maxnsym; i++) {
Aleksk 0:f2aaa8c6decf 96 Source[i-2]=Source[i-1];
Aleksk 0:f2aaa8c6decf 97 }
Aleksk 0:f2aaa8c6decf 98 Source[maxnsym-2]=chr_a; //предпоследний элемент
Aleksk 0:f2aaa8c6decf 99 Source[maxnsym-1] ='\0'; //последний элемент массива это нуль-терминал для формирования конца строки в Си
Aleksk 0:f2aaa8c6decf 100 //_____FIFO_buffer_end_______
Aleksk 0:f2aaa8c6decf 101 }
Aleksk 0:f2aaa8c6decf 102 ach=strchr (Source,ch); //поиск первого вхождения символа в строку , ищем указатель символа ‘$’
Aleksk 0:f2aaa8c6decf 103 if (ach==NULL) {
Aleksk 0:f2aaa8c6decf 104 //pc.printf ("Char not finded \r\n"); //Символ $ в строке не найден
Aleksk 0:f2aaa8c6decf 105 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 106 }
Aleksk 0:f2aaa8c6decf 107 else {
Aleksk 0:f2aaa8c6decf 108 indexCh = ach-Source+1; //вычитаем указатель из указателя!
Aleksk 0:f2aaa8c6decf 109 //pc.printf ("Char '$' on position %d\r\n",indexCh); //Искомый символ в строке на позиции
Aleksk 0:f2aaa8c6decf 110 }
Aleksk 0:f2aaa8c6decf 111 if (indexCh!=1) { //позиция символа $ не 1
Aleksk 0:f2aaa8c6decf 112 //pc.printf ("$ position not 1 \r\n");
Aleksk 0:f2aaa8c6decf 113 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 114 }
Aleksk 0:f2aaa8c6decf 115
Aleksk 0:f2aaa8c6decf 116 pos=1; //начало подстроки $press - на 1 позиции
Aleksk 0:f2aaa8c6decf 117 len=6; //длина подстроки $press равна 6
Aleksk 0:f2aaa8c6decf 118 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 119 //pc.printf("for pos=%d and len=%d resultat is d= %s\r\n", pos, len, Destination);
Aleksk 0:f2aaa8c6decf 120
Aleksk 0:f2aaa8c6decf 121 if (strcmp(Destination,"$press" ) != 0) { //функция возвращает ноль если строки совпадают
Aleksk 0:f2aaa8c6decf 122 //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки
Aleksk 0:f2aaa8c6decf 123 goto endParsing ; //в начале сообщения нет $press пропускаем парсинг
Aleksk 0:f2aaa8c6decf 124 }
Aleksk 0:f2aaa8c6decf 125 pos=8; //начало подстроки 1000 - на 8 позиции
Aleksk 0:f2aaa8c6decf 126 len=4; //длина подстроки 1000 равна 4
Aleksk 0:f2aaa8c6decf 127 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 128 value_=atoi(Destination);
Aleksk 0:f2aaa8c6decf 129 if (value_==0) {
Aleksk 0:f2aaa8c6decf 130 goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг
Aleksk 0:f2aaa8c6decf 131 }
Aleksk 0:f2aaa8c6decf 132 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, value_);
Aleksk 0:f2aaa8c6decf 133 pos=13; //начало подстроки 25 - на 13 позиции
Aleksk 0:f2aaa8c6decf 134 len=2; //длина подстроки 25 равна 2
Aleksk 0:f2aaa8c6decf 135 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 136 delta_value_=atoi(Destination);
Aleksk 0:f2aaa8c6decf 137 if (delta_value_==0) {
Aleksk 0:f2aaa8c6decf 138 goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг
Aleksk 0:f2aaa8c6decf 139 }
Aleksk 0:f2aaa8c6decf 140 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, delta_value_);
Aleksk 0:f2aaa8c6decf 141 pos=16; //начало подстроки 0 - на 16 позиции
Aleksk 0:f2aaa8c6decf 142 len=1; //длина подстроки 0 равна 1
Aleksk 0:f2aaa8c6decf 143 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 144 flag_autoset_=atoi(Destination);
Aleksk 0:f2aaa8c6decf 145 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_autoset_);
Aleksk 0:f2aaa8c6decf 146 pos=18; //начало подстроки 0 - на 18 позиции
Aleksk 0:f2aaa8c6decf 147 len=1; //длина подстроки 0 равна 1
Aleksk 0:f2aaa8c6decf 148 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 149 flag_plotter_=atoi(Destination);
Aleksk 0:f2aaa8c6decf 150 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_plotter_);
Aleksk 0:f2aaa8c6decf 151 pos=20; //начало подстроки 1025 - на 18 позиции
Aleksk 0:f2aaa8c6decf 152 len=4; //длина подстроки 1025 равна 4
Aleksk 0:f2aaa8c6decf 153 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 154 controlSum1=atoi(Destination);
Aleksk 0:f2aaa8c6decf 155 if (controlSum1==0) {
Aleksk 0:f2aaa8c6decf 156 goto endParsing; //контрольная сумма должна быть больше еденицы, пропускаем парсинг
Aleksk 0:f2aaa8c6decf 157 }
Aleksk 0:f2aaa8c6decf 158 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, controlSum1);
Aleksk 0:f2aaa8c6decf 159 controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_)*2; //удвоение чтобы не было одинаковых чисел в сообщении
Aleksk 0:f2aaa8c6decf 160 //pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2);
Aleksk 0:f2aaa8c6decf 161 if (controlSum1!=controlSum2) { //не совпала контрольная сумма
Aleksk 0:f2aaa8c6decf 162 //pc.printf ("controlSum1!=controlSum2 \r\n");
Aleksk 0:f2aaa8c6decf 163 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 164 }
Aleksk 0:f2aaa8c6decf 165 //присваиваем проверенные значения глобальным переменным
Aleksk 0:f2aaa8c6decf 166 strcpy(trueSource,Source); //копировать из Source в trueSource
Aleksk 0:f2aaa8c6decf 167 value=value_;
Aleksk 0:f2aaa8c6decf 168 delta_value=delta_value_;
Aleksk 0:f2aaa8c6decf 169 flag_autoset=flag_autoset_;
Aleksk 0:f2aaa8c6decf 170 flag_plotter=flag_plotter_;
Aleksk 0:f2aaa8c6decf 171 flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
Aleksk 0:f2aaa8c6decf 172
Aleksk 0:f2aaa8c6decf 173 endParsing:
Aleksk 0:f2aaa8c6decf 174
Aleksk 0:f2aaa8c6decf 175
Aleksk 0:f2aaa8c6decf 176 pc.attach(&onDataReceived, Serial::RxIrq); // reattach interrupt - переподключение прерывания перед выходом из функции
Aleksk 0:f2aaa8c6decf 177 }
Aleksk 0:f2aaa8c6decf 178 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 179 void onDataReceived() {
Aleksk 0:f2aaa8c6decf 180 pc.attach(nullptr, Serial::RxIrq); // detach interrupt
Aleksk 0:f2aaa8c6decf 181 queue->call(read_serial); // process in a non ISR context - переход к функции приема строки -
Aleksk 0:f2aaa8c6decf 182 } // - в статусе отключенного прерывания (учим указатели!)
Aleksk 0:f2aaa8c6decf 183 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 184 void auto_set () {
Aleksk 0:f2aaa8c6decf 185 if (counter_cycle2 >= 100 && flag_autoset == 1) {
Aleksk 0:f2aaa8c6decf 186 counter_cycle2=0;
Aleksk 0:f2aaa8c6decf 187 if (value_auto > 2800 || value_auto < 250) {
Aleksk 0:f2aaa8c6decf 188 sig = -sig; //меняем знак для изменения направления роста/спада автоуставки
Aleksk 0:f2aaa8c6decf 189 }
Aleksk 0:f2aaa8c6decf 190 value_auto = value_auto + sig * 250;
Aleksk 0:f2aaa8c6decf 191 value=value_auto;
Aleksk 0:f2aaa8c6decf 192 }
Aleksk 0:f2aaa8c6decf 193 counter_cycle2++; //увеличиваем счетчик функции auto_set() на 1
Aleksk 0:f2aaa8c6decf 194 }
Aleksk 0:f2aaa8c6decf 195 //*****************************************************************************
Aleksk 0:f2aaa8c6decf 196 //*****************************************************************************
Aleksk 0:f2aaa8c6decf 197
Aleksk 0:f2aaa8c6decf 198 int main() {
Aleksk 1:1d4ec28f17c4 199
Aleksk 0:f2aaa8c6decf 200 pc.attach(&onDataReceived, Serial::RxIrq);
Aleksk 0:f2aaa8c6decf 201 int time, valve1, valve2, countValve1=0, countValve2=0;
Aleksk 0:f2aaa8c6decf 202 int frequencyValve1, frequencyValve2;
Aleksk 0:f2aaa8c6decf 203 float raw_value_sum = 0 ;
Aleksk 2:8230a5a4cc13 204 digital_4.write(0); //valve1 off;
Aleksk 2:8230a5a4cc13 205 digital_7.write(0); //valve2 off;
Aleksk 2:8230a5a4cc13 206 load_EEPROM (); //загрузка уставок из EEPROM
Aleksk 2:8230a5a4cc13 207 if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2) {
Aleksk 2:8230a5a4cc13 208 flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора
Aleksk 2:8230a5a4cc13 209 } else {
Aleksk 2:8230a5a4cc13 210 flag_stopRegulator = true; //флаг остановки установлен
Aleksk 2:8230a5a4cc13 211 pc.printf("Regulator stopped, error in EEPROM \r\n");
Aleksk 2:8230a5a4cc13 212 }
Aleksk 2:8230a5a4cc13 213
Aleksk 1:1d4ec28f17c4 214 pc.printf("Program started \r\n");
Aleksk 2:8230a5a4cc13 215 Watchdog &watchdog = Watchdog::get_instance();
Aleksk 2:8230a5a4cc13 216 watchdog.start(100); //WDlimit = 100 ms
Aleksk 0:f2aaa8c6decf 217 timer.start();
Aleksk 1:1d4ec28f17c4 218
Aleksk 0:f2aaa8c6decf 219 while (true){ //бесконечный цикл
Aleksk 2:8230a5a4cc13 220 // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
Aleksk 2:8230a5a4cc13 221 watchdog.kick();
Aleksk 1:1d4ec28f17c4 222 if (flag_comand_detected) { //пришла правильная командная строка
Aleksk 1:1d4ec28f17c4 223 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
Aleksk 1:1d4ec28f17c4 224 value,delta_value,flag_autoset,flag_plotter,sensor_value,frequencyValve1,frequencyValve2); //текущие данные
Aleksk 0:f2aaa8c6decf 225 //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи
Aleksk 2:8230a5a4cc13 226 flag_comand_detected=false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
Aleksk 2:8230a5a4cc13 227 flag_stopRegulator=false; //сброс флага, регулятор ждет пока не будет сброшен этот флаг
Aleksk 0:f2aaa8c6decf 228 //plotter.printf("$%d %d %d %d %d;\r\n", digital_4.read()*100-110,
Aleksk 0:f2aaa8c6decf 229 // digital_7.read()*100-220, value, sensor_value, time ); //печать в плоттер в другой СОМ-порт
Aleksk 2:8230a5a4cc13 230 if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают
Aleksk 2:8230a5a4cc13 231 save_EEPROM (); //пишем в память уставки отличные от старых
Aleksk 2:8230a5a4cc13 232 load_EEPROM ();
Aleksk 2:8230a5a4cc13 233 }
Aleksk 2:8230a5a4cc13 234
Aleksk 2:8230a5a4cc13 235 strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld
Aleksk 0:f2aaa8c6decf 236 }
Aleksk 0:f2aaa8c6decf 237 float raw_value = analog_value.read(); // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
Aleksk 0:f2aaa8c6decf 238 raw_value_sum = raw_value_sum + raw_value;
Aleksk 0:f2aaa8c6decf 239
Aleksk 0:f2aaa8c6decf 240 if (counter_cycle1 > 20 ) {
Aleksk 0:f2aaa8c6decf 241 counter_cycle1=0;
Aleksk 0:f2aaa8c6decf 242 sensor_value = raw_value_sum/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 0:f2aaa8c6decf 243 raw_value_sum = 0 ;
Aleksk 2:8230a5a4cc13 244 if (flag_stopRegulator == false) { // можно запускать регулятор
Aleksk 1:1d4ec28f17c4 245 //--------------regulator begin-----------------------
Aleksk 1:1d4ec28f17c4 246 if (sensor_value > value + delta_value) {
Aleksk 1:1d4ec28f17c4 247 valve2 = digital_7.read();
Aleksk 1:1d4ec28f17c4 248 digital_7.write(1); //valve2 on;
Aleksk 1:1d4ec28f17c4 249 if (valve2 < digital_7.read()) {countValve2++;} //счётчик передних фронтов напряжения (срабатывания клапана 2)
Aleksk 1:1d4ec28f17c4 250 digital_4.write(0); //valve1 off;
Aleksk 1:1d4ec28f17c4 251 } else if (sensor_value < value - delta_value) {
Aleksk 1:1d4ec28f17c4 252 valve1 = digital_4.read();
Aleksk 1:1d4ec28f17c4 253 digital_4.write(1); //valve1 on;
Aleksk 1:1d4ec28f17c4 254 if (valve1 < digital_4.read()) {countValve1++;} //счётчик передних фронтов напряжения (срабатывания клапана 1)
Aleksk 1:1d4ec28f17c4 255 digital_7.write(0); //valve2 off;
Aleksk 1:1d4ec28f17c4 256 } else {
Aleksk 1:1d4ec28f17c4 257 digital_4.write(0); //valve1 off;
Aleksk 1:1d4ec28f17c4 258 digital_7.write(0); //valve2 off;
Aleksk 1:1d4ec28f17c4 259 }
Aleksk 1:1d4ec28f17c4 260 //--------------regulator end-------------------------
Aleksk 0:f2aaa8c6decf 261 }
Aleksk 0:f2aaa8c6decf 262 time=timer.read_us();
Aleksk 0:f2aaa8c6decf 263 if (time > 1000000) {
Aleksk 0:f2aaa8c6decf 264 timer.reset(); //начало счёта времени
Aleksk 0:f2aaa8c6decf 265 frequencyValve1 = countValve1; //частота (Гц) срабатывания клапана 1
Aleksk 0:f2aaa8c6decf 266 frequencyValve2 = countValve2; //частота (Гц) срабатывания клапана 2
Aleksk 0:f2aaa8c6decf 267 countValve1=0;
Aleksk 0:f2aaa8c6decf 268 countValve2=0;
Aleksk 0:f2aaa8c6decf 269 }
Aleksk 0:f2aaa8c6decf 270
Aleksk 0:f2aaa8c6decf 271 if (flag_plotter == 1) {
Aleksk 0:f2aaa8c6decf 272 plotter.printf("$%d %d %d %d %d %d;\r\n", digital_4.read()*100-110,
Aleksk 0:f2aaa8c6decf 273 digital_7.read()*100-220, value, sensor_value, 100*frequencyValve1, 100*frequencyValve2 ); //печать в плоттер в другой СОМ-порт (только для отладки)
Aleksk 0:f2aaa8c6decf 274 }
Aleksk 0:f2aaa8c6decf 275
Aleksk 0:f2aaa8c6decf 276 auto_set(); //Ступенчатое увеличение и уменьшение уставки value (для отладки если flag_autoset =1)
Aleksk 0:f2aaa8c6decf 277 led = !led; //гасим/зажигаем индикаторный светодиод
Aleksk 0:f2aaa8c6decf 278 }
Aleksk 0:f2aaa8c6decf 279 ThisThread::sleep_for(1); // (mc) правильный оператор задержки для mbed5
Aleksk 0:f2aaa8c6decf 280 counter_cycle1++;
Aleksk 0:f2aaa8c6decf 281
Aleksk 0:f2aaa8c6decf 282 }
Aleksk 0:f2aaa8c6decf 283 }