|
Структурная реализация ПИД, как организовать? |
|
|
|
Mar 24 2016, 09:02
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Думаю реализовать ПИД-регулятор на АВР Тини-13. Хочу уточнить, правильно ли я выбираю структуру реализации.
Сначала инициализирую все что надо, читаю по трем АЦП значения, задающие 3 коэффициента ПИД. Запускаю таймер с требуемой частотой опроса датчика, устанавливаю по нему прерывание. В прерывании читаю показания АЦП датчика и выставляю флаг, что пришло новое значение. В мэйне в бесконечном цикле жду пока не установится этот флаг, а как он установился - рассчитываю управляющее воздействие и кладу его в ШИМ, сбрасываю флаг. Все красиво, но непонятно одно - у меня один единственный таймер - он определяет частоту опроса и он же определяет частоту ШИМ. Частота прерываний больше или равна частоте ШИМ, поскольку ШИМ крутит счетчик от 0 до 255, а прерывание - от заданного мной значения до 255. И вообще, если я буду опрашивать датчик чаще, чем выводить управляющее воздействие, будет имхо как-то не комильфо. Вижу 2 варианта 1) запускать таймер на полный счетчик, чтобы частота опроса равнялась частоте выдачи ШИМ. Но не знаю, будет ли успевать обновляться значение ШИМ, оно там вроде как буферизуется, может не успеет обновиться как уже новое пора - и так каждый раз. 2) запустить таймер на частоте раза в 4 выше требуемой частоты опроса датчика, шим будет генерироваться с этой частотой - 4 раза подряд одно и то же значение, но больше гарантия что оно обновится. А в прерывании поставить еще один счетчик, и опрашивать датчик/выставлять флаг/рассчитывать выходное значение только каждое четвертое прерывание таймера
Что скажете, господа?
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Mar 24 2016, 11:06
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Задача - повторить (возможно с вариациями) что-то подобное http://ww1.microchip.com/downloads/en/AppNotes/00964A.pdf на АВР тини 13. Частота опроса датчика / расчета / выдачи управляющего сигнала (частота петли управления) - 256 Гц +- лапоть (или два лаптя).
|
|
|
|
|
Mar 24 2016, 11:26
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(_Ivana @ Mar 24 2016, 13:06)  Задача - повторить (возможно с вариациями) что-то подобное http://ww1.microchip.com/downloads/en/AppNotes/00964A.pdf на АВР тини 13. Частота опроса датчика / расчета / выдачи управляющего сигнала (частота петли управления) - 256 Гц +- лапоть (или два лаптя). "Перевернутый маятник" - да, это быстрый объект управления. Но зато есть все: описание, код на асме и код на си на выбор. У вас есть два варианта решения: 1. Разобраться с теорией, с реализацией, взять основные идеи и реализовать похоже на Тиньке13. 2. Тупо портировать код с PIC16F684 на Tiny13 Типичный инженерный подход  Нужно детально разобраться и с PIC16F684 и с Tiny13, т.к. ресурсов очень мало и не факт, что они однозначно взаимозаменяемы. А вообще препод хорошо придумал, интересно - одобряю
|
|
|
|
|
Mar 24 2016, 11:55
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Tarbal, эти значения будут считываться через отдельные ножки по АЦП с резистивных делителей при инициализации и затем использоваться при управлении. Надо поменять - отключаем питание (т.к. ресет занят под вход), крутим ручки, включаем питание - коэффициенты поменялись. Собственно в коде по моей ссылке так и сделано.
Baser препод в данном случае я, хочу со старшим сыном сделать интересную вещь. Я хочу пойти по первому из ваших вариантов. А для этого мне в том числе надо понять простую вещь: как подружить опрос по прерыванию таймера с ШИМ на одном таймере. Еще раз - пусть таймер работает с частотой 256^2 Гц. Частота обновления ШИМ тогда равна 256 Гц - правильно? Прерывания же по переполнению генерятся в зависимости от стартового значения счетчика, но НЕ медленнее 256 Гц, возможно быстрее. Таким образом у меня частота опроса превышает частоту обновления выходного сигнала канала управления. Я не разобрался, как это решено в проекте по моей ссылке, но предположил 2 варианта решения в стартовом посте.
Tanya пусть, я не против. Только частота опроса должна быть постоянной, для корректного дифференцировани/интегрирования. И я ее могу выбрать максимально возможной, при которой будет успевать рассчитываться управление. Но частота оновления ШИМ должна быть как минимум не меньше, о чем я и озадачиваюсь.
|
|
|
|
|
Mar 24 2016, 12:26
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(_Ivana @ Mar 24 2016, 13:55)  препод в данном случае я, хочу со старшим сыном сделать интересную вещь. Ну не угадал Цитата Я хочу пойти по первому из ваших вариантов. А для этого мне в том числе надо понять простую вещь: как подружить опрос по прерыванию таймера с ШИМ на одном таймере. Еще раз - пусть таймер работает с частотой 256^2 Гц. Частота обновления ШИМ тогда равна 256 Гц - правильно? Прерывания же по переполнению генерятся в зависимости от стартового значения счетчика, но НЕ медленнее 256 Гц, возможно быстрее. Таким образом у меня частота опроса превышает частоту обновления выходного сигнала канала управления.
Только частота опроса должна быть постоянной, для корректного дифференцировани/интегрирования. И я ее могу выбрать максимально возможной, при которой будет успевать рассчитываться управление. Но частота оновления ШИМ должна быть как минимум не меньше, о чем я и озадачиваюсь. Вам нужно разобраться с синхронизацией процессов в вашей программе. Могу дать только общие рекомендации, ибо на память не помню реализации таймеров и АЦП ни в PIC16F684 ни в Tiny13 1. Частота вашего прерывания по переполнению таймера = тактовая таймера / 256 (это если таймер 8-и битный и прескалер =1) Это же время = один полный период ШИМа. Чаще его значение изменять нет смысла. 2. Если АЦП не имеет автозапуска и его нужно каждый раз запускать вручную, нужно настроить его на работу с такой частотой, чтобы одно измерение производилось за время меньше, чем период прерывания. 3. Таким образом, в прерывании: - читаем предыдущее измеренное значение АЦП - запускаем новое измерение АЦП - взводим флаг обработки 4. В главном цикле ждем флаг, по флагу: - вычисляем ПИД, выходное воздействие - изменяем ШИМ (если таймер с буферированием) - сбрасываем флаг
|
|
|
|
|
Mar 24 2016, 12:51
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(_Ivana @ Mar 24 2016, 14:55)  Tanya пусть, я не против. Только частота опроса должна быть постоянной, для корректного дифференцировани/интегрирования. И я ее могу выбрать максимально возможной, при которой будет успевать рассчитываться управление. Но частота оновления ШИМ должна быть как минимум не меньше, о чем я и озадачиваюсь. Так забудьте о таймере... Сделайте сигма-дельта модулятор. Вычисляется воздействие - кладется (суммируется) в конденсатор, смотрим туда и либо ножку вверх и вычитаем константу, либо вниз и не вычитаем. Это если управляем только в одну сторону - нагреватель, к примеру. Если управление в разные стороны может действовать, то немного думаем...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|