Отвлекитесь, эмбеддеры! Отвлеченные темы - обсудить проблемы тепловой смерти вселенной, или просто пиво. Этот раздел - для отдыха. |
19.11.2017, 22:42
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Мои ответы на вопросы AR_Favorit
Чтобы не засорять тему Сколько видов работ вы выполняете без оплаты ? ( https://kazus.ru/forums/showthread.php?t=115912) вопросами AR_Favorit обращенными ко мне, я решил создать отдельную тему, и ответить на его вопросы.
Надеюсь эта тема будет познавательной для форумчан, и поможет им понять некоторые вещи, связанные с написанием кода для реализации ПИД-регулятора. А примером послужит код программы, предложенный AR_Favorit
Цитата:
|
Код:
if (pid_counter‹(EE_PID_TIME*1000)) pid_counter++;
else
{
pid_counter = 0;
PID_curr_err = EE_FUEL_TARGET_TEMP - temp;//Начало
if (integral_err‹(EE_PID_TIME*2000)) integral_err += PID_curr_err;
control = (int32_t)EE_PID_P*PID_curr_err;
control += (integral_err*(int32_t)EE_PID_I)/1000;
control -= (PID_prev_err - PID_curr_err)*(int32_t)EE_PID_D;
PID_prev_err = PID_curr_err;//конец
}
if (control›heat_counter) HEAT_ON; else HEAT_OFF;
heat_counter++;
if (heat_counter›(EE_PID_TIME*1000)) heat_counter=0;
|
где
pid_counter = 0 - ПЕРВЫЙ СЧЕТЧИК ЦИКЛОВ ПРОХОДОВ ПРОГРАММЫ
heat_counter = 0 - ВТОРОЙ СЧЕТЧИК ЦИКЛОВ ПРОХОДОВ ПРОГРАММЫ
EE_PID_TIME = 100 мc - ДЛИТЕЛЬНОСТЬ ЦИКЛА ОПРОСА РЕГУЛИРУЕМОЙ ВЕЛИЧИНЫ (ТЕМПЕРАТУРЫ БАКА)
EE_PID_P = 1.0 - КОЭФФИЦИЕНТ УСИЛЕНИЯ ДЛЯ ПРОПОРЦИОНАЛЬНОЙ СОСТАВЛЯЮЩЕЙ ПИД-РЕГУЛЯТОРА
EE_PID_I = 1.0 - КОЭФФИЦИЕНТ УСИЛЕНИЯ ДЛЯ ИНТЕГРИРУЮЩЕЙ СОСТАВЛЯЮЩЕЙ ПИД-РЕГУЛЯТОРА
EE_PID_D = 1.0 - КОЭФФИЦИЕНТ УСИЛЕНИЯ ДЛЯ ДИФФЕРЕНЦИИРУЮЩЕЙ СОСТАВЛЯЮЩЕЙ ПИД-РЕГУЛЯТОРА
PID_curr_err = 0 - ТЕКУЩАЯ ОШИБКА РАССОГЛАСОВАНИЯ (ГРАДУСЫ)
PID_prev_err = 0 - ПРЕДЫДУЩАЯ ОШИБКА РАССОГЛАСОВАНИЯ (ГРАДУСЫ)
integral_err = 0 - СУММА ОШИБОК РАССОГЛАСОВАНИЯ (ГРАДУСЫ)
control = 0 - УРОВЕНЬ СИГНАЛА УПРАВЛЕНИЯ
EE_FUEL_TARGET_TEMP = 100 - КОНЕЧНАЯ ТЕМПЕРАТУРА НАГРЕВА(ГРАДУСЫ)
temp = 20 - ТЕКУЩАЯ ТЕМПЕРАТУРА НАГРЕВА(ГРАДУСЫ)
HEAT_ON = ВКЛ - СОСТОЯНИЕ "НАГРЕВАНИЕ" ДЛЯ РЕГУЛИРУЮЩЕГО ЭЛЕМЕНТА
HEAT_OFF = ВЫКЛ - СОСТОЯНИЕ "ОХЛАЖДЕНИЕ" ДЛЯ РЕГУЛИРУЮЩЕГО ЭЛЕМЕНТА
Примечание
Для полноты освещения вопросов, связанных c созданием кода реализации ПИД-регулятора, и работы самого ПИД-регулятора, приветствуются любые замечания и предложения от форумчан, специализирующихся в рассматриваемых вопросах!
Последний раз редактировалось ALEGYR; 20.11.2017 в 03:40.
|
|
|
|
20.11.2017, 00:11
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
Цитата:
|
if (integral_err‹(EE_PID_TIME*2000)) integral_err += PID_curr_err;
|
а почему ты не спрашиваешь, что такое "2000" в этом выражении, а? Что это такое и в каких единицах оно выражено?
|
Я не спрашиваю, потому что знаю, что это просто масштабный коэффициент, переводящий параметр EE_PID_TIME из миллисекун в секунды. Точно также как и в строках
Цитата:
|
if (pid_counter‹(EE_PID_TIME*1000)) pid_counter++;
|
и
Цитата:
|
if (heat_counter›(EE_PID_TIME*1000)) heat_counter=0;
|
Сообщение от AR_Favorit
|
Вот тебе еще один вариант для того, чтоб у тебя в голове могло что-то перещелкнуть уже: это же коэффициент. Не тот коэффициент, что весовые для составляющих, а мой собственный, личный коэффициент, как раз специально для тебя "переводящий секунды в градусы", то есть имеющий размерность "гр/сек".
Тогда получается, что если EE_PID_TIME - секунды, то EE_PID_TIME * 2000 гр/сек - это уже градусы. И градусы сравниваются с градусами. Что скажешь?
|
В моей голове действительно перещёлкнуло, и я понял, что это действительно ТВОЙ коэффициент!!!
Ведь только ты мог ввести в свой код некий коэффициент, который у тебя характеризует скорость нагревания твоего бачка с маслом, да еще со значением 2000(!) градусов в секунду!
Я конечно понимаю, что ты свой код писал для ООООчень больших бачков, но я сильно сомневаюсь что они могут нагреваться до нескольких тысяч градусов, да еще со скоростями сравнимыми с двумя тысячами градусов в секунду! То есть круче и быстрее чем нагреваются сопла реактивных самолетов!!!
Ведь произведение EE_PID_TIME*2000 будет еще круче чем твой коэффициент, и получается, что в строке
if (integral_err‹(EE_PID_TIME*2000)) integral_err += PID_curr_err;
переменная integral_err сравнивается со значением 200 000 градусов!
|
|
|
|
20.11.2017, 01:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Хоть я и не специализируюсь на построении ПИД регуляторов, но всё-таки замечу, что все комментарии к фрагменту кода AR_Favorit, написаны форумчанином ALEGYR исключительно исходя из своего личного представления о программировании и своего понимания логики работы ПИД-регулятора.
Что там сделано на самом деле, точно может сказать тот, кто хотя бы почитал про принципы ПИД-регулирования и понял, как же оно происходит. Или автор кода - уж он то точно знает, какой параметр за что отвечает в его программе.)))
Топикстартеру настоятельно рекомендую почитать хотя бы в википедии про принципы ПИД-регулирования и вспомнить хотя бы школьную алгебру, чтоб не облажаться также, как и в предыдущем топике.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо omercury за это сообщение:
|
|
|
20.11.2017, 02:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от omercury
|
Топикстартеру настоятельно рекомендую
|
Поздно!
Ну тогда сразу и начнём.
Сообщение от ALEGYR
|
pid_counter = 0 - ПЕРВЫЙ СЧЕТЧИК ЦИКЛОВ ПРОХОДОВ ПРОГРАММЫ
heat_counter = 0 - ВТОРОЙ СЧЕТЧИК ЦИКЛОВ ПРОХОДОВ ПРОГРАММЫ
EE_PID_TIME = 100 мc - ДЛИТЕЛЬНОСТЬ ЦИКЛА ОПРОСА РЕГУЛИРУЕМОЙ ВЕЛИЧИНЫ (ТЕМПЕРАТУРЫ БАКА)
EE_PID_P = 1.0 - КОЭФФИЦИЕНТ УСИЛЕНИЯ ДЛЯ ПРОПОРЦИОНАЛЬНОЙ СОСТАВЛЯЮЩЕЙ ПИД-РЕГУЛЯТОРА
EE_PID_I = 1.0 - КОЭФФИЦИЕНТ УСИЛЕНИЯ ДЛЯ ИНТЕГРИРУЮЩЕЙ СОСТАВЛЯЮЩЕЙ ПИД-РЕГУЛЯТОРА
EE_PID_D = 1.0 - КОЭФФИЦИЕНТ УСИЛЕНИЯ ДЛЯ ДИФФЕРЕНЦИИРУЮЩЕЙ СОСТАВЛЯЮЩЕЙ ПИД-РЕГУЛЯТОРА
PID_curr_err = 0 - ТЕКУЩАЯ ОШИБКА РАССОГЛАСОВАНИЯ (ГРАДУСЫ)
PID_prev_err = 0 - ПРЕДЫДУЩАЯ ОШИБКА РАССОГЛАСОВАНИЯ (ГРАДУСЫ)
integral_err = 0 - СУММА ОШИБОК РАССОГЛАСОВАНИЯ (ГРАДУСЫ)
control = 0 - УРОВЕНЬ СИГНАЛА УПРАВЛЕНИЯ
EE_FUEL_TARGET_TEMP = 100 - КОНЕЧНАЯ ТЕМПЕРАТУРА НАГРЕВА(ГРАДУСЫ)
temp = 20 - ТЕКУЩАЯ ТЕМПЕРАТУРА НАГРЕВА(ГРАДУСЫ)
HEAT_ON = ВКЛ - СОСТОЯНИЕ "НАГРЕВАНИЕ" ДЛЯ РЕГУЛИРУЮЩЕГО ЭЛЕМЕНТА
HEAT_OFF = ВЫКЛ - СОСТОЯНИЕ "ОХЛАЖДЕНИЕ" ДЛЯ РЕГУЛИРУЮЩЕГО ЭЛЕМЕНТА
|
Это ты так думаешь, на самом деле
pid_counter - первый (и единственный) счётчик циклов таймера, служащий для установки периода квантования ПИД.
heat_counter - счётчик длительности периода регулирования исполнительного устройства, в данном случае тактируется тем же таймером (что логично), что и счётчик ПИД, а также опять же в данном случае имеет тот же период, что и ПИД-регулятор, хотя может тактироваться от чего угодно и иметь другой период.
EE_PID_TIME - эмпирическая величина, задающая элементарный отрезок времени для отсчёта периода квантования ПИД, измеряется в циклах тактирующего таймера.
С описанием следующих шести параметров согласен, не согласен с их величиной, ибо задаётся при настройке, и трактовкой единиц измерения.
control - выходной параметр ПИД.
EE_FUEL_TARGET_TEMP - контрольный параметр, поддерживаемый регулятором.
temp - входной параметр ПИД, в данном случае вероятнее всего пропорциональный температуре датчика, текущее значение.
HEAT_ON
HEAT_OFF - макросы включения/выключения (что впрочем непринципиально).
Судя по предыдущей переписке, все параметры с префиксом EE_, задаются при настройке и хранится, судя по названию, во внешней EEPROM либо в эмулируемой EEPROM в силу использования МК STM32. Все рабочие параметры имеют тип int32_t, кроме настроечных коэффициентов, которые имеют размерность int16_t, что видно по явному приведению их к нужной размерности в коде.
Ну что, поехали,
continue следует.
Последний раз редактировалось omercury; 20.11.2017 в 02:26.
Причина: ютуба неправильно вставилась
|
|
|
Сказали "Спасибо" omercury
|
|
|
20.11.2017, 03:37
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от omercury
|
Ну что, поехали,
|
Да не проблема.
Для начала уточню, что для рассмотрения алгоритма представленного кода, я могу использовать любые значения переменных. И для простоты я буду использовать простые целые числа
И так первая строка кода
if (pid_counter‹(EE_PID_TIME*1000)) pid_counter++;
В ней производится выдержка времени, по которому производится переход к вычислению выходного параметра ПИД (то есть переменная control).
Поскольку выход на этот код производится по прерыванию таймера контроллера, то первый (и единственный) счётчик циклов таймера pid_counter будет у нас определять время выхода на расчет пида.
Пусть цикл таймера у нас составляет 1 миллисекунду. То есть прерывание по таймеру у нас происходит 1000 раз в секунду
Пусть частота опроса датчика температуры у нас происходит 10 раз в секунду. (Мы же крутые, и хотим максимально эффективно и с максимальной точностью знать состояние объекта регулирования, то есть бачка с маслом)
Тогда мы можем записать, что эмпирическая величина EE_PID_TIME, задающая элементарный отрезок времени для отсчёта периода квантования ПИД равна 100 мc, То есть
EE_PID_TIME = 100 (мc)
Таким образом первая строка кода
if (pid_counter‹(EE_PID_TIME*1000)) pid_counter++;
нам говорит, что пока счетчик pid_counter не отсчитает 100 секунд, мы забываем о расчете пида (то есть сигнал управления control = 0), включаем сигнал HEAT_ON (включаем нагрев) по строке
if (control›heat_counter) HEAT_ON; else HEAT_OFF;
и тупо, в течение 100 (!) секунд, считаем длительность периода нагревания исполнительного устройства, счетчиком heat_counter, по строкам
heat_counter++;
if (heat_counter›(EE_PID_TIME*1000)) heat_counter=0;
Почему именно в течение 100 (!) секунд тупо считаем?! Потому что и первая и последние строки кода имеют одинаковое значение величины сравнения
if (pid_counter‹(EE_PID_TIME*1000)) pid_counter++;
...
if (heat_counter›(EE_PID_TIME*1000)) heat_counter=0;
ВОПРОС - Не круто ли каждые 100 секунд, тупо нагревать бачок, забывая о пиде, который должен 10 раз в секунду знать текущую температуру бачка и рассчитывать control (то есть выходной параметр ПИДа) ?
Последний раз редактировалось ALEGYR; 20.11.2017 в 17:34.
|
|
|
|
20.11.2017, 03:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Пусть цикл таймера у нас составляет 1 миллисекунду.
|
Почему например не микросекунду?
Хотя для понимания принципа это неважно.
Сообщение от ALEGYR
|
Пусть частота опроса датчика температуры у нас происходит 10 раз в секунду. (Мы же крутые, и хотим максимально эффективно и с максимальной точностью знать состояние объекта регулирования, то есть бачка с маслом)
|
А чё так скромно?
Мы его можем опрашивать и МИЛЛИОН раз в секунду.
Но пусть будет 10, неважно.
Кстати, это отдельная операция и производится она в другом участке кода, здесь этого нет. Как и усреднения результата.
Сообщение от ALEGYR
|
Тогда мы можем записать, что эмпирическая величина EE_PID_TIME, задающая элементарный отрезок времени для отсчёта периода квантования ПИД равна 100 мc, То есть
|
Можем, но тогда 0,1*1000=100с.
Многовато, не находишь?
Я бы предпочёл 1 мллисекунду. Это ни много ни мало, а 120 000 тактов ядра МК, вполне достаточно для расчётов.)))
upd
Кстати, это наиболее часто используемый период Systick (системного таймера).
Последний раз редактировалось omercury; 20.11.2017 в 04:02.
|
|
|
|
20.11.2017, 04:55
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от omercury
|
Почему например не микросекунду?
|
Можно и 1 микросекунду! Только зачем? Мы же бачок с маслом нагреваем, а в нем мало что происходит и за 1 миллисекунду!
Сообщение от omercury
|
Я бы предпочёл 1 миллисекунду. Это ни много ни мало, а 120 000 тактов ядра МК, вполне достаточно для расчётов.)))
|
Вообще-то, EE_PID_TIME определятся исходя из требуемой точности к регулируемой величины.
Я не думаю что бочок надо нагревать с точностью до сотых градусов цельсия. Тем более что скорость нагрева (или остывания) бачка, может превышать 10 градусов в секунду! Уж больно бачок с маслом вещь инерционная!!!
А что касается ресурсов для расчета, то расчетов то всего - 3 раза сравнить, 3 раза сложить, да 3 раза умножить!
Сообщение от omercury
|
Можем, но тогда 0,1*1000=100с.
Многовато, не находишь?
|
Конечно нахожу, но код писал не я! Я бы просто написал
if (pid_counter‹ EE_PID_TIME) pid_counter++;
или
if (heat_counter›EE_PID_TIME) heat_counter=0;
а прерывание таймера сделал бы не 1 миллисекунду, а 10 или даже 100!!! Вдруг у нас датчик температуры не очень ловок, переводя аналог в цифру!
Последний раз редактировалось ALEGYR; 20.11.2017 в 04:58.
|
|
|
|
20.11.2017, 05:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Надеюсь эта тема будет познавательной для форумчан, и поможет им понять некоторые вещи, связанные с написанием кода для реализации ПИД-регулятора. А примером послужит код программы, предложенный AR_Favorit
|
Человек, не понимающий принципа работы ПИД-регулятора и не умеющий программировать будет объяснять форумчанам работу PID_алгоритма на основе чужого кода, работу которого он не смог понять и даже не догадался проверить на практике (ардуина справится)? Это снова будет весело
Я пока немного посмотрю, смогут ли "форумчане, специализирующихся в рассматриваемых вопросах" что-то втолковать в этом случае "рассматривающему"
Только, как автор "рассматриваемого" отрывка кода, сразу замечу, чтоб форумчане не были введены в заблуждение нашим "разработчиком", что в данном участке кода все переменные, за исключением тех, имя которых начинается с префикса "ЕЕ_" - имеют размерность int_32, а эти самые "ЕЕ_" - размерность int_16, и все величины в расчетах (включая весовые коэффициенты PID) смасштабированы в бОльшую сторону на один или несколько десятичных порядков, чтобы избежать потерь точности из-за отсутствия "дробных частей".
Процитированный участок кода вызывается в прерывании по таймеру Systick, возникающему раз в миллисекунду. "Рассматривающему" это понять проблемно, но данный участок кода выдран из программы реального устройства, в которой помимо данного кусочка еще довольно много строк, оформленных в виде конечных автоматов, вызываемых раз в миллисекунду в основном цикле по флагу, устанавливаемому в этом прерывании.
Собственно, omercury определил эти моменты совершенно верно.
Последний раз редактировалось AR_Favorit; 20.11.2017 в 06:26.
|
|
|
|
20.11.2017, 12:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 02.07.2009
Сообщений: 1,119
Сказал спасибо: 1,248
Сказали Спасибо 2,178 раз(а) в 624 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
AR_Favorit, А причем андурина то??? Пид прекрасно реализуется и на обычном 8 битном и нискоскоростном контроллере. Вставлю и свои 5 копеек на основе своего непосредственного опыта.
Вводная информация. занимался пид регуляторами в течении почти 7 лет. С 95 года. Работал в фирме выпускающей терморегуляторы. Много бывал на пусконаладках. Делали и на пиках и на атмелах. Блин и хватало-же.
Итак как уже говорил - ПИД дубовый и надежный до безобразия. что сказали то и делает. и не шагу в сторону. тока вот подобрать коэффициенты - это просто пиз...ц. Если помните уровнение то в нем ТРИ переменных. И соблюсти баланс в нем не всем дано.
Пропорциональная часть - скорость нагрева и время переходного процеса в раойне уставки.
Интегральная часть - точность поддержания температуры.
Деферинциальная часть - скорость реакции на изменение условий.
Говорю прямо хоть потом и писал софт но расчет коэффициентов мне не дался.
Недостаток пида в том что его можно настроить на одно конкретное условие, ну и приблеженное к нему. Стоить чтото изменить и ПИД уже работает по другому. Или выброс в начале большой, или колебания температуры другие и т.п.
Используется 3 переменных П-И-Д и период регулирования. Период регулирования равен времени реакции системы. меньше просто бессмысленно. гоняется в холостую. А дальше от искуства программиста. а как упровлять это уже дело десятое. толи ШИМ, толи число-импульсное управление или частотное - похеру. Есть период регулирования и на его основе уже от значения ПИД считается воздействие. Мне например больше нравилось число-импульсное - в сеть не срет, включается выключается в нуле. да и считать по проще 100 импульсов 1 сек. и 100% воздействие.
а натему флоат и интов. так я вобще нечего не считал брал с ацп напрямую значение и его использовал. но к этому привыкнуть надо. Это просто индивидуальная часть. ктото не может без конкретных цифр. комуто только целые подавай, а ктото без запятой или конкретных градусей не может.
Некоректно будет сказано но ПИД выдает процент воздействия от периода регулирования. тоесть если пер.рег(ПР) 3 сек а пид выдал 10 то это 10% от 3 сек. или если ПР 100 импульсов то это будет 10 импульсов. Все и нечего больше.
PS а вобще на него есть ГОСТ. в котором более мение расписано.
Последний раз редактировалось stalkernet; 20.11.2017 в 12:31.
|
|
|
Сказали "Спасибо" stalkernet
|
|
|
20.11.2017, 12:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от stalkernet
|
А причем андурина то???
|
Это средство, доступное топикстартеру.
Сообщение от stalkernet
|
ПИД дубовый
|
Вот именно. Особенно если речь о регулировке температуры. Тем удивительнее, что ТС никак не может сопоставить процитированный фрагмент с тем, что он для себя скачал из интернета.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:47.
|
|