Added integration of analog channels, introduced three new setpoints (Pb_1, Pb_2, Tp) for automatic compressor operation.
Revision 13:65936a2190ac, committed 2021-12-24
- 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(); //подпрограмма управления компрессором + + }