Снова про настройку PID
- Войдите на сайт для отправки комментариев
Здравствуйте. 400 мл воды в герметичной ёмкости из нержавейки подогреваются 1.5 КВт ТЭНом и поддерживается температура 95С. Написал я это, чтоб было понятно, что вслепую "крутить" параметры не получится - слишком длинный период колебания.
Пытаюсь подобрать по следующему принципу:
Ставлю коэффициенты P,I,D в ноль и увеличиваю значение коэффициента пропорциональной составляющей, пока не увижу незатухающие колебания. Получаю их при P=2 (далее - Ku=2) и периоде в Tu=300 сек. (забегая дальше, и при более низких значениях тоже получаются незатухающие колебания)
Используя формулы Kp = 0.6 * Ku, Ki = 2 * Kp / Tu, Kd = Kp * Tu / 8
получаю значения 1.2 - 0.0072 - 49.5. Также система неплохо работает при 0.5 - 0.006 - 12 и при 0.5 - 0.0032 - 12, однако, температура бегает от 94 до 96, что неприемлимо в моём случае. Уже устал подбирать коэффициенты. Может, посоветуете, что ещё сделать, чтобы убрать колебания +- градус.
P.S. Все полученные значения - это сверхнизкий коэффициент Ki и низкий (0.5 - 1.2) Ki.
Поскольку у меня довольно большой объём, время можно установить в 1 секунду и спокойно отслеживать все значения регулятора. Что я и сделал.
Вижу, что при приближении к целевому значению пропорциональная составляющая стремится к нулю (логично), интегральная также по прошествии некоторого времени стремится к нулю, а вот дифференциальная сильно скачет. Тут либо снижать коэффициент Kd, либо увеличивать Kp. Пока попробовал первое.
А в скольки точках измеряется температура воды и как усредняется? По высоте бака или по ширине? Есть ли устройство перемешивания воды? Смотрели ли тепловизором на поверхность воды, что бы увидеть неравномерность прогрева? Иначе требование 95 градусов выглядит просто смешно. Такой объём таким теном равномерно прогреть невозможно.
Здравствуйте. 400 л воды в герметичной ёмкости из нержавейки подогреваются 1.5 КВт ТЭНом и поддерживается температура 95С.
...
...убрать колебания +- градус.
Это абсолютно бессмысленно.
Какой смысл "убирать колебания", когда их величина заведомо меньше погрешности измерения (включая как погрешность датчика, так и неравномерность температуры в объеме)?
Спасибо, что откликнулись.
Нет ничего невозможного - люди в космос летают, а тут всего лишь поддержание заданной температуры. Практика показывает, что это возможно - на другом бойлере стоит XMT7100, имеющий кнопку "авторюна" - температуру держит "жёстко" и адекватно реагирует на возмущения. Плюс с ТЭНом на 1 квт и бойлером в 300 мл. настроить почти получилось - колебания стали +-0.5С.
Измерения в трех случаях проводятся в одной точке - сверху. Собственно, поддерживать заданную температуру и нужно в этой точке. Отклик на воздействие проявляется примерно через 20 секунд. Перемешивание воды происходит за счёт конвекции. Неравномерность прогрева замерял, но не тепловизором: снизу вода заметно холоднее, но это сейчас не столь важно, т.к. интересует только вода в верхней точке, от неё и "пляшем".
Наблюдал за воздействием. Возникло субъективное ощущение, что пропроциональная составляющая недостаточна, а интегральную лучше вообще отключить - при нагреве копится ошибка, которая "толкает" температуру дальше за счёт чего наблюдается сильный перебег, а стабилизация температуры происходит очень поздно.
Также есть ощущение, что надо уменьшить время итерации.
Поставь второй датчик на поверхности, но максимально удаленный от первого. Будешь очень удивлён результатом.
Практика показывает, что без внешних возмущений реально добиться колебаний +-0.2С. Просто нужно подводить тепла ровно столько же, сколько бойлер теряет в атмосферу (грубо говоря, раз в 15 секунд включать ТЭН на секунду), а то, как я буду распоряжаться этой водой, это уже другой вопрос.
Пока просто решил отказаться от интегральной составляющей. Всем спасибо за советы, буду подбирать коэффициенты дальше.
Плюс с ТЭНом на 1 квт и бойлером в 300 мл. настроить почти получилось - колебания стали +-0.5С.
Плюс с ТЭНом на 1 квт и бойлером в 300 мл. настроить почти получилось - колебания стали +-0.5С.
Да. Бойлер делал сам из пищевой нержавейки.
Кружка воды и киловатный тэн... Ну, надо - так надо ))
А в первом сообщении 400 литров?
Дык, в моем понимании бойлер - это нечто более емкое. Думал, уж не опечатка ли, вот после второй и уточнил ))
Наблюдал за воздействием. Возникло субъективное ощущение, что пропроциональная составляющая недостаточна, а интегральную лучше вообще отключить - при нагреве копится ошибка, которая "толкает" температуру дальше за счёт чего наблюдается сильный перебег, а стабилизация температуры происходит очень поздно.
Опечатка, которая меняет весь смысл. Действительно, 400 мл.
Опечатка, которая меняет весь смысл. Действительно, 400 мл.
Исправил.
Снизил время итерации до 0.1 сек, подобрал вручную новые параметры, теперь колебание в районе +-0.4С с редкими всплесками +-0.8. Что-то недокрутил. Но при 0.1 сек. настраивать проще.
Ну тогда совсем другой разговор. А так пропорциональная составляющая должна быть кратна постоянной времени системы. Здесь постоянные времени системы нагрева и охлаждения разные. Соответственно каналы регулирования на нагрев и охлаждение надо разделить или применять разные коэффициенты. Без интегральной составляющей не будет точного значения при плавном изменении разных параметров - типа напряжения питания и внешней температуры. Диф канал нужен только если предполагается резкое изменене - например долив холодной воды. В других случаях он не работает.
Постоянную времени нагрева легко прикинуть исходя из мощности нагревателя и теплоемкости воды. Постоянную охлаждения можно измерить по кривой температуры при охлаждении термостата. Получить при этом точные значения пропорционального коэффициента ПИД.
У меня значения P, I, D получились 0.5, 0, 1.75 соответственно. Вводя I (даже 0.0001), всё портится.
Коэффициенты вещь абстрактно относительная. Они зависят от конкретной математической реализации ПИД. И от типа переменных, которые используются. Особенно интегральная сотавляющая, которая ещё требует шаг по времени, который может быть разным, соответственно и коэффициент по разному будет влиять на результат. Попробуй выводить промежуточные значения трех каналов на каждом шаге ПИД и посмотри как влияет разность между заданной и текущей температурой на отдельные каналы и результат ПИД в целом. При каких разностях результат обнуляется. Если расчёт в целых числах, то при коэффициенте 0.5 точнее чем +- 2 градуса получить регулирование не получится, потому что разность меньше 2 градусов помноженная на 0.5 даст 0 в целых числах. Ну так далее. А про D вообще забавно видеть 1.75 . Это какой шаг по времени надо иметь, чтобы получить разность температур больше 0.6 градуса, что бы этот канал выдал не нулевой результат?
0.1 сек. Да и с интегральной составляющей понятно: при времени итерации 0.1с он должен быть очень маленьким, при 1с - ещё меньше.
Подбирал исключительно вручную, глядя на влияние каждого коэффициента.
Покажи как считается ПИД со всеми типами переменных. Как управляется ТЭН? Вкл-откл или ШИМ?
вводные данные
раз в 0.1 сек. вызываю функцию
то есть, да, вкл/выкл SSR-реле, находящееся на "цифровом" пине.
Умом понимаю, что результатом вычисления (err - prevErr) / dt скорей всего будет ерунда (слишком малый промежуток времени, за который теоретически разность двух значений датчика будет рэндомным значением и надо брать период хотя бы в секунду, с другой стороны, за секунду при нагреве температура увеличивается на градус-полтора), однако, вкупе с подобранным коэффициентом kD это работает.
Что бы интегральный нормально заработал его надо обнулять если ошибка больше двух градусов. Диф канал здесь не нужен совсем. Нагрев где то 1 гдадус в секнду. Соответственно при опросе 0.1 сек и деление на 0.1 получим ту же единицу, которую множим на кд. Или просто в формулу ПИД добавляем постоянную при нагреве и ноль при охлаждении. Пропорциональный канал при коэффициенте 0.5 регулирует +- 2 градуса.
Не понятно при каком условии или при каком значении ПИД включается выключается нагрев. Выход либо 0 либо 1, если значение ПИД равно или больше единицы. Должно быть единица если больше нуля и ноль если значение ПИД ноль или меньше нуля.
При единице включается, при значении ниже единицы выключается.
Вы не учли погрешность измерения. 1 градус за секунду можно довольно точно идентифицировать, а вот 0.1 градуса за 0.1 сек - задача довольно непростая. Да, в итоге при делении 0.1 на 0.1 я получу ту же единицу, но уже с очень большой погрешностью.
Спасибо за советы.
Вот тут непонятно. А где-то про обнуление I-компоненты можно почитать?
Что бы ПИД нормально работал его конечное значение должно быть ноль. При регулировании около точки уставки ПД каналы обнуляются работает только И канал. Он, по своей сути, интегрирует около нуля. Соответственно если регулирование установило точное значение то выход ПИД будет Ноль. Дальше задача проектировщика установить ворота, которые будут являться по сути величиной в пределах которой будет колебаться регулируемая величина. Эти ворота должны быть шире ошибки измерения. Включение выключение исполнительного механизма должно производиться при выходе за верхнюю - нижнюю кромки ворот. Как переобразовать выход за кромки вворот в сигнал исполнительного механизма - задача программиста. Ваш ПИД запрограммирован не правильно.
Про обнуление интегральной составлыющей попробуйте поискать со словом "со сбросом".
Наверное, P и D должны быть нулевыми, нет?
При выходе температуры на заданное значение, P-составляющая точно будет равна нулю.
Они множаться на ошибку и её приращение соответственно. Если вышли на уставку, то ошибка ноль. Соответственно и умножение на ноль даст ноль.
Сам расчёт ПИД нормальный. Последний constrain должен делать сигнал для нагревателя. Он делает сигнал, но результат смещён относительно выхода ПИД. Переключение происходит когда значение равно 1.
Да. А когда должно происходить включение?
Пока результат расчёта ПИД положительный нагреватель должен быть включен.
А в общем я не понимаю как в такой схеме можно отрегулировать. . Расчёт простой. Пока растёт температура значение И равно 1. Плюс помним о тепле запасённом в нагревателе, он же работает на полную мощность и после отключения ещё несколько секунд будет отдавать тепло. При этом И канал будет конкретно колбасить. Он очень бысро наберёт -1 . И регурирования по И каналу не будет. Будут метания от -1 до 1.
Писал раньше - коэффициенты на нагрев и охлаждение должны быть разные, соласованные с постоянными времени нагрева и охлаждения системы.
Отключать нагреватель для релейной схемы нужно раньше так, чтобы заброс температуры после выключения как раз подходил к уставке. При ШИМ регулировании уменьшение значения ШИМ при подходе к уставке в конце концов приводит к тому что тепло нагревателя становится равным потерям и колебания температуры становятся существенно меньше чем в релейной схеме.
nik182, спасибо за ваши советы.
Вот так бывает, когда пишу программу сам, а одну функцию беру из интернета и, не разобравшись, использую. И функция, вроде, простейшая... ан нет. Интегральный канал не надо было ограничивать значениями -1 и 1 с двух сторон - пусть себе снижается или увеличивается хоть до -100.
Убрал constrain для integral
теперь ПИД-регулирование происходит на ура: интегральная часть растёт, температура "перепрыгивает" уставку, затем интегральная составляющая снижается, в итоге, после 3 колебаний вкупе с коэффициентом устаканивается на отметке -5 или -2 и колебания затухают, правда, происходит это минут через 15 после включения. Ну очень уж велик период колебаний в моей системе.
Пропорциональная составляющая в этом случае не вносит коррективы в управление, а работают только И и Д компоненты.
В итоге вся настройка ПИД (в моём случае) сводится к подбору И и Д компонент. Пропорциональная отвечает лишь за скорость набора (и велечину перелёта) заданной температуры.
Собственно, всё работает чуть ли не с любыми коэффициентами (в разумных пределах, разумеется). Остаётся только лишь подобрать такие коэффициенты, которые максимально быстро снизят колебания.
А вот тут вариант один - подстраивать и наблюдать.
Пока, к сожалению, перебег выше уставки аж 16...20 градусов. Причём не всегда виной всему пропорциональная составляющая - зачастую интегральная при нагреве сильно уходит вверх и далее тянет нагрев выше уставки. Без этого перебега не начнётся снижение интегральной составляющей, что необходимо для ПИД в моём случае.
Можно попробовать установить Kp ближе к нулю - 0.1, например, что даст торможение на раннем этапе.
Также пробовал обнулять Ki при включении и "включать" Kp только при подходе к уставке. Это дало некоторые плоды.
Прошу прощения, что долго вас мучал своими вопросами. Не надо копировать функции из интернета.
И канал не надо отпускать на волю. Он должен работать только вблизи точки уставки. Поэтому делают разные дополнения типа сброса или ограничения, как было в программе. Вот только диапазон регулирования И канала должен перекрывать зону нечувствительности других каналов. Если Кп 0.5 то зона нечувствительности П канала 2 градуса. Значит ограниченияя И канала должны быть шире - минимум 2.1 , а в программе было 1. В случае релейного регулирования Д канал не нужен совсем! Скорость нарастания температуры константа. Приращение тоже константа, потому ничем не отличается от П канала. В этих условиях нужно рассмотреть вариант программы с отказом от ПИД регулирования в дали от точки уставки. Т.к. мощность нагревателя и объём воды известны, то по разности температур текущей и уставки можно точно рассчитывать время включения нагревателя для достижения необходимой температуры и только потом переходить к ПИД для удержания. В этом случае первого заброса не будет и выход на стационар будет существенно быстрее.
Здравствуйте всем!
Могу предложить свой вариант регулятора ( типа ПИД) отличающийся от стандартного типа. Сам его разработал и использую. Работает вроде неплохо. Несильно критичен к внешним воздействиям и условиям регулирования. Для вашего варианта регулирования должен подойти. Попробуте его и поделитесь качеством его регулирования.
Выходная мощность Р.вых будет рассчитываться через каждый интервал времени интегрироования, в нашем случае это 10 сек. или любое другое. Она будет равна приращению пропорциональной составляющей – П и вычитанию интегральной составляющей – И.
Полная формула расчета будет выглядеть следующим образом:
Р.вых = Р.вых + (Т.зад-Т.реал)*П.коэф – (Т.нач.изм. - Т.кон.изм.)*И.коэф
При превышении выходной мощности Р.вых установленного максимального значения, оно приравнивается максимальному значению (при Р.вых > 100 тогда Р.вых = 100). При уменьшении выходной мощности Р.вых меньше минимального значения, оно приравнивается минимальному значению (при Р.вых < 0 тогда Р.вых = 0). Таким образом ограничивается минимальная и максимальная мощность.
Предварительные испытания с различными мощностями нагрева и разными объёмами нагреваемого тела, показали, что регулятор настраивается один раз. Коэффициенты были взяты следующим образом П.коэф – 0,21 И.коэф – 2,9 . Коэффициенты были выбраны таким образом, чтобы обеспечить приемлемую скорость нарастания при относительно большой разнице между реальной и заданной температурой, а также примерно одинаковую компенсацию параметров «П» и «И» в диапазоне примерно равных значений между реальной и заданной температурой.
Был применен следующий метод дискретным регулированием нагрева. Общий интервал сигнала был выбран равным 10 сек. Общий интервал сигнала был приравнен к времени интегрирования, так, как за это время были произведены замеры по изменению температуры. Общий интервал делился на количество сегментов равное количественно выходу регулятора. По таймеру имеющему длительность времени равную одному сегменту происходило суммирование этих интервалов. В начале общего интервала интегрирования выход включался на нагрев. При равенстве количества сегментов и значения выхода регулятора происходит отключение нагрева. Так например при выходе регулятора 30% , нагреватель сначала будет включенным 30 временных сегментов, а 70 временных сегментов будет выключен. При повторном интервале интегрирования процесс повторится. Если на выходе регулятора будет 0%, то не успев включится, нагреватель будет включенным 0 временных сегментов, а 100 временных сегментов будет выключен. Если на выходе регулятора будет 100%, то включившись, нагреватель будет постоянно включенным 100 временных сегментов, а 0 временных сегментов будет выключен.
Будет интересно, если вы протестируете этот алгоритм.
А может сначала какой нибудь вузовский учебник почитать типа основы автоматического регулирования?
(Т.нач.изм. - Т.кон.изм.)*И.коэф
шиза какая
Шиза не шиза, а работает. И по моему опыту лучше чем класический ПИД. И коэфиценты подбирать легче. Вообще я их один раз подбирал. Класический ПИД тоже пробобовал ставить на регулятор. Подбирать сложнее, практически методом тыка. Да и когда условия хоть чуть меняются... Начинает плохо регулировать, опять надо подгонять коэффиценты. Нестабилный этот класический ПИД. много костылей надо...
Эти учебники небоги составляли, а людям свойственно заблуждаться.
Что плохого, если я смотрю на эту проблему сдругой стороны?
Это не смотрения на проблему с другой стороны. Все вопросы регуляторов изучение подробно. PID это общий вид. Как любое универскльное средство под конкретное приложение настраивается трудно. Искусство инженерного проектирования регуляторов как раз и заключается в правильном начальном выборе необходимых каналов регулирования и коэффициентов, соответствующих параметрам системы. В любом случае так спроектированные регуляторы являются частными случаями под конкретную задачу. И даже если они работают хорошо в частном случае совершенно не значит что это униаерсальное новое средство. И что они будут работать хорошо на других системах.
Предлагая новый алгоритм регулирования надо как минимум объяснить чем он он отличается от стандартного. Да и реализация выполнена без понимания физики процессов. Например выбор времени дискретизации должен быть связан с постоянной времени системы. Можете объяснить с чем связан выбор 10 сек? Интегральная составляющая должна где то накапливаться. Может быть не увидел где?
даже судя по выбранным именам переменных
автор путает дифференциалы и интегралы или, что более вероятно, просто списал код где-то в инете
Уважаемый nik182, 10 сек. были выбраны просто из соображения, что за более короткое время, мой процесс (нагрева) просто неуспевал сколь значительно меняться. Время контроля можно менять произвольно, на лету. Просто это-же логично, что проверяя, за какое время что поменяется, то регулировать за это-же время. Регулятор придумывал сам, исходя из логики - как бы я сам регулировал и перевел в формулы. Код предоставил, чтоб было понятно что делает регулятор. Способ регулирования дискретным сигналом аналоговую величину тоже придумал сам, хотя вроде похожее регулирование слышал, что кто-то уже применял.
Чем предложенный способ регулирования (ПИД) лучше или хуже классического, сказать немогу. Поэтому и предлагаю автору ветки попробовать и может дать свое мнение. Так как с классическим регулятором он уже наигрался и вроде даже подобрал режимы. Что ему стоит просто добавить в свой код дополнительный регулятор и выбор регулирования то по 1, то по 2. Я кстати так пробовал и по качеству регулирования больших различий невидел. Но все таки оставил регулирование на своем регуляторе. Так как во первых долго и муторно подбирать коэффиценты, а при изменении внешних воздействий и изменении начальных условий ( обьем, масса, теплопотери, подводимая мощность) класический ПИД сразу пасует.
А что мешает просто попробовать?
Ну наверно то, что курс автоматического регулирования в институте был и мы делали лабы и сдавали экзамены. Кроме того по жизни пришлось не однократно проектировать и настраивать ПИД для самых разных применений и я вполне представляю, что должно получиться в конце концов. Судя по тексту программы ни к ПИД ни к автоматическому регулированию она не имеет никакого отношения. Они именно делает как сказано - как бы я делал сам. Смысла тестировать нет, потому что воспроизвести Ваши условия эксперимента не возможно, на другом оборудовании будет работать кое как.
Способ регулирования дискретным сигналом аналоговую величину тоже придумал сам
поздравляю, вы изобрели ШИМ :)
"О сколько нам открытий чудных..." ...особенно тем, кто сразу хватается что-то выдумывать. не читая книжек. Ну да, "книжки ведь писали не боги...", чего ж их читать, верно?
Так каким фактором является вторая переменная в вашей формуле - интегральным или дифференциальным?
что мешает просто попробовать?
заглянул в архивы и обнаружил, что вы уже предлагали свой регулятор три года назад
http://arduino.ru/forum/obshchii/sobstvennyi-algoritm-raboty-pid-regulyatora
и вам уже тогда говорили ровно тоже самое, что и сейчас - что в предложенном нет ничего нового, что перепутан дифференциал с интегралом и что без знаний не стоит рассчитывать создать что-то сколь-нибудь полезное для других участников. Даже замечания уважаемого nik182 тогда и сейчас повторяются почти слово в слово :)
Судя по всему, никаких выводов вы не сделали и книжки читать и не думали. Даже поленились переписать комментарии в коде, чтобы параметр Kd назвать дифференциальным коэффициентом ... Или может вы реально не понимаете разницы между "И" и "Д" компонентами регулятора?
Стоит ли вторично тратить время на эту "шляпу"?
b707 спасибо за напоминание. Забавно было почитать старые посты. Действительно за 3 года ничего не поменялось.
Уважаемый b707, такой способ регулирования мощности можно назвать ШИМ наверное с натяжкой, так как в классическом ШИМ частота дискретизации намного превышает период регулирования. Поэтому ШИМ наверное и не реализовывают на простых пускателях и реле. В моем случае такой способ регулирования был выбран именно для небыстрой аппаратной части. Но так, что-бы точность регулирования оставалас на неплохом уровне, соизмеримом с аналоговым управлением.
Так же хочу заметить, что вместо конструктивных ответов и вопросов заданных форуму ранее, вы задрав нос послали меня лесом учить матчасть. Так, что спасибо, что я всё-таки разобрался с практической реализацией классического ПИД регулятора. Поэтому реализовал и сравнил работу обоих регуляторов, о чем и заметил выше.
Мне грустно, что нет помощи и конструктивного диалога. А я хотел услышать мнение компетентных форумчан не про реализацию кода и название переменных, а по поводу самой идеи. Вот и уважаемый nik182, пишет, что знает о регулировании ПИД все вдоль и поперек, так что, жалко чиркануть 2 строчки кода, практической реализации? В нете много информации реализации ПИД , но без опытного наставника в ней сложно разобраться... Поэтому, я сечас хотел помочь человеку в его проекте, правда со своим знанием и пониманием. Но не для того-ли сделанны эти форумы?
по ШИМ - это называется "медленный ШИМ", почитайте. Писать, что вы его сами придумали - так же смешно, как утверждать что вы написали " я помню чудное мгновенье...".
А что до "имен переменных" - вы так и не поняли, что дело не в именах, а в том что вы путаете дифференциал и интеграл, что показывает вашу полную дремучесть в теории ПИД. Прежде чем изобретать новое - изучи старое.
И не надо теперь делать вид, что вы пришли за советом, а вас не поняли. Вы пришли хвастать своим гениальным алгоритмом, что отлично видно по теме трехлетней давности. Три года назад вам уже дали кучу советов, что не так с вашим кодом. Вы что-нибудь учли из замечаний той дискуссии? - нет!
Так какой смысл тратить на вас время, если вы не слушаете других?
Что то я не понимаю. Я дал все начальные наводки. Надо оценить постоянную времени системы - время измерения параметров регулирования. Например для воды можно посчитать за сколько нагревается на 1 градус - известна теплоёмкость воды, объём воды и мощность нагревателя. Соответственно от этой цифры выбирать время оцифровки параметров и начальные значения постоянных ПИД. Об этом во всех книжках по ПИД написано и показано как выбирать параметры. Если нужно совсем хорошо сделать, то нужно оценить постоянную времени охлаждения, она обычно существенно больше. С помощью градусника и часов, при чём в нескольких точках температуры воды. Это нужно, что бы менять коэффициенты ПИД в зависимости от режима - нагрев или охлаждение. Для этих двух режимов коэффициенты разные! Дальше выбор необходимых каналов П И Д. Например, диф канал при условии отсутствия резких изменений температуры воды из за долива, или при релейном регулировании просто лишний, П И каналы вполне справляются.
Это всё базовые вещи, которые описаны в книгах не богами написанных. Чем помочь человеку, который не имеет этих базовых знаний не понятно. Читать полный курс лекций на форуме не получится. Про саму идею я тоже писал. Нет её. Есть посконное применение импирических знаний, ни как не подкреплённых теорией и соответственно не имеющих широкого применения. У Вас работает - замечательно. Но себе я подобное брать не буду. Классическая реализация обычно работает стабильно.
Что такое две строчки практической реализации вообще не понятно. Обычно ПИД пишется в 8 - 16 строк в зависимости от конкретных потребностей. И говорить можно о конкретной системе, о которой известно всё. Абстрактно можно взять ардуиновскую ПИД библиотеку. Ничего другого по абстрактным данным посоветовать трудно.