Перейти к содержанию
    

Структурная реализация ПИД

Думаю реализовать ПИД-регулятор на АВР Тини-13. Хочу уточнить, правильно ли я выбираю структуру реализации.

 

Сначала инициализирую все что надо, читаю по трем АЦП значения, задающие 3 коэффициента ПИД. Запускаю таймер с требуемой частотой опроса датчика, устанавливаю по нему прерывание. В прерывании читаю показания АЦП датчика и выставляю флаг, что пришло новое значение. В мэйне в бесконечном цикле жду пока не установится этот флаг, а как он установился - рассчитываю управляющее воздействие и кладу его в ШИМ, сбрасываю флаг. Все красиво, но непонятно одно - у меня один единственный таймер - он определяет частоту опроса и он же определяет частоту ШИМ. Частота прерываний больше или равна частоте ШИМ, поскольку ШИМ крутит счетчик от 0 до 255, а прерывание - от заданного мной значения до 255. И вообще, если я буду опрашивать датчик чаще, чем выводить управляющее воздействие, будет имхо как-то не комильфо.

Вижу 2 варианта

1) запускать таймер на полный счетчик, чтобы частота опроса равнялась частоте выдачи ШИМ. Но не знаю, будет ли успевать обновляться значение ШИМ, оно там вроде как буферизуется, может не успеет обновиться как уже новое пора - и так каждый раз.

2) запустить таймер на частоте раза в 4 выше требуемой частоты опроса датчика, шим будет генерироваться с этой частотой - 4 раза подряд одно и то же значение, но больше гарантия что оно обновится. А в прерывании поставить еще один счетчик, и опрашивать датчик/выставлять флаг/рассчитывать выходное значение только каждое четвертое прерывание таймера

 

Что скажете, господа?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что скажете, господа?

Лично я ничего не понял :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо, тогда поставим вопрос иначе - как вы видите оптимальную структуру реализации моей задачи на данном МК - какую периферию / прерывания и как использовать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что это за пид, который надо с частотой шима крутить? Разве что управление рулями ракеты :)

Как по мне, тайминги на порядки отличаются.

 

А вообще, исходить надо из задачи. А о ней ни слова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота расчета управляющего воздействия определяется инерционностью вашего объекта управления.

Если это медленный тепловой объект, то пересчитывать можно вообще раз в несколько секунд.

 

Когда то брал за основу аппликейшен Атмела:

AVR221: Discrete PID controller

 

там к нему идут коды на Си в комплекте.

Почитайте, разберитесь, модифицируйте под свою задачу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задача - повторить (возможно с вариациями) что-то подобное http://ww1.microchip.com/downloads/en/AppNotes/00964A.pdf на АВР тини 13.

Частота опроса датчика / расчета / выдачи управляющего сигнала (частота петли управления) - 256 Гц +- лапоть (или два лаптя).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задача - повторить (возможно с вариациями) что-то подобное http://ww1.microchip.com/downloads/en/AppNotes/00964A.pdf на АВР тини 13.

Частота опроса датчика / расчета / выдачи управляющего сигнала (частота петли управления) - 256 Гц +- лапоть (или два лаптя).

"Перевернутый маятник" - да, это быстрый объект управления.

Но зато есть все: описание, код на асме и код на си на выбор.

 

У вас есть два варианта решения:

 

1. Разобраться с теорией, с реализацией, взять основные идеи и реализовать похоже на Тиньке13.

 

2. Тупо портировать код с PIC16F684 на Tiny13

Типичный инженерный подход :)

Нужно детально разобраться и с PIC16F684 и с Tiny13, т.к. ресурсов очень мало и не факт, что они однозначно взаимозаменяемы.

 

А вообще препод хорошо придумал, интересно - одобряю :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что скажете, господа?

Если контроллер занят только этим, то пусть работает на максимальной скорости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Tarbal, эти значения будут считываться через отдельные ножки по АЦП с резистивных делителей при инициализации и затем использоваться при управлении. Надо поменять - отключаем питание (т.к. ресет занят под вход), крутим ручки, включаем питание - коэффициенты поменялись. Собственно в коде по моей ссылке так и сделано.

 

Baser препод в данном случае я, хочу со старшим сыном сделать интересную вещь. Я хочу пойти по первому из ваших вариантов. А для этого мне в том числе надо понять простую вещь: как подружить опрос по прерыванию таймера с ШИМ на одном таймере. Еще раз - пусть таймер работает с частотой 256^2 Гц. Частота обновления ШИМ тогда равна 256 Гц - правильно? Прерывания же по переполнению генерятся в зависимости от стартового значения счетчика, но НЕ медленнее 256 Гц, возможно быстрее. Таким образом у меня частота опроса превышает частоту обновления выходного сигнала канала управления. Я не разобрался, как это решено в проекте по моей ссылке, но предположил 2 варианта решения в стартовом посте.

 

Tanya пусть, я не против. Только частота опроса должна быть постоянной, для корректного дифференцировани/интегрирования. И я ее могу выбрать максимально возможной, при которой будет успевать рассчитываться управление. Но частота оновления ШИМ должна быть как минимум не меньше, о чем я и озадачиваюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В оригинальном AN964 PWM работает на 31.2 KHz, а цикл PID - на 256 Hz. Делайте выводы :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

XVR, вот спасибо, Айболит :) Осталось мне разобраться, как удалось достичь этого. Может там 2 таймера, один из которых работает на PWM а другой с другим прескалером - на задание частоты опроса? В статье это явно не упомянуто вроде, а в код я сильно не вчитывался еще и не понял. Но в любом случае у меня в тиньке 13 один таймер, и придется извернуться/уложиться в него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

препод в данном случае я, хочу со старшим сыном сделать интересную вещь.

Ну не угадал :laughing:

 

Я хочу пойти по первому из ваших вариантов. А для этого мне в том числе надо понять простую вещь: как подружить опрос по прерыванию таймера с ШИМ на одном таймере. Еще раз - пусть таймер работает с частотой 256^2 Гц. Частота обновления ШИМ тогда равна 256 Гц - правильно? Прерывания же по переполнению генерятся в зависимости от стартового значения счетчика, но НЕ медленнее 256 Гц, возможно быстрее. Таким образом у меня частота опроса превышает частоту обновления выходного сигнала канала управления.

 

Только частота опроса должна быть постоянной, для корректного дифференцировани/интегрирования. И я ее могу выбрать максимально возможной, при которой будет успевать рассчитываться управление. Но частота оновления ШИМ должна быть как минимум не меньше, о чем я и озадачиваюсь.

Вам нужно разобраться с синхронизацией процессов в вашей программе.

Могу дать только общие рекомендации, ибо на память не помню реализации таймеров и АЦП ни в PIC16F684 ни в Tiny13

 

1. Частота вашего прерывания по переполнению таймера = тактовая таймера / 256 (это если таймер 8-и битный и прескалер =1)

Это же время = один полный период ШИМа. Чаще его значение изменять нет смысла.

 

2. Если АЦП не имеет автозапуска и его нужно каждый раз запускать вручную, нужно настроить его на работу с такой частотой, чтобы одно измерение производилось за время меньше, чем период прерывания.

 

3. Таким образом, в прерывании:

- читаем предыдущее измеренное значение АЦП

- запускаем новое измерение АЦП

- взводим флаг обработки

 

4. В главном цикле ждем флаг, по флагу:

- вычисляем ПИД, выходное воздействие

- изменяем ШИМ (если таймер с буферированием)

- сбрасываем флаг

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Baser вот этот вариант я и имел в виду под номером 1 в стартовом посте. Мне конечно ВРОДЕ КАК нет смысла менять ШИМ чаще, чем период ПИД. Но если его запускать с той же частотой, то изменение будет отставать на целый один период опроса (не знаю насколько это критично), и я не смогу плавно менять период опроса - таймер будет гонять прерывание от 0 до 255 как ШИМ. Но может мне эта плавность и не потребуется. Но самое главное - мне бы гарантию, что при такой конфигурации у меня вообще будет меняться ШИМ - может там какая двойная буферизация, и изменение значения выхода ШИМ происходит только через 2 такта после обновления его в регистре - тогда у меня просто не будет успевать обновляться ШИМ из-за низкой частоты его настройки. Поэтому я и хотел с запасом частоту ШИМ увеличить по сравнению с частотой опроса датчика. И информация от XVR тоже не противоречит этому. А как это сделать на одном таймере - об это я попытался простыми словами написать в варианте 2 первого поста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Tanya пусть, я не против. Только частота опроса должна быть постоянной, для корректного дифференцировани/интегрирования. И я ее могу выбрать максимально возможной, при которой будет успевать рассчитываться управление. Но частота оновления ШИМ должна быть как минимум не меньше, о чем я и озадачиваюсь.

Так забудьте о таймере... Сделайте сигма-дельта модулятор. Вычисляется воздействие - кладется (суммируется) в конденсатор, смотрим туда и либо ножку вверх и вычитаем константу, либо вниз и не вычитаем. Это если управляем только в одну сторону - нагреватель, к примеру. Если управление в разные стороны может действовать, то немного думаем...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...