Main idea . Serial port interruptions are rare, so they should not affect the continuous cycle of the pressure regulator. Here is a piece of code with interruption from an incoming message, parsing of an incoming control line, and reading of an analog port.

Files at this revision

API Documentation at this revision

Comitter:
Aleksk
Date:
Fri Apr 17 09:35:30 2020 +0000
Parent:
1:ad293c65b02c
Commit message:
Relay regulator. Set pressure = 1000 +/- 25 mV.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Fri Apr 10 18:06:38 2020 +0000
+++ b/main.cpp	Fri Apr 17 09:35:30 2020 +0000
@@ -1,5 +1,5 @@
 #include "mbed.h"
-//10.04.2020 20:18
+//16.04.2020 23:19
 //Программа для пошагового чтения байтов из порта (файла) и разделения потока байтов на подстроки в реальном времени. Разделитель - запятая.
 //Строка сообщения должна заканчиваться только одним символом /r  или  /n (обнаружение признака окончания сообщения можно сделать любым)
 //Программа нормально разбивает принимаемую строку на подстроки (до 20) в количестве равном количеству запятых, плюс последняя подстрока без запятой
@@ -7,7 +7,9 @@
 
 AnalogIn analog_value(A0);                           //подключение аналогового входа A0
 DigitalOut led(LED1);
-RawSerial pc(USBTX, USBRX);
+DigitalOut digitalWrite4(PB_5);    // initialize digital pin 4 as an output (high pressure air bulb charge).
+DigitalOut digitalWrite7(PA_8);    // initialize digital pin 7 as an output. (high pressure air bulb discharge
+RawSerial pc(USBTX, USBRX, 115200);
 EventQueue *queue = mbed_event_queue();                                         //инициализация очереди событий RTOS mbed5
 
 #define maxnstr 20                                                              // maximum nbr of params(sybstrings) used to hold the data fields
@@ -19,9 +21,17 @@
 int pressure_set=0;                                  //уставка давления 
 int pressure_set_max=0;                              //уставка максимальног давления 
 int pressure_set_min=0;                              //уставка минимального давления 
+int value=1000;                   //set "pressure" 50
+int delta_value=25;              //set delta pressure
+int counter_cycle1=0;
+int counter_cycle2=0;
 
+int valve1=0;   // state valve of  charge:  0 - close, 1 - open
+int valve2=0;   //state valve of  discharge:  0 - close, 1 - open
+
+//______________________________________________________________________________
 void onDataReceived();                                                          // callback
-
+//______________________________________________________________________________
 void read_serial() {
     char message[maxnstr][maxnsym]={""};                                        //обнуление строк (локального двумерного массива символов фиксированного размера)
     int zap=0;                                                                  // счетчик запятых                                                
@@ -52,7 +62,7 @@
     
     pc.attach(&onDataReceived, Serial::RxIrq);                                  // reattach interrupt - переподключение прерывания перед выходом из функции
 }
-
+//______________________________________________________________________________
 void onDataReceived() {
     pc.attach(NULL, Serial::RxIrq);                                             // detach interrupt
     queue->call(read_serial);                                                   // process in a non ISR context - переход к функции приема строки в статусе отключенного прерывания (учим указатели!)
@@ -60,15 +70,32 @@
 //*****************************************************************************
 int main() {
     pc.attach(&onDataReceived, Serial::RxIrq);                                  //подключение прерывания и имя функции обработчика прерывания по входящему символу в serial порту
-    float meas_r;
-    float meas_v;
-    printf("AnalogIn read \r\n");
+    float raw_value ;
+    int sensor_value ;
+    printf("Start \r\n");
     while (1) {
-        meas_r = analog_value.read();                                           // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
-        meas_v = meas_r * 3300;                                                 // преобразование в напряжение 0-3300 mV 
-        printf("measure = %f = %.0f mV\r\n", meas_r, meas_v);
+       
+/*--------------regulator begin---*/
+  raw_value  = analog_value.read();                                           // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
+  sensor_value  = raw_value  * 3300;                                          // преобразование в напряжение 0-3300 mV 
+  if (sensor_value>value+delta_value)
+  {
+   digitalWrite7=1; valve2=1;
+   digitalWrite4=0; valve1=0;
+  } else  if (sensor_value<value-delta_value)
+  {
+   digitalWrite4=1; valve1=1;
+   digitalWrite7=0; valve2=0; 
+  } else 
+  {
+   digitalWrite4=0; valve1=0;
+   digitalWrite7=0; valve2=0; 
+  }
+
+/*--------------regulator end-----*/
+ pc.printf("$%d %d %d %d;", valve1*100-110, valve2*100-220, value, sensor_value );       
         
-        ThisThread::sleep_for(2000);                                             // (mc) правильный оператор задержки для mbed5
+        ThisThread::sleep_for(20);                                             // (mc) правильный оператор задержки для mbed5
         led = !led;
     }
 }
\ No newline at end of file