Added integration of analog channels, introduced three new setpoints (Pb_1, Pb_2, Tp) for automatic compressor operation.

Dependencies:   _24LCXXX

Files at this revision

API Documentation at this revision

Comitter:
Aleksk
Date:
Fri Dec 24 11:56:10 2021 +0000
Parent:
12:de8c39bf5da3
Commit message:
Added integration of analog channels, introduced three new setpoints (Pb_1, Pb_2, Tp) for automatic compressor operation. ;

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r de8c39bf5da3 -r 65936a2190ac main.cpp
--- a/main.cpp	Fri Oct 15 10:15:22 2021 +0000
+++ b/main.cpp	Fri Dec 24 11:56:10 2021 +0000
@@ -1,4 +1,6 @@
-// 11.10.2021 Продолжение (клон )mbed-os5-press22
+// 23.12.2021 Продолжение (клон )mbed-os5-press25
+//21. Автоматическое поддержание давления в рампе в диапазоне 50...150 Бар, запрет повторного включения компрессора в течении 10...15 мин.
+//20. Давления со всех АЦП теперь дополнительно интегрируются для уменьшения шумов.
 //19. Теперь вес принимается по шине i2c в Ньютонах, как на дисплее динамометра.
 //18. По шине i2c Arduino Nano с адресом 2, передает значение веса с дискретностью 1 кг, приём происходит раз в секунду, используется timer.
 //17. digital pin 11, pin 12 as an input концевики теперь нормально замкнутые.
@@ -39,7 +41,7 @@
 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)
 DigitalOut digital_5(PB_4);                                                     //initialize digital pin 5 as an output (valve3,4)
@@ -55,12 +57,13 @@
 Timer timer_2;                                                                  //инициализация таймера 2 для отсчёта времени открытого состояния вентиля 1
 Timer timer_3;                                                                  //инициализация таймера 3 для отсчёта времени открытого состояния вентиля 2
 Timer timer_4;                                                                  //инициализация таймера 4 для отсчёта периода времени между контрольными открываниями вентиля 2
+Timer timer_5;                                                                  //инициализация таймера 5 для отсчёта времени запрета на включение компрессора
 //========УСТАВКИ_1 EEPROM========
-uint8_t delta_value = 0;                                                        //set delta pressure 1...99
-uint8_t flag_compressor = 0;                                                    //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
+uint8_t delta_value = 0;                                                        //set delta pressure 1...99 mV
+uint8_t flag_compressor = 0;                                                    //флаг компрессора. При 0 - разрешение на выключение компрессора, при 1 -разрешение на включение компрессора
 uint8_t flag_stopRegulator = 0;                                                 //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
 uint8_t num_chan = 1;                                                           //set номер аналогового канала 0...5 (1-as default = Pa)
-int value = 0;                                                                  //set begin value "pressure"   1...3300
+int value = 0;                                                                  //set begin value "pressure"   1...3300 mV
 //========УСТАВКИ_2 EEPROM========
 int Pd_eeprom = 2000;                                                           // mV,  максимальное дифференциальное давление (беззнаковое)
 int frequencyValve1_eeprom = 5;                                                 // Гц, максимальная частота переключений клапана 1 
@@ -71,22 +74,25 @@
 int T_2 = 4000;                                                                 // ms, максимальное время открытого состояния для клапана 2 
 uint8_t event_N = 255;                                                          // номер события , по умолчанию 255 - событий нет
 uint8_t flag_stopRegulatorEEPROM = 0;                                           //если 1 остановка регулятора, когда вручную управляют клапанами через программу SetUp_EEPROM
-int openTimeV2_H2O = 2;                                                        // ms, Время открытого состояния вентиля V2 для датчика влаги должно быть меньше WDlimit=100ms
+int openTimeV2_H2O = 2;                                                         // ms, Время открытого состояния вентиля V2 для датчика влаги должно быть меньше WDlimit=100ms
 int periodV2_H2O = 10000;                                                       // ms, Период открывания вентиля V2 для датчика влаги
- 
+int Pb_1 = 1080;                                                                // mV, минимальное давление в баллоне рампы компрессора 50Бар=(1080-600)/9.6
+int Pb_2 = 2040;                                                                // mV, максимальное давление в баллоне рампы компрессора 150Бар=(2040-600)/9.6
+int Tb = 600000;                                                                // ms, минимальный интервал времени перед следующим включением компрессора
 //======temporary set=====
 int numSet, anySet;
 //=================================
 int value_auto=250 ;                                                            //set begin value auto "pressure"
 int WL = 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 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;                                                                    //знак инкримента для автоустаки
+int Ki = 10;                                                                    //коэффициент интегрирования (по сути это - во сколько раз меньше вклад нового значения по сравнению с интегральной суммой)
 
 //                       FIFO_buffer must be full (only char  and '\0') 
 //#define maxnsym 26                                                             // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
@@ -162,6 +168,21 @@
      data2 = periodV2_H2O;
      eeprom.nbyte_write( 210, &data2, sizeof(int));
    }
+   eeprom.nbyte_read( 220, &data2, sizeof(int) );
+   if (data2 != Pb_1){
+     data2 = Pb_1;
+     eeprom.nbyte_write( 220, &data2, sizeof(int));
+   }
+   eeprom.nbyte_read( 230, &data2, sizeof(int) );
+   if (data2 != Pb_2){
+     data2 = Pb_2;
+     eeprom.nbyte_write( 230, &data2, sizeof(int));
+   }
+   eeprom.nbyte_read( 240, &data2, sizeof(int) );
+   if (data2 != Tb){
+     data2 = Tb;
+     eeprom.nbyte_write( 240, &data2, sizeof(int));
+   }
 }
 //_____________________________________________________________________________
 void load_EEPROM () {
@@ -214,7 +235,16 @@
     eeprom.nbyte_read( 210, &data2, sizeof(int) );
     //pc.printf("$adress,210,%d,*\r\n",data2);
     periodV2_H2O=data2;
-    //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2,openTimeV2_H2O,periodV2_H2O);
+    eeprom.nbyte_read( 220, &data2, sizeof(int) );
+    //pc.printf("$adress,220,%d,*\r\n",data2);
+    Pb_1=data2;
+    eeprom.nbyte_read( 230, &data2, sizeof(int) );
+    //pc.printf("$adress,230,%d,*\r\n",data2);
+    Pb_2=data2;
+    eeprom.nbyte_read( 240, &data2, sizeof(int) );
+    //pc.printf("$adress,240,%d,*\r\n",data2);
+    Tb=data2;
+    //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2,openTimeV2_H2O,periodV2_H2O,Pb_1,Pb_2,Tb);
     }
 //______________________________________________________________________________
 void substring(char *s,char *d,int pos,int len) {
@@ -442,6 +472,18 @@
             periodV2_H2O = anySet;
             plotter.printf( "21 periodV2_H2O=%d\r\n",anySet );
             break;
+       case 22:
+            Pb_1 = anySet;
+            plotter.printf( "22 Pb_1=%d\r\n",anySet );
+            break;
+       case 23:
+            Pb_2 = anySet;
+            plotter.printf( "23 Pb_2=%d\r\n",anySet );
+            break;
+       case 24:
+            Tb = anySet;
+            plotter.printf( "24 Tb=%d\r\n",anySet );
+            break;     
         default:
             plotter.printf( "Wrong case.\r\n" );
     } 
@@ -453,7 +495,7 @@
  endParsing:   
     
         
-pc.attach(&onDataReceived, Serial::RxIrq);                             // reattach interrupt - переподключение прерывания перед выходом из функции
+pc.attach(&onDataReceived, Serial::RxIrq);                                      // reattach interrupt - переподключение прерывания перед выходом из функции
 }
 //______________________________________________________________________________
 void onDataReceived() {
@@ -462,10 +504,21 @@
 }                                                                               // - в статусе отключенного прерывания (учим указатели!)
 //______________________________________________________________________________
 void auto_set () {                                                              //подпрограмма управления компрессором
-    
-    if (flag_stopRegulatorEEPROM == 0) {
-      digital_6.write(flag_compressor);                                              //включение-выкючение компрессора   
+    int time_5;
+    if (flag_stopRegulatorEEPROM != 0 ) {                                       //в программе SetUp_EEPROM автоматика управления отключается, компрессор можно включать-выключать вручную
+        goto endAutoset;
     }
+    time_5 = timer_5.read_ms();
+     if (time_5 >= Tb && Pb < Pb_1 && flag_compressor == 1) {
+        digital_6.write(1);                                                     //включение работы компрессора
+     }
+     if (Pb > Pb_2 || flag_compressor == 0) {
+        digital_6.write(0);                                                     //отключение работы компрессора по превышении уставки или по команде с кнопки
+        timer_5.reset();                                                        //сброс в ноль защитного таймера сна компрессора
+        time_5 = 0;
+     }
+endAutoset:
+     time_5=time_5;                                                             //эта пустая операция из-за того, что метку перехода не получилось установить в конце подпрограммы.
 }
 //******************************************************************************************************************
 //****************************************************************************************************************** 
@@ -502,6 +555,7 @@
     timer_2.start();
     timer_3.start();
     timer_4.start();
+    timer_5.start();
        
   while (true){                                                                 //бесконечный цикл
     // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
@@ -545,15 +599,15 @@
         WL+Pb+Pw1+Pw2+Pd+
         digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+
         event_N+idigital_11.read()+idigital_12.read()+idigital_13.read()+
-        Pd_eeprom+frequencyValve1_eeprom+frequencyValve2_eeprom+WL01_eeprom+WL99_eeprom+T_1+T_2+openTimeV2_H2O+periodV2_H2O)*2;
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+        Pd_eeprom+frequencyValve1_eeprom+frequencyValve2_eeprom+WL01_eeprom+WL99_eeprom+T_1+T_2+openTimeV2_H2O+periodV2_H2O+Pb_1+Pb_2+Tb)*2;
+      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
         value,delta_value,flag_compressor,flag_stopRegulator,                                             //1,2,3,4
         sensor_value,frequencyValve1,frequencyValve2,                                                     //5,6,7
         WL,Pb,Pw1,Pw2,Pd,                                                                                 //8,9,10,11,12
         digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),                              //13,14,15,16
         event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(),                                 //17,18,19,20
         Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2,
-        openTimeV2_H2O,periodV2_H2O,ks);        //21,22,23,24,25,26,27,28,29,30
+        openTimeV2_H2O,periodV2_H2O,Pb_1,Pb_2,Tb,ks);                                                     //21,22,23,24,25,26,27,28,29,30,31,32,33
       flag_comand2_detected = false;                                            //в последующих обращениях не печатать пока нет нового сообщения из СОМ-порта
       
       if (strcmp(trueSource2Old,trueSource2) != 0 && numSet >= 10) {            //функция возвращает ноль если командные строки совпадают
@@ -599,19 +653,25 @@
     if (counter_cycle1 >= 20 ) {
       counter_cycle1=0;
       
-      //WL = raw_value_sum_0/10 * 3300;                                           // преобразование в напряжение 0-3300 mV  с усреднением
+      //float m_WL = raw_value_sum_0/10 * 3300;                                 //уровень воды, преобразование в напряжение 0-3300 mV  с усреднением (теперь передаётся по i2c)
       raw_value_sum_0 = 0 ;
-      sensor_value = raw_value_sum_1/10 * 3300;                                 // преобразование в напряжение 0-3300 mV  с усреднением
+      //WL = (WL*Ki+m_WL)/(Ki+1);                                               //интегральное значение
+      float m_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  с усреднением
+      sensor_value = (sensor_value*Ki+m_sensor_value)/(Ki+1);                   //интегральное значение
+      float m_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  с усреднением
+      Pb = (Pb*Ki+m_Pb)/(Ki+1);                                                 //интегральное значение
+      float m_Pw1 = raw_value_sum_3/10 * 3300;                                  //давление водяной стороны сильфона, преобразование в напряжение 0-3300 mV  с усреднением
       raw_value_sum_3 = 0 ;
-      Pw2 = raw_value_sum_4/10 * 3300;                                          // преобразование в напряжение 0-3300 mV  с усреднением
+      Pw1 = (Pw1*Ki+m_Pw1)/(Ki+1);                                              //интегральное значение
+      float m_Pw2 = raw_value_sum_4/10 * 3300;                                  //давление в контруре охлаждения макета, преобразование в напряжение 0-3300 mV  с усреднением
       raw_value_sum_4 = 0 ;
-      //Pd = raw_value_sum_5/20 * 3300;                                           // преобразование в напряжение 0-3300 mV  с усреднением
+      Pw2 = (Pw2*Ki+m_Pw2)/(Ki+1);                                              //интегральное значение
+      //float m_Pd = raw_value_sum_5/20 * 3300;                                 //дифференциальное давление сильфона, преобразование в напряжение 0-3300 mV  с усреднением
       //raw_value_sum_5 = 0 ;
-      Pd = abs(sensor_value - Pw1);
+      //Pd = (Pd*Ki+m_Pd)/(Ki+1);                                               //интегральное значение
+      Pd = abs(sensor_value - Pw1);                                             //упрощённый вариант , когда нет дифференциального датчика давления
       
       if (num_chan == 1) {temp_valueSensor = sensor_value;}                     //теперь источник сигнала для регулятора - канал 1
       if (num_chan == 3) {temp_valueSensor = Pw1;}                              //теперь источник сигнала для регулятора - канал 3
@@ -704,8 +764,9 @@
       //--------------------==_ALARM_scope_End==----------------------          
      
       
-      auto_set();                                                               //включение-выкючение компрессора  через flag_compressor
-      //led = !led;                                                             //гасим/зажигаем индикаторный светодиод
+      auto_set();                                                               //подпрограмма управления компрессором  
+     
+     
     }