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

|
Думаю реализовать ПИД-регулятор на АВР Тини-13. Хочу уточнить, правильно ли я выбираю структуру реализации.
Сначала инициализирую все что надо, читаю по трем АЦП значения, задающие 3 коэффициента ПИД. Запускаю таймер с требуемой частотой опроса датчика, устанавливаю по нему прерывание. В прерывании читаю показания АЦП датчика и выставляю флаг, что пришло новое значение. В мэйне в бесконечном цикле жду пока не установится этот флаг, а как он установился - рассчитываю управляющее воздействие и кладу его в ШИМ, сбрасываю флаг. Все красиво, но непонятно одно - у меня один единственный таймер - он определяет частоту опроса и он же определяет частоту ШИМ. Частота прерываний больше или равна частоте ШИМ, поскольку ШИМ крутит счетчик от 0 до 255, а прерывание - от заданного мной значения до 255. И вообще, если я буду опрашивать датчик чаще, чем выводить управляющее воздействие, будет имхо как-то не комильфо. Вижу 2 варианта 1) запускать таймер на полный счетчик, чтобы частота опроса равнялась частоте выдачи ШИМ. Но не знаю, будет ли успевать обновляться значение ШИМ, оно там вроде как буферизуется, может не успеет обновиться как уже новое пора - и так каждый раз. 2) запустить таймер на частоте раза в 4 выше требуемой частоты опроса датчика, шим будет генерироваться с этой частотой - 4 раза подряд одно и то же значение, но больше гарантия что оно обновится. А в прерывании поставить еще один счетчик, и опрашивать датчик/выставлять флаг/рассчитывать выходное значение только каждое четвертое прерывание таймера
Что скажете, господа?
|
|
|
|
|
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 пусть, я не против. Только частота опроса должна быть постоянной, для корректного дифференцировани/интегрирования. И я ее могу выбрать максимально возможной, при которой будет успевать рассчитываться управление. Но частота оновления ШИМ должна быть как минимум не меньше, о чем я и озадачиваюсь. Так забудьте о таймере... Сделайте сигма-дельта модулятор. Вычисляется воздействие - кладется (суммируется) в конденсатор, смотрим туда и либо ножку вверх и вычитаем константу, либо вниз и не вычитаем. Это если управляем только в одну сторону - нагреватель, к примеру. Если управление в разные стороны может действовать, то немного думаем...
|
|
|
|
|
Mar 24 2016, 13:00
|

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

|
Цитата(XVR @ Mar 24 2016, 14:13)  В оригинальном AN964 PWM работает на 31.2 KHz, а цикл PID - на 256 Hz Цитата(_Ivana @ Mar 24 2016, 14:36)  А как это сделать на одном таймере Вынудили меня все таки посмотреть даташиты  PIC16F684 покруче будет, у него три таймера и один из них 16-и разрядный. И памяти поболе раза в два. Так что советую не заниматься мазохизмом, а взять МК чуть получше. Делать на одном таймере 31 kHz - это 32 мкс период прерывания - и в нем счетчик/делитель на 120 - конечно можно, но все будет впритирку, могут быть пропуски обработки. Все это не слишком критично, но выглядит не очень красиво.
|
|
|
|
|
Mar 24 2016, 13:05
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Tanya про модулятор не понял, но идею забыть о таймере уловил. Если действительно вычислять не по прерыванию таймера, а сразу как закончилось предыдущее вычисление - то есть без прерываний гонять цикл постоянно, может с добивкой фиктивными операциями для замедления, то пропорциональная составляющая должна отлично это перенести, вот с остальными похуже. Но если у меня один цикл вычисления (в зависимости от разных условных переходов) будет выполняться примерно одинаковое количество тактов, то можно и так попробовать. Но скорее всего это будет плавать, и Д/И составляющие будут сильно скакать, особенно Д. Все-таки я склоняюсь к своему же варианту 2 - таймер на частоту побольше для ШИМ, а запрашивать датчик и вычислять значение каждое n-е прерывание по этому же таймеру. Причем, n может быть и 255. Baser вот, вижу поняли мой стартовый посыл первого поста  Не очень красиво, говорите? А что там - 100 раз ввалиться в прерывание таймера просто декрементировать счетчик, проверить на 0 и выйти если не 0 - неужели так будет мешать? Ну там несколько тактов на переход по icall/reti... Имхо, на данном камне - самый компромиссный вариант? Лучше, чем ШИМ с частотой опроса и опрос в цикле без таймера имхо. ЗЫ к тому же не обязательно разгонять ШИМ до 31 КГц, может и 1 КГц при 256 Гц частоте опроса хватит. А это всего 3 лишних раза ввалиться в прерывание декрементировать счетчик - и снова вернуться к прерванному на середине расчету выходного значения  Если будет пищать на этих 1 КГц - будет не баг а фича
|
|
|
|
|
Mar 24 2016, 19:45
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Tanya ну в интегральном смысле у меня резких бросков не должно быть - параметры непрерывны, результирующее управление тоже, переход с плюса на минус плавный... В смысле мгновенных значений - да, ШИМ, но может индуктивность обмоток сгладит. Хотя если механическая инерция системы будет велика, то токи в обмотках могут скакать сильно. да.
amaora Формальского читал, линеаризованную модель составлял, оптимальное управление рассчитывал (через моменты инерции и т.п.), но в данном конкретном случае - Вы правы, простейший ПИД с настройкой коэффициентов безо всякой сложной теории. Если удастся победить управление двигателем постоянного тока через ШИМ, то остальное думаю осилю.
|
|
|
|
|
Mar 25 2016, 11:02
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата ...возьмите XXX ... ...не мучаясь... Отстаньте вы от человека! Он же сразу сказал - это спорт такой. Что-то вроде "я напишу hello world в N байт", только следующий уровень :-) Если _Ivana хватит упорства и знаний затолкать всё это в тиньку, он будет на порядок больше молодец, чем реализация того же ПИДа на stm32discovery.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Mar 25 2016, 11:26
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
MrYuran поясните подробнее. Мне нужно вызывать некую процедуру каждые 256 Гц, при этом таймер у меня будет работать, допустим, на 256*256*n Гц, где n выберу от 2 до .... Останавливать/перезапускать таймер я опасаюсь - нужен гарантированный перманентный ШИМ.
ЗЫ по поводу структуры и логики работы мне сейчас вроде все понятно (хотя могут внезапно появиться вопросы, которые сейчас не подозреваю), остались детали - аналоговая схема управления двигателем от двух 256-битных шимов, сколько брать бит от АЦП, где и как ограничивать аддитивные составляющие ПИД. В конце концов какой взять двигатель и как реализовать механику, может приклеить по кругу резиновую зубчатую полоску и ездить по ней шестеренкой на двигателе, для отсутствия проскальзывания. Копировать код и реализацию один в один с прототипа не хочу.
|
|
|
|
|
Mar 25 2016, 11:39
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
EmbedElektrik спасибо, хорошая мысль, думал ее. У меня в рабочем режиме один датчик (коэффициенты получаю по другим ножкам через АЦП при инициализации после включения), переключать входы АЦП не надо, значит можно запустить режим автоопроса одного канала. Если можно установить нужную его частоту, то должно сработать.
MrYuran спасибо, понятно. Получается уже 3 хороших варианта, как обойтись одним таймером и гарантировать строгую периодичность опроса. ЗЫ хотя в этой ситуации непонятно, как мне продолжать декрементировать счетчик этого нужного количества периодов ШИМ, когда я начал рассчитывать результат ПИД. Его же надо продолжать декрементировать. Вариант с прерываниями мне все-таки более понятен.
|
|
|
|
|
Apr 7 2016, 13:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(MrYuran @ Mar 25 2016, 15:37)  В общем цикле (main loop) занимаетесь своими мелкими делами и между делом опрашиваете флаг переполнения таймера ШИМ. По флагу переставляете счетчик (оптимально декрементировать до нуля), по достижению нужного колиества циклов выполняете основную функцию ПИД. Не будет накладных расходов на прерывание. Ой!!! Не надо так делать. В прерывании, а не в главном цикле. Цитата(_Ivana @ Apr 7 2016, 17:02)  Tarbal, давно не заходил на форум, не видел ваш ответ. Спасибо, попробую изучить. Сейчас изучаю ассортимент и выбираю интернет-магазин, где закупить все сразу - двигатели с редукторами (разные штук 5 на пробу), их ШИМ-контроллеры, колеса и прочую механику. С механикой у меня всегда нелегко идет, собственно электроника легче  С механикой у всех нелегко идет, зато на форуме механиков с электроникой нелегко идет, а с механикой легче.
|
|
|
|
|
Apr 7 2016, 14:57
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

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

|
Цитата(Tanya @ Apr 8 2016, 13:11)  Каков у Вас период ШИМа предполагается? При частоте опроса датчика 256Гц (ориентируясь на прототип, может сделаю и в 2-4 раза меньше) частота таймера ШИМ пусть в 4 раза больше - 1кГц. Каждый 4-й тик полного счетчика таймера считаю управление. Если, конечно, мой выбранный драйвер на L298N будет нормально работать на такой частоте ШИМа. Если пищать будет - пока думаю что некритично. Цитата(Tanya @ Apr 8 2016, 13:11)  А вместо потенциометра и АЦП можно сделать кнопки - увеличить и уменьшить. Можно. К тому же я предполагаю снимать коэффициенты в 6 бит (64 варианта от 0 до 100%), с одной стороны можно было бы и побольше, но так я гарантированно уложусь в 2 байта результата при однобайтном значении ошибки каждой составляющей и сумме трех умноженных на коэффициенты ошибок. Но тогда возникает вопрос визуализации значений коэффициентов - переменный резистор отличный прибор задания значения и визуализации его же забесплатно (можно хоть круговую шкалу нарисовать), кнопки и всякие энкодеры в этом отношении проигрывают. Цитата(Tanya @ Apr 8 2016, 13:11)  А время вычислений легко сделать постоянным. Наверное. Если закопаться в математику и написать чисто линейный алгоритм нормализаций и масштабирований значений в диапазоны безо всяких условных переходов, который будет на порядок сложнее и неочевиднее.
|
|
|
|
|
Apr 8 2016, 13:04
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Ну вот я и планирую новые значения считывать с потенциометров при нажатии кнопочки - только кнопочка называется Power Off  И Держать рукой, да. Можно взять нормальный контроллер, можно ардуину, можно вообще готовый ПИД или сразу все готовое купить и не мучиться  Пока я пытаюсь определиться с заказом комплектующих - у меня нет опасений, что выбранного контроллера мне не хватит. Может, когда дойдет до практики, они появятся.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|