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.
Diff: main.cpp
- Revision:
- 2:df6b8ad18bc5
- Parent:
- 1:ad293c65b02c
--- 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