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.
Revision 5:bb595cde0c82, committed 2020-06-04
- Comitter:
- Aleksk
- Date:
- Thu Jun 04 22:55:40 2020 +0000
- Parent:
- 4:c34b84bfa2fb
- Commit message:
- The flag of the Stop button is accepted - closing of 4 valves,; and the flag of the compressor buttons is a command for discrete output PB_10. The num_chan setting is switching the channel number for the feedback of the controller, written in EEPROM
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed May 27 16:01:15 2020 +0000
+++ b/main.cpp Thu Jun 04 22:55:40 2020 +0000
@@ -1,5 +1,9 @@
-// 27.05.2020 Продолжение (клон )mbed-os5-press4
-// включены все шесть аналоговых входа, читаются пять
+// 05.06.2020 Продолжение (клон )mbed-os5-press6
+// Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора
+// Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10)
+// Принимается новая уставка num_chan - переключение номера активного измерительного канала для обратной связи регулятора.
+// Эта уставка, как и все остальные, пишется в EEPROM.
+// Включены все шесть аналоговых входа, читаются пять
// при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины
// (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM.
// сторожевой таймер, истекает через 100мс
@@ -28,10 +32,12 @@
EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5
Timer timer; //инициализация таймера
//========УСТАВКИ========
-uint8_t flag_autoset = 0; //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
+uint8_t delta_value = 0; //set delta pressure 1...99
+uint8_t flag_autoset = 0; //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
uint8_t flag_plotter = 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
-uint8_t delta_value = 0; //set delta pressure 1...99
+
//=======================
int value_auto=250 ; //set begin value auto "pressure"
int WL = 0; //напряжение с аналогового входа А0 (WL - вес опресовщика)
@@ -44,9 +50,9 @@
int counter_cycle2 = 0; //счётчик внутри функции auto_set
int sig = 1; //знак инкримента для автоустаки
// FIFO_buffer must be full (only char and '\0')
-//#define maxnsym 24 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
-#define maxnsym 26 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
-char Source[maxnsym]="$press,1000,25,0,0,2050**"; //23 char- string ,весь массив со строкой для поиска 23+1(null terminal)=24
+//#define maxnsym 26 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
+#define maxnsym 28 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
+char Source[maxnsym]="$press,1000,25,0,0,1,2050**"; //25 char- string ,весь массив со строкой для поиска 25+1(null terminal)=26
//уставки и контрольная сумма умноженная на два, должны быть больше нуля
char trueSource[maxnsym]; //верифицированная строка для callback
char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback
@@ -62,6 +68,7 @@
eeprom.byte_write(0, delta_value);
eeprom.byte_write(1, flag_autoset);
eeprom.byte_write(2, flag_plotter);
+ eeprom.byte_write(3, num_chan);
data2 = value;
eeprom.nbyte_write( 10, &data2, sizeof(int));
}
@@ -79,6 +86,9 @@
eeprom.nbyte_read( 2, &data1, 1 );
plotter.printf("adress 2 =%d \r\n",data1);
flag_plotter=data1;
+ eeprom.nbyte_read( 3, &data1, 1 );
+ plotter.printf("adress 3 =%d \r\n",data1);
+ num_chan=data1;
eeprom.nbyte_read( 10, &data2, sizeof(int) );
plotter.printf("adress 10 = %d \r\n",data2);
value=data2;
@@ -103,7 +113,7 @@
char Destination[50];
int pos,len;
int controlSum1, controlSum2;
- int value_, delta_value_, flag_autoset_, flag_plotter_;
+ int value_, delta_value_, flag_autoset_, flag_plotter_, num_chan_;
int ch = '$'; // Код искомого символа
int indexCh; // Char on position
char *ach; // Указатель на искомую переменную в строке, по которой осуществляется поиск.
@@ -168,16 +178,24 @@
substring(Source,Destination,pos,len);
flag_plotter_=atoi(Destination);
//pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_plotter_);
- pos=20; //начало подстроки 1025 - на 18 позиции
+
+ pos=20; //начало подстроки 1 - на 20 позиции
+ len=1; //длина подстроки 1 равна 1
+ substring(Source,Destination,pos,len);
+ num_chan_=atoi(Destination);
+ //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, num_chan_);
+
+ pos=22; //начало подстроки 1025 - на 22 позиции
len=4; //длина подстроки 1025 равна 4
substring(Source,Destination,pos,len);
controlSum1=atoi(Destination);
- if (controlSum1==0) {
- flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
- goto endParsing; //контрольная сумма должна быть больше еденицы, пропускаем парсинг
+ if (controlSum1==2) {
+ flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+ flag_autoset=flag_autoset_; //здесь можно включать-выключать компрессор, но без записи в EEPROM
+ 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; //удвоение чтобы не было одинаковых чисел в сообщении
+ controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_+num_chan_)*2; //удвоение чтобы не было одинаковых чисел в сообщении
//pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2);
if (controlSum1!=controlSum2) { //не совпала контрольная сумма
//pc.printf ("controlSum1!=controlSum2 \r\n");
@@ -192,7 +210,8 @@
value=value_;
delta_value=delta_value_;
flag_autoset=flag_autoset_;
- flag_plotter=flag_plotter_;
+ flag_plotter=flag_plotter_;
+ num_chan=num_chan_;
}
flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
@@ -208,16 +227,10 @@
queue->call(read_serial); // process in a non ISR context - переход к функции приема строки -
} // - в статусе отключенного прерывания (учим указатели!)
//______________________________________________________________________________
-void auto_set () {
- if (counter_cycle2 >= 100 && flag_autoset == 1) {
- counter_cycle2=0;
- if (value_auto > 2800 || value_auto < 250) {
- sig = -sig; //меняем знак для изменения направления роста/спада автоуставки
- }
- value_auto = value_auto + sig * 250;
- value=value_auto;
- }
- counter_cycle2++; //увеличиваем счетчик функции auto_set() на 1
+void auto_set () { //подпрограмма управления компрессором
+
+ digital_6.write(flag_autoset); //включение-выкючение компрессора
+
}
//*****************************************************************************
//*****************************************************************************
@@ -225,14 +238,15 @@
int main() {
pc.attach(&onDataReceived, Serial::RxIrq);
- int time, valve1, valve2, countValve1=0, countValve2=0;
+ int time, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor;
int frequencyValve1, frequencyValve2;
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_5.write(0); //valve3,4 off;
+ digital_5.write(0); //valve3,4 off;
+ digital_6.write(0); //выключение компрессора
load_EEPROM (); //загрузка уставок из EEPROM
- if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2) {
+ if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2 && num_chan < 6) {
flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора
} else {
flag_stopRegulator = true; //флаг остановки установлен
@@ -253,14 +267,15 @@
digital_4.write(0); //valve1 off
digital_7.write(0); //valve2 off
digital_5.write(0); //valve3,4 off
+ //digital_6.write(0); //выключение компрессора
}
if (flag_comand_detected) { //пришла правильная командная строка
- pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+ pc.printf("$press,%d,%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()); //передача текущих значений в РС
+ digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read()); //передача текущих значений в РС
// pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
// value,delta_value,flag_autoset,flag_plotter,
@@ -280,11 +295,11 @@
}
if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
- pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+ pc.printf("$press,%d,%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()); //передача текущих значений в РС
+ digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read()); //передача текущих значений в РС
flag_zerostart = false;
}
@@ -316,20 +331,24 @@
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 с усреднением
+ 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 с усреднением
//raw_value_sum_5 = 0 ;
+ if (num_chan == 1) {temp_valueSensor = sensor_value;} //теперь источник сигнала для регулятора - канал 1
+ if (num_chan == 3) {temp_valueSensor = Pw1;} //теперь источник сигнала для регулятора - канал 3
+ if (num_chan == 4) {temp_valueSensor = Pw2;} //теперь источник сигнала для регулятора - канал 4
+
if (flag_stopRegulator == false) { // можно запускать регулятор
digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета
//--------------regulator begin-----------------------
- if (sensor_value > value + delta_value) {
+ if (temp_valueSensor > value + delta_value) {
valve2 = digital_7.read();
digital_7.write(1); //valve2 on;
if (valve2 < digital_7.read()) {countValve2++;} //счётчик передних фронтов напряжения (срабатывания клапана 2)
digital_4.write(0); //valve1 off;
- } else if (sensor_value < value - delta_value) {
+ } else if (temp_valueSensor < value - delta_value) {
valve1 = digital_4.read();
digital_4.write(1); //valve1 on;
if (valve1 < digital_4.read()) {countValve1++;} //счётчик передних фронтов напряжения (срабатывания клапана 1)
@@ -349,12 +368,7 @@
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 ); //печать в плоттер в другой СОМ-порт (только для отладки)
- // }
-
- auto_set(); //Ступенчатое увеличение и уменьшение уставки value (для отладки если flag_autoset =1)
+ auto_set(); //включение-выкючение компрессора через flag_autoset
led = !led; //гасим/зажигаем индикаторный светодиод
}
ThisThread::sleep_for(1); // (mc) правильный оператор задержки для mbed5