Страница 1 из 4

Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 20:27:59
uwrtey
В общем решил один мой знакомый собрать себе шкаф для автоматизации системы отопления.
Он немного пишет для Arduino.
Все бы ничего но мучает он меня с одним и тем же вопросом уже полгода. ( я совсем чуть чуть пишу на асме )
Он ни как не может решить, как же ему решить задачу многозадачности на данном МК
В качестве МК он выбрал ATmega 2560
Система содержит кучу датчиков температуры Даллас 1-Wire ( около десятка )
Имеется дисплей подключенный по SPI
К UARTу подключен GSM модуль, для тотального контроля и удаленного управления системой.
система рассчитывает ПИД и крутит приводами ( регулирует поток горячей воды в трубах )
Приводы управляются через реле, ни какого спец протокола для них не надо.

Задача заключается в том, что нельзя оставлять регулирование ни на секундочку.
"По хорошему нужно регулировать как минимум три раза в секунду" сказал он мне :) Не знаю как он это высчитал, но раз надо - значит надо.
Все бы ничего, но у нас есть GSM модуль, который может отнять процессорное время общаяс с МК по UARTу
а также куча датчиков температуры. Готовые библиотеки для них не используют прерывания, а просто висят в цикле и тоже тратят процессорное время...

Вот тут то он меня и замаял. говорит что слишком много времени тратим на висение в циклах. Давай юзать прерывания.

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 21:17:10
Мурик
uwrtey писал(а):Давай юзать прерывания.
Используйте. :)

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 21:44:14
Jack_A
uwrtey писал(а): Готовые библиотеки для них не используют прерывания, а просто висят в цикле и тоже тратят процессорное время....
В дупу топку такие иблетеки ! Внешние устройства, а также таймеры должны выполнять свои функции в прерываниях, выставляя флаги ПРОИЗОШЛО СОБЫТИЕ N. Главная программа вертится в бесконечном цикле, посматривая на флаги и обслуживая их в порядке приоритетов. Это и есть многозадачность, реализованная на уровне пользователя. Ну а для понтов можно купить ОС реального времени ( пустяки, пару десятков килобаксов ) и влимонить ее в МК баксов за 20. Круть неимоверная!

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 22:03:34
uwrtey
Ну а для понтов можно купить ОС реального времени ( пустяки, пару десятков килобаксов ) и влимонить ее в МК баксов за 20. Круть неимоверная!
Хм. Вот он про то-же что то говорил.. :)
А что за штука? неужели сможет работать на таком МК ?
И что то она шибко дорогая....

А есть либа 1-wire на прерываниях, на асме ? Подглядеть бы одним глазком. Я не спец библиотеки свои еще не писал ни разу.
в порядке приоритетов
Вот я и думаю, что как то нужно задать приоритеты. Мне кажется это ключевой момент.

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 22:10:10
roman.com
uwrtey писал(а):Задача заключается в том, что нельзя оставлять регулирование ни на секундочку.
Поставьте 2 МК... если уж всё там так критично... )))

МК 1 - К UARTу подключен GSM модуль
МК 2 - куча датчиков температуры.

:)))

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 22:40:50
Аlex
roman.com писал(а): :)))
Кстати, напрасно смеётесь. Это вполне нормальный вариант распределения задач.
"Разделяй и властвуй" (с)

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 22:43:22
ARV
гораздо проще, пожалуй, по прерываниям сделать регулирование, а все эти обмены и вычисления пусть в главном цикле крутятся...

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 22:50:25
uwrtey
Всех приветствую...

roman.com, одного этого МК вполне достаточно. Просто необходимо понять какой вариант исполнения лучше ( надежнее, быстрее )

Аlex, вариант нормальный, но выбор на 2560 пал не с проста ( я видел проекты на этом чипе в сотню раз круче поставленной задачи )

ARV, да, пожалуй один из нормальных вариантов.
вариант Jack_A тоже интересный..

Проблема у нас больше в том что я немного пишу на асме, а мой приятель немного пишет на СИ для ардуинок, тока начал так сказать и не знаком толком с этими чипами...
До этого он практиковался в программировании очень давно ( лет 30 назад )

Он знает чего он хочет, но не знает как это организовать на данном камне.
Просит помощи меня, а от меня мало толку, потому что я толком не могу понять что конкретно ему нужно :))) :))) :)))
Понял лишь то, что он хочет сэкономит время на всем чем можно и организовать что т о вроде псевдо многозадачности..

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 23:16:48
НАПАЛМ
uwrtey писал(а): Он знает чего он хочет, но не знает как это организовать на данном камне.
Пусть почитает на easyelectronics.ru цикл статей про архитектуру программ и про конечный автомат. http://easyelectronics.ru/category/avr- ... urs/page/2

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 23:21:25
uwrtey
Ему проще мне обьяснить что надо, что бы я на асме написал.. :)

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 23:40:34
Jack_A
uwrtey писал(а): А что за штука? неужели сможет работать на таком МК ?
И что то она шибко дорогая....
На меге 8 не сможет, конечно, а на каком - нить АРМе - пожалуйста. Дорогая - это же не Винда с стомилионными тиражами, оттого и цены. Сам, правда, не покупал - зайчиков маловато :)
Для примера гляньте у Вики QNX.
А тот вариант, что я накорябал, работает у меня на полдюжине неслабых дивайсов серийных.

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Пн фев 01, 2016 23:58:32
uwrtey
ОК, спс... будем кумекать...

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Вт фев 02, 2016 03:28:09
pokk
По мне так единственное что может давать задержку так это 1-Wire, уже очень он критичен к времени.
Я бы сделал так на таймер посадил бы 1-Wire, как написал,НАПАЛМ
http://easyelectronics.ru/avr-uchebnyj- ... tomat.html
А всё остальное оставил бы в главном цикле. С USART, не вижу особых проблем он хорошо подходит к конечным автоматам, там всего пару состояний получается (дождаться байт, и принять).
Что-то типа такого.

Код: Выделить всё

        if(send_usart==ON){           
             if(len>0){ 
                if (!(UCSR1A & (1<<UDRE1))==0){
                //------------------Отправляем байт-------------
				   UDR1=usart_send_buffer[index_usart];                      
                    len--;
                    index_usart++;
                }
             }
             else{            
                 index_usart=0;
                 send_usart=OFF;
                 Usart_resive=ON;
             }
        }
Недостатки такого подхода в том что главный цикл должен крутится быстро что бы не пропустить байты,по этому надо строго поддерживаться такому же подходу, и полностью исключать задержки типа delay, и ожидания флага в while.

PS: По поводу конечных автоматов, есть ещё вот есть пример http://we.easyelectronics.ru/blog/AVR/2599.html
плюс внизу прикреплен цикл статей татарчевского.

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Вт фев 02, 2016 11:24:33
Z_h_e
pokk писал(а):По мне так единственное что может давать задержку так это 1-Wire
Для таких датчиков можно выделить какую-нибудь "тиньку", а эту тиньку опрашивать головным контроллером.
uwrtey писал(а):нельзя оставлять регулирование ни на секундочку.
DS18B20 при максимальной точности измеряет температуру в течении 750мс.

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Вт фев 02, 2016 11:53:39
Vov123
Чего-то бред какой-то.
Действительно, время преобразования датчика DS18B20 - 750мс., да умножить на "кучу датчиков" и в то-же время надо получить данные обработать и выдать "на гора" раз в 333мс.
Это где-же такие регуляторы воды продаются?

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Вт фев 02, 2016 12:32:05
Z_h_e
За секунду то я думаю можно все обработать. Выдать команду начать замер для всех датчиков разом (вроде так должно работать) и потом за оставшееся время все посчитать, ну или конвеер организовать.. Вот только что за система отопления такая, что нужна дискретность "ни на секундочку"?

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Вт фев 02, 2016 12:33:45
uwrtey
"на гора" раз в 333мс.
Это где-же такие регуляторы воды продаются
Хм.. Регулятор самый простой, привод в виде мотора.
В начале и конце установлены концевики, что бы мотор не свернул "шею" редуктору.
Микроконтроллер рассчитывает ПИД и задает мотору некоторую позицию.
Три раза в секунду внести корректировки в положение мотора это не так то уж много.
Мотор может за одну секунду доехать от начала до конца своего редуктора....
Это не те сервоприводы у которых всего два положения on/off... :) Уж шибко они дорогие...

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Вт фев 02, 2016 12:41:08
Vov123
Задвижка-самопал, вероятно. Согласен "левши" могут придумать и по-круче.
А как-же с временем преобразования датчиков?
Если не секрет, где находится радиатор, температуру помещения, которого, необходимо поддерживать с такой точностью?

Это я к тому, что инерционность будет по-любому выше, чем 333мс, а в реале достигать несколько минут.

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Вт фев 02, 2016 13:10:04
Z_h_e
Я немного с ПИД сталкивался. Есть такой метод Циглера-Никольса настройки коэффициентов ПИД . Сначала все коэфф. устанавливаются в 0. Потом, постепенно увеличивая коэфф. пропорциональности, нужно добиться чтобы система перешла в режим устойчивых колебаний. Количество измерений на период колебаний достаточно 5-10 раз.
Не знаю что у Вас за система отопления, но период может измеряться даже часами.
Vov123 писал(а):А как-же с временем преобразования датчиков?
Его можно снизить до <100мс, уменьшив дискретность до пол грудуса, все равно погрешность датчика как раз такая и даже хуже, если во всем диапазоне.

Re: Многозадачность ПИД+1Wire+UART

Добавлено: Вт фев 02, 2016 13:16:14
Vov123
Вероятно ПИД-самопал будет использоваться.
А реальный, к примеру, есть у ОВЕНА ТРМ-10, можно ознакомиться с инструкцией и сделать себе какое-то понятие о ПИ и ПИД регулировании.

Да, на закуску, про тепло-инерционность самого датчика температуры забыли?