Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

Пользовательские блоки ПИД регуляторов, прочих регуляторов и для работы с ШИМ выходами
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#1

Сообщение dimalimite » 20.12.2018{, 13:12}

Добрый день.
Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом. Сделаны на классическом разностном уравнение.
Программа и блоки прикреплены к сообщению или можно скачать с диска.
Если есть желание посмотреть/послушать теорию как работают, то
СпойлерПоказать
СпойлерПоказать
Реакция на ступенчатые воздействия одновременно трех регуляторов
СпойлерПоказать
Как устроены данные блоки
СпойлерПоказать
Развлекательно-позновательное видео про настройку регуляторов
СпойлерПоказать
Как влияют параметры ПИД-регулятора на процесс
СпойлерПоказать

Диск
СпойлерПоказать
04.01.2019 Добавил версию регулятора c аналоговым выходом _V1. Теперь не требуется подача внешнего импульса 100 мс по фронту. Всё в одном блоке.
05.01.2019 Добавил версию регулятора c ШИМ выходом _V1. Теперь не требуется подача внешнего импульса 50 мс по фронту. Всё в одном блоке.
06.01.2019 Добавил версию регулятора c трехпозиционным выходом _V1. Теперь не требуется подача внешнего импульса 100 мс по фронту. Всё в одном блоке. См. сообщение №5 ниже.
09.01.2019 Добавил версию регулятора c аналоговым выходом _V11. Расширены ограничения на время цикла (от 0,05 сек), время исполнительного механизма (от 0,05 сек), время интегрирования Ти (от 0,05 сек). См. сообщение №11 ниже.
27.01.2019 Добавил версию регулятора с ШИМ выходом_V12. См. сообщение №28 ниже. Добавлен для информации выход текущей мощности в % (НЕ ИСПОЛЬЗОВАТЬ ДЛЯ УПРАВЛЕНИЯ АНАЛОГОВЫМИ МЕХАНИЗМАМИ!!!!) и возможность изменения мин. длительности импульса от 0 до Цикл/2 сек в режиме РЕЛЕ.
Вложения
ANALOG_PID_V1_(CODE).ubi
(88.12 КБ) 582 скачивания
PWM_PID_(CODE).ubi
(102.14 КБ) 559 скачиваний
ANALOG_PID_(CODE).ubi
(86.49 КБ) 481 скачивание
3_WAY_PID_(CODE).ubi
(65.25 КБ) 489 скачиваний
3_TYPE_PID.flp
(508.73 КБ) 605 скачиваний
Последний раз редактировалось dimalimite 23.05.2020{, 21:46}, всего редактировалось 8 раз.

Muxaul
Рядовой
Сообщения: 44
Зарегистрирован: 02.10.2018{, 12:38}
Репутация: 1
Имя: Михаил

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#2

Сообщение Muxaul » 29.12.2018{, 16:55}

Неплохо было бы либо тут либо в описании блока описать входы и выходы блока.

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#3

Сообщение AlexCrane » 29.12.2018{, 18:46}

Muxaul, Если зайти в редактирование блока, то там все входа и выхода подробно расписаны.
Конечно не удобно, но все-же лучше чем ничего.
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

Muxaul
Рядовой
Сообщения: 44
Зарегистрирован: 02.10.2018{, 12:38}
Репутация: 1
Имя: Михаил

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#4

Сообщение Muxaul » 29.12.2018{, 19:44}

AlexCrane писал(а):
29.12.2018{, 18:46}
Если зайти в редактирование блока
Спасибо, да, я просто не знал что блоки можно редактировать. Потом увидел.
Спасибо за оперативный отзыв

dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#5

Сообщение dimalimite » 05.01.2019{, 10:50}

Не получилось прикрепить файл к исходному сообщению. Прикрепляю сюда.
Может быть кто-нибудь подскажет в чём проблема? Или больше 5 вложений делать нельзя?
Вложения
3_WAY_PID_V1_(CODE).ubi
(69.24 КБ) 256 скачиваний
PWM_PID_V1_(CODE).ubi
(108.67 КБ) 269 скачиваний

Dmabst
Сержант
Сообщения: 149
Зарегистрирован: 08.12.2018{, 16:49}
Репутация: 10
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#6

Сообщение Dmabst » 08.01.2019{, 03:34}

Посоветуйте пожалуйста блок для реализации регулировки (периодического ступенчатого снижения) и стабилизации на этих уровнях в течении 2-3 минут числа оборотов двигателя постоянного тока 24В, 200мА, 90 об/мин. Уровни приблизительно составляют 90, 75, 65, 57, 51, 46, 42, 38, 35, 33, 31, 29, 27, 26, 24, 23, 22, 21, 20 об/мин и зависят в небольших пределах от числа оборотов другого двигателя - 725
об/мин (стабильность которого, в свою очередь, определяется стабильностью сети 220В). Данную зависимость учёл в формуле вычисления вышеприведенных ступенчато изменяющихся задаваемых чисел оборотов (уставки). Каким способом, пользуясь Вашими блоками, можно реализовать данную задачу - ШИМ или аналоговым?

dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#7

Сообщение dimalimite » 08.01.2019{, 15:01}

Dmabst, день добрый.
Аналоговым регулятором, если у вас есть обратный сигнал по скорости этого двигателя. А на выходе вы чем управлять хотите? Можете более подробно описать.
Мой ШИМ блок- это, так называемый, "медленный ШИМ" для объектов типа электротэн или наподобие такого.

Отправлено спустя 5 минут 41 секунду:
И ещё для любого регулятора самым сильным возмущающим воздействие является изменение уставки. И я вам рекомендую в своей формуле это учесть, то есть не ступенчато выдавать переход скорости например с 90 на 75, а более-менее плавной рампой.

Dmabst
Сержант
Сообщения: 149
Зарегистрирован: 08.12.2018{, 16:49}
Репутация: 10
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#8

Сообщение Dmabst » 08.01.2019{, 21:39}

Обратный сигнал по скорости двигателей в моей схеме дают оптопары. При помощи скоростных счётчиков считываются периоды оборотов. Данные поступают в математические блоки суммирования, деления и умножения, где вычисляется уставка - требуемый период оборотов 24-х вольтного мотор-редуктора. Эти значения могут иметь только дискретное значение. Предполагаю, что придётся сильно уменьшить время VALVE (CYCLE?) и подобрать коэффициенты ПИД-регулятора. Исходя из того, что Вы рекомендуете воспользоваться блоком аналогового регулятора, планирую применить 12-битный ЦАП MCP4725. Благо блок на него имеется в Flprog.
На ANALOG_OUT_MIN и ANALOG_OUT_MAX нужно ввести константы сразу 0 и 4095, или 0 и 255, с последующим их переносом блоком SCALE к величинам 0 и 4095 (подключив его на выход Вашего аналогового блока)?
К выходу ЦАП планирую подключить следующую схему: ШИМ сигнал управляет микросхемой LM317T, посредством которой и будет осуществляться регулировка числа оборотов мотор-редуктора.
Как Вы считаете, данное решение будет оптимальным?

dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#9

Сообщение dimalimite » 09.01.2019{, 00:06}

Dmabst, вечер добрый!
"Эти значения могут иметь только дискретное значение." - вот эту фразу я не понял. Поясните.
У меня в блоке (ANALOG_PID_V1_(CODE).ubi) ограничения на мин. время привода (VALVE-это в вашем случае разгон от 0 до макс. скорости 4095, от 15 до 250 секунд) и цикл (CYCLE-время квантования или между соседними измерениями и корректировкой воздействия, от 1 до 25 секунд) заданы просто на основание моего опыта и + это защита от деления на 0.
Если вы хотите быстрее, то это можно без проблем сделать убрав или скорректировав вот эти две строки:
CYCLE = constrain( CYCLE, (1.0), (25.0) ); // Цикл 1...25.0 сек;
VALVE = constrain( VALVE, (15.0), (250.0) ); // Время привода 15...250.0 сек.
Не забудьте, что эти значение задаются в секундах (float, то есть если хотите 100 мс цикл или скорость привода, то это 0,1 сек). Главное не задавайте нули!!!! Ну и CYCLE должен быть больше или, как минимум, равен циклу измерения скорости и циклу самой программы.
Посмотрел вашу ссылку на схему (только она же 11,25 В может дать на выходе, а вам же 24 нужно. или может я что-то не правильно понял) . Если вас не устраивает встроенный 8-битный 0-255 ШИМ на выходе Ардуино, то можете и 12-битный 0-4095 MCP4725 использовать. Присваиваете сразу ANALOG_OUT_MIN=0 и ANALOG_OUT_MAX=4095 (или 255). Единственно нужно перевести выходной сигнал регулятора ANALOG_OUT float в int (блок конвертация типов).
Так же при настройке коэффициентов не забудьте, что Кр будет измеряться в ШИМ/обороты. То есть, например при Кр=1 и отклонение 1 оборот изменение выхода ШИМ будет 1. Вообще настройка будет достаточно простой, т.к. практически отсутствует какое-либо запаздывание. Если Ти=1 сек будет много, то тоже скорректируйте строку:
K_I = constrain( K_I, (1.0), (9999.0) ); // Ти 1...9999.0 сек.
На сколько будет оптимально - это уже вам решать нужно, т.к. я процесс ваш не представляю:).

Dmabst
Сержант
Сообщения: 149
Зарегистрирован: 08.12.2018{, 16:49}
Репутация: 10
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#10

Сообщение Dmabst » 09.01.2019{, 01:52}

Вы предугадали мой вопрос! Я как раз хотел спросить об увеличении скорости реакции, т.к. она не превышает 6-7% в сек. при любых настройках. Спасибо за развёрнутый ответ, буду пробовать.
Дискретные значения - это ряды (слои) намотки на катушку свитого в витую пару изолированного провода. Для свивки и намотки планирую использовать устройство из двух двигателей - шуруповёрта и мотор-редуктора, соответственно. По мере намотки свитого провода на катушку нужно с каждым новым слоем уменьшать угловую скорость (число оборотов) на рассчитанную величину, чтобы поддерживать линейную скорость, и, соответственно, шаг свивки - постоянными.
По поводу схемы управления двигателем - планирую увеличить её напряжение питания до 28 вольт.

dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#11

Сообщение dimalimite » 09.01.2019{, 12:10}

Dmabst, день добрый.
Всё правильно, вы упирались вот сюда:
D_T_MAX = (ANALOG_OUT_MAX - ANALOG_OUT_MIN) * CYCLE / VALVE; // Максимальное приращение на текущем шагу регулирования выходных единиц
При CYCLE=1 и VALVE=15 и при работе от 0 до 100 получается 6% максимум, т.к. "регулятор считает", что ваш механизм быстрее не сможет.
Я просто ориентируюсь на более медленные процессы и исполнительные механизмы.
Но я думаю, что стоит расширить диапазон применения. Думаю, что 50 мсек (0,05 сек) будет вполне достаточно.
См. приложение. Изменил:
K_P = constrain( K_P, (-999.0), (999.0) ); // Кр -999.0...999.0 выходные единицы/измеряемые еденицы, знак + для нагревателя, знак - для холодильника
K_I = constrain( K_I, (0.05), (9999.0) ); // Ти 0.05...9999.0 сек
CYCLE = constrain( CYCLE, (0.05), (25.0) ); // Цикл 0.05...25.0 сек
VALVE = constrain( VALVE, (0.05), (250.0) ); // Время привода 0.05...250.0 сек

Отправлено спустя 14 минут 25 секунд:
Конечно надо пробовать, но скачком менять задание для регулятора не лучшее решение. Хотя для вашей задачи Тд можно вполне 0 поставить и не такая большая реакция на скачки будет.
Если не будет получаться нормально получаться мотать из-за этих скачков, то можно придумать более "хитрый" алгоритм.
Вложения
ANALOG_PID_V11_(CODE).ubi
(88.14 КБ) 248 скачиваний

Dmabst
Сержант
Сообщения: 149
Зарегистрирован: 08.12.2018{, 16:49}
Репутация: 10
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#12

Сообщение Dmabst » 10.01.2019{, 00:00}

dimalimite добрый вечер.
Благодаря внесённым Вами в блок расширенным настройкам появилась возможность использовать данный блок для управления быстрыми процессами и быстрыми исполнительными механизмами. Пока опробовал на Arduino Mega без подключения двигателей. Впечатлён возможностями настроек. На днях попробую с двигателями.

Аватара пользователя
Phazz
Полковник
Сообщения: 2552
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 367
Откуда: Сургут
Имя: Анатолий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#13

Сообщение Phazz » 25.01.2019{, 18:07}

dimalimite, Есть предложение добавить в блок PWM_PID выход текущей нагрузки.

dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#14

Сообщение dimalimite » 26.01.2019{, 23:35}

Phazz, Вечер добрый.
Блок в приложение.
Добавил строчку:
// Текущая мощность в %
POWER = SUM_D_T_S * 100.0 / CYCLE;
"В обратную" сторону рассчитал, т.к. только чтобы в режиме РЕЛЕ корректно отображалось потому что там мин. выход и прерывание сигнала 0,5 сек. Вообще конечно для такого типа регулятора реле лучше не использовать :) Умрет быстро. Если в режиме РЕЛЕ поставить CYCLE=1 сек, то выход будет или 0, или 0,5 сек, или 1 сек (0, 50, 100%). Если на выходе реле, то тогда хотя бы CYCLE=2 сек, что хоть было 0, или 0,5-1,5, или 2 сек (0, 25-75, 100%).
Как-то так.
Уже много их разных "наплодил":). Может вообще всё в 1 запихнуть и чтобы выбор был по какому алгоритму работать? Но он весить много будет :(((.

27.01.2019 Перезалил файл в связи с необъяснимым багом (см. ниже сообщения). Если кто-то столкнулся с такой проблемой инструкция по устранению ниже или перекачать файл.
Вложения
PWM_PID_V11_(CODE).ubi
(129.63 КБ) 203 скачивания
Последний раз редактировалось dimalimite 27.01.2019{, 19:17}, всего редактировалось 2 раза.

Аватара пользователя
Phazz
Полковник
Сообщения: 2552
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 367
Откуда: Сургут
Имя: Анатолий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#15

Сообщение Phazz » 27.01.2019{, 18:10}

dimalimite, Не компилируется, потому что не задекларирована переменная MILLIS_FLOAT_1_144659106_144659106_1

dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#16

Сообщение dimalimite » 27.01.2019{, 18:51}

Phazz, проверил действительно какая-то ерунда!!!
Я этот блок сделал из PWM_PID_V1 просто добавлением одной строки.
Там такой проблемы нет.
Я сейчас ещё поковыряю, но похоже это ошибка FLProg.
MILLIS_FLOAT_1_144659106_144659106_1 - ТАКОЙ ПЕРЕМЕННОЙ ВООБЩЕ НЕТ!
Вот что есть:
float MILLIS_FLOAT_144659106_1; // Системное время мсек
float MILLIS_FLOAT_SEK_144659106_1; // Системное время сек
float MILLIS_FLOAT_1_144659106_1; // Метка времени сек текущего шага
Это он объявляет, а далее в теле программы почему-то заменяет переменную MILLIS_FLOAT_144659106_1, какой-то MILLIS_FLOAT_1_144659106_144659106_1.
Руками заменил эту ерунду на нужную и всё работатет.
ВОТ ЭТО (НЕТ ТАКОЙ ПЕРЕМЕННОЙ):
MILLIS_FLOAT_1_144659106_144659106_1 = float(millis()); // Перевод системного времени мсек в тип float
ЗАМЕНИТЬ НА:
MILLIS_FLOAT_144659106_1 = float(millis()); // Перевод системного времени мсек в тип float
И работает.
Попробую разобраться в чём суть.

Аватара пользователя
Phazz
Полковник
Сообщения: 2552
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 367
Откуда: Сургут
Имя: Анатолий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#17

Сообщение Phazz » 27.01.2019{, 18:53}

Сейчас перезагрузил программу ошибка пропала

Отправлено спустя 1 минуту 45 секунд:
А еще я поставил в блоке использовать один раз

dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#18

Сообщение dimalimite » 27.01.2019{, 19:03}

Phazz, Я сейчас написал самой первой строкой кода комментарий:
//Программа
Пересохранил блок ещё раз и уже вот такой MILLIS_FLOAT_1_144659106_144659106_1 штуки не было.
Это какой-то баг похоже...

Отправлено спустя 53 секунды:
Phazz, Работает? Всё нормально?

Отправлено спустя 4 минуты 29 секунд:
Phazz, Использовать 1 раз - вообще не принципиально для этого блока. Можно хоть 10 раз, если памяти хватит:)
Вложения
PWM_PID_V11_(CODE).ubi
(129.63 КБ) 207 скачиваний

dimalimite
Рядовой
Сообщения: 53
Зарегистрирован: 03.12.2018{, 00:26}
Репутация: 18
Имя: Дмитрий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#19

Сообщение dimalimite » 27.01.2019{, 19:21}

Phazz, будет возможность, отпишитесь по работоспособности.

Аватара пользователя
Phazz
Полковник
Сообщения: 2552
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 367
Откуда: Сургут
Имя: Анатолий

Цифровой ПИД регулятор с аналоговым, трехпозиционным и ШИМ выходом

#20

Сообщение Phazz » 27.01.2019{, 19:25}

Ошибок нет, а вот с логикой работы непонятное происходит. Температура уже равняется уставке, а мощность все равно на 100%

Отправлено спустя 4 минуты 46 секунд:
dimalimite, Если мне нужна только пропорциональная составляющая, то на интегральную можно в 0 поставить или нужно максимальное большое число ставить?

Ответить

Вернуться в «ПИД регуляторы (PID), блоки для ШИМ»