Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 4:c34b84bfa2fb
- Parent:
- 3:712f751b4974
- Child:
- 5:bb595cde0c82
diff -r 712f751b4974 -r c34b84bfa2fb main.cpp
--- a/main.cpp Fri May 15 08:37:36 2020 +0000
+++ b/main.cpp Wed May 27 16:01:15 2020 +0000
@@ -1,28 +1,45 @@
-// Продолжение (клон )mbed-os5-inerrupt_serial_readable_FIFO_12
-// Подключена EEPROM. Теперь уставки извлекаются из неё при перезагрузке.
-// Создан сторожевой таймер, который истекает через 100мс
+// 27.05.2020 Продолжение (клон )mbed-os5-press4
+// включены все шесть аналоговых входа, читаются пять
+// при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины
+// (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM.
+// сторожевой таймер, истекает через 100мс
+//
+
#include "mbed.h"
#include "_24LCXXX.h"
I2C i2c(PB_9,PB_8); // sda, scl
_24LCXXX eeprom(&i2c, 0x50);
-AnalogIn analog_value(A0); //подключение аналогового входа A0
+AnalogIn analog_value_0(A0); //подключение аналогового входа A0
+AnalogIn analog_value_1(A1); //подключение аналогового входа A1
+AnalogIn analog_value_2(A2); //подключение аналогового входа A2
+AnalogIn analog_value_3(A3); //подключение аналогового входа A3
+AnalogIn analog_value_4(A4); //подключение аналогового входа A4
+AnalogIn analog_value_5(A5); //подключение аналогового входа A5
DigitalOut led(LED1);
DigitalOut digital_4(PB_5); //initialize digital pin 4 as an output (high pressure air bulb charge).
-DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge
-RawSerial pc(USBTX, USBRX, 115200); // tx, rx for F411RE in port command string
-RawSerial plotter(PA_9, PA_10, 115200); // tx, rx for F411RE out port for serial_plotter
+DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge)
+DigitalOut digital_5(PB_4); //initialize digital pin 5 as an output (valve3,4)
+DigitalOut digital_6(PB_10); //initialize digital pin 6 as an output (compressor on/off)
+
+RawSerial plotter(USBTX, USBRX, 115200); // tx, rx for F411RE port for serial_plotter and temporary messages
+RawSerial pc(PA_9, PA_10, 115200); // tx, rx for F411RE port for command string distance PC
EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5
Timer timer; //инициализация таймера
//========УСТАВКИ========
uint8_t flag_autoset = 0; //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
-uint8_t flag_plotter = 0; //отладочный флаг. При 0 - запрет печати в плоттер, при 1 - разрешение
-int value = 0; //set begin value "pressure" 1...3300
+uint8_t flag_plotter = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
+int value = 0; //set begin value "pressure" 1...3300
uint8_t delta_value = 0; //set delta pressure 1...99
//=======================
int value_auto=250 ; //set begin value auto "pressure"
-int sensor_value =0; //напряжение с аналогового входа А0 (текущее давление)
+int WL = 0; //напряжение с аналогового входа А0 (WL - вес опресовщика)
+int sensor_value =0; //напряжение с аналогового входа А1 (Pa - текущее давление)
+int Pb = 0; //напряжение с аналогового входа А2 (Pb - давление в баллоне)
+int Pw1 = 0; //напряжение с аналогового входа А3 (Pw1 - давление воды на входе опрессовщика)
+int Pw2 = 0; //напряжение с аналогового входа А4 (Pw2 - давление воды в контуре макета)
+int Pd = 0; //напряжение с аналогового входа А5 (Pd - дифференциальное давление опресовщика)
int counter_cycle1 = 0; //счётчик цикла while(true)
int counter_cycle2 = 0; //счётчик внутри функции auto_set
int sig = 1; //знак инкримента для автоустаки
@@ -34,13 +51,14 @@
char trueSource[maxnsym]; //верифицированная строка для callback
char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback
-volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором
-volatile bool flag_comand_detected = false; //если строка декодирована правильно то true
+volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором
+volatile bool flag_comand_detected = false; //если строка декодирована правильно то true
+volatile bool flag_zerostart = false; //если строка декодирована c нулевой контрольной суммой то true
volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана
//_____________________________________________________________________________
void save_EEPROM () {
int data2;
- pc.printf("EEPROM write------\r\n");
+ plotter.printf("EEPROM write------\r\n");
eeprom.byte_write(0, delta_value);
eeprom.byte_write(1, flag_autoset);
eeprom.byte_write(2, flag_plotter);
@@ -51,18 +69,18 @@
void load_EEPROM () {
uint8_t data1;
int data2;
- pc.printf("EEPROM read------\r\n");
+ plotter.printf("EEPROM read------\r\n");
eeprom.nbyte_read( 0, &data1, 1 );
- pc.printf("adress 0 =%d \r\n",data1);
+ plotter.printf("adress 0 =%d \r\n",data1);
delta_value=data1;
eeprom.nbyte_read( 1, &data1, 1 );
- pc.printf("adress 1 =%d \r\n",data1);
+ plotter.printf("adress 1 =%d \r\n",data1);
flag_autoset=data1;
eeprom.nbyte_read( 2, &data1, 1 );
- pc.printf("adress 2 =%d \r\n",data1);
+ plotter.printf("adress 2 =%d \r\n",data1);
flag_plotter=data1;
eeprom.nbyte_read( 10, &data2, sizeof(int) );
- pc.printf("adress 10 = %d \r\n",data2);
+ plotter.printf("adress 10 = %d \r\n",data2);
value=data2;
}
//______________________________________________________________________________
@@ -126,17 +144,19 @@
len=4; //длина подстроки 1000 равна 4
substring(Source,Destination,pos,len);
value_=atoi(Destination);
- if (value_==0) {
- goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг
- }
+ //if (value_==0) {
+ // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+ // goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг
+ //}
//pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, value_);
pos=13; //начало подстроки 25 - на 13 позиции
len=2; //длина подстроки 25 равна 2
substring(Source,Destination,pos,len);
delta_value_=atoi(Destination);
- if (delta_value_==0) {
- goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг
- }
+ //if (delta_value_==0) {
+ // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+ // goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг
+ //}
//pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, delta_value_);
pos=16; //начало подстроки 0 - на 16 позиции
len=1; //длина подстроки 0 равна 1
@@ -153,21 +173,28 @@
substring(Source,Destination,pos,len);
controlSum1=atoi(Destination);
if (controlSum1==0) {
- goto endParsing; //контрольная сумма должна быть больше еденицы, пропускаем парсинг
+ flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+ goto endParsing; //контрольная сумма должна быть больше еденицы, пропускаем парсинг
}
//pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, controlSum1);
controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_)*2; //удвоение чтобы не было одинаковых чисел в сообщении
//pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2);
if (controlSum1!=controlSum2) { //не совпала контрольная сумма
//pc.printf ("controlSum1!=controlSum2 \r\n");
- goto endParsing; //пропускаем парсинг
+ goto endParsing; //пропускаем парсинг
}
- //присваиваем проверенные значения глобальным переменным
- strcpy(trueSource,Source); //копировать из Source в trueSource
- value=value_;
- delta_value=delta_value_;
- flag_autoset=flag_autoset_;
- flag_plotter=flag_plotter_;
+ //*********присваиваем проверенные значения глобальным переменным***********
+ strcpy(trueSource,Source); //копировать из Source в trueSource
+ if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не имземняем их в регуляторе и не пишем в EEPROM
+ flag_autoset=flag_autoset_;
+ flag_plotter=flag_plotter_; //для работы кнопки Stop
+ } else {
+ value=value_;
+ delta_value=delta_value_;
+ flag_autoset=flag_autoset_;
+ flag_plotter=flag_plotter_;
+ }
+
flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
endParsing:
@@ -200,9 +227,10 @@
pc.attach(&onDataReceived, Serial::RxIrq);
int time, valve1, valve2, countValve1=0, countValve2=0;
int frequencyValve1, frequencyValve2;
- float raw_value_sum = 0 ;
+ float raw_value_sum_0=0, raw_value_sum_1=0, raw_value_sum_2=0, raw_value_sum_3=0, raw_value_sum_4=0, raw_value_sum_5=0;
digital_4.write(0); //valve1 off;
- digital_7.write(0); //valve2 off;
+ digital_7.write(0); //valve2 off;
+ digital_5.write(0); //valve3,4 off;
load_EEPROM (); //загрузка уставок из EEPROM
if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2) {
flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора
@@ -219,12 +247,28 @@
while (true){ //бесконечный цикл
// kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
watchdog.kick();
+
+ flag_stopRegulator = flag_plotter; //вывод на плоттер не актуален, теперь он будет флагом полной остановки опрессовщика
+ if (flag_stopRegulator) { //полный останов регулятора и принудительное запирание всех клапанов
+ digital_4.write(0); //valve1 off
+ digital_7.write(0); //valve2 off
+ digital_5.write(0); //valve3,4 off
+ }
+
if (flag_comand_detected) { //пришла правильная командная строка
- pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
- value,delta_value,flag_autoset,flag_plotter,sensor_value,frequencyValve1,frequencyValve2); //текущие данные
+ pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+ value,delta_value,flag_autoset,flag_plotter,
+ sensor_value,frequencyValve1,frequencyValve2,
+ WL,Pb,Pw1,Pw2,Pd,
+ digital_4.read(),digital_7.read(),digital_5.read()); //передача текущих значений в РС
+
+ // pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+ // value,delta_value,flag_autoset,flag_plotter,
+ // sensor_value,frequencyValve1,frequencyValve2); //передача текущих значений в РС
+
//pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи
- flag_comand_detected=false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
- flag_stopRegulator=false; //сброс флага, регулятор ждет пока не будет сброшен этот флаг
+ flag_comand_detected = false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
+ //flag_stopRegulator = false; //сброс флага, регулятор ждет пока не будет сброшен этот флаг
//plotter.printf("$%d %d %d %d %d;\r\n", digital_4.read()*100-110,
// digital_7.read()*100-220, value, sensor_value, time ); //печать в плоттер в другой СОМ-порт
if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают
@@ -234,14 +278,51 @@
strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld
}
- float raw_value = analog_value.read(); // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
- raw_value_sum = raw_value_sum + raw_value;
+
+ if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
+ pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+ value,delta_value,flag_autoset,flag_plotter,
+ sensor_value,frequencyValve1,frequencyValve2,
+ WL,Pb,Pw1,Pw2,Pd,
+ digital_4.read(),digital_7.read(),digital_5.read()); //передача текущих значений в РС
+ flag_zerostart = false;
+ }
+
+ if (counter_cycle1 < 10 ) {
+ float raw_value_0 = analog_value_0.read(); // Чтение аналогового входа 0 (0.0 to 1.0 = full ADC диапазон)
+ raw_value_sum_0 = raw_value_sum_0 + raw_value_0;
+ float raw_value_1 = analog_value_1.read(); // Чтение аналогового входа 1 (0.0 to 1.0 = full ADC диапазон)
+ raw_value_sum_1 = raw_value_sum_1 + raw_value_1;
+ float raw_value_2 = analog_value_2.read(); // Чтение аналогового входа 2 (0.0 to 1.0 = full ADC диапазон)
+ raw_value_sum_2 = raw_value_sum_2 + raw_value_2;
+ }
+ if (counter_cycle1 >= 10 ) {
+ float raw_value_3 = analog_value_3.read(); // Чтение аналогового входа 3 (0.0 to 1.0 = full ADC диапазон)
+ raw_value_sum_3 = raw_value_sum_3 + raw_value_3;
+ float raw_value_4 = analog_value_4.read(); // Чтение аналогового входа 4 (0.0 to 1.0 = full ADC диапазон)
+ raw_value_sum_4 = raw_value_sum_4 + raw_value_4;
+ //float raw_value_5 = analog_value_5.read(); // Чтение аналогового входа 5 (0.0 to 1.0 = full ADC диапазон)
+ //raw_value_sum_5 = raw_value_sum_5 + raw_value_5;
+ }
- if (counter_cycle1 > 20 ) {
+ if (counter_cycle1 >= 19 ) {
counter_cycle1=0;
- sensor_value = raw_value_sum/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
- raw_value_sum = 0 ;
+
+ WL = raw_value_sum_0/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
+ raw_value_sum_0 = 0 ;
+ sensor_value = raw_value_sum_1/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
+ raw_value_sum_1 = 0 ;
+ Pb = raw_value_sum_2/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
+ raw_value_sum_2 = 0 ;
+ Pw1 = raw_value_sum_3/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
+ raw_value_sum_3 = 0 ;
+ Pw2 = raw_value_sum_4/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
+ raw_value_sum_4 = 0 ;
+ //Pd = raw_value_sum_5/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
+ //raw_value_sum_5 = 0 ;
+
if (flag_stopRegulator == false) { // можно запускать регулятор
+ digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета
//--------------regulator begin-----------------------
if (sensor_value > value + delta_value) {
valve2 = digital_7.read();
@@ -268,10 +349,10 @@
countValve2=0;
}
- if (flag_plotter == 1) {
- plotter.printf("$%d %d %d %d %d %d;\r\n", digital_4.read()*100-110,
- digital_7.read()*100-220, value, sensor_value, 100*frequencyValve1, 100*frequencyValve2 ); //печать в плоттер в другой СОМ-порт (только для отладки)
- }
+ // if (flag_plotter == 1) {
+ // plotter.printf("$%d %d %d %d %d %d;\r\n", digital_4.read()*100-110,
+ // digital_7.read()*100-220, value, sensor_value, 100*frequencyValve1, 100*frequencyValve2 ); //печать в плоттер в другой СОМ-порт (только для отладки)
+ // }
auto_set(); //Ступенчатое увеличение и уменьшение уставки value (для отладки если flag_autoset =1)
led = !led; //гасим/зажигаем индикаторный светодиод