реклама на сайте
подробности

 
 
> Структурная реализация ПИД, как организовать?
_Ivana
сообщение Mar 24 2016, 09:02
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



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

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

Что скажете, господа?
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 43)
MrYuran
сообщение Mar 24 2016, 09:26
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(_Ivana @ Mar 24 2016, 12:02) *
Что скажете, господа?

Лично я ничего не понял sad.gif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 09:28
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Хорошо, тогда поставим вопрос иначе - как вы видите оптимальную структуру реализации моей задачи на данном МК - какую периферию / прерывания и как использовать?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 24 2016, 10:01
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Что это за пид, который надо с частотой шима крутить? Разве что управление рулями ракеты sm.gif
Как по мне, тайминги на порядки отличаются.

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 24 2016, 11:02
Сообщение #5


Просто Che
*****

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



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

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

там к нему идут коды на Си в комплекте.
Почитайте, разберитесь, модифицируйте под свою задачу.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 11:06
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Задача - повторить (возможно с вариациями) что-то подобное http://ww1.microchip.com/downloads/en/AppNotes/00964A.pdf на АВР тини 13.
Частота опроса датчика / расчета / выдачи управляющего сигнала (частота петли управления) - 256 Гц +- лапоть (или два лаптя).
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 24 2016, 11:15
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Я бы начал с определения значений коэффициентов П, И и Д.
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 24 2016, 11:26
Сообщение #8


Просто 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
Типичный инженерный подход sm.gif
Нужно детально разобраться и с PIC16F684 и с Tiny13, т.к. ресурсов очень мало и не факт, что они однозначно взаимозаменяемы.

А вообще препод хорошо придумал, интересно - одобряю sm.gif
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 24 2016, 11:33
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(_Ivana @ Mar 24 2016, 12:02) *
Что скажете, господа?

Если контроллер занят только этим, то пусть работает на максимальной скорости.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 11:55
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



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

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

Tanya пусть, я не против. Только частота опроса должна быть постоянной, для корректного дифференцировани/интегрирования. И я ее могу выбрать максимально возможной, при которой будет успевать рассчитываться управление. Но частота оновления ШИМ должна быть как минимум не меньше, о чем я и озадачиваюсь.
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 24 2016, 12:13
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



В оригинальном AN964 PWM работает на 31.2 KHz, а цикл PID - на 256 Hz. Делайте выводы sm.gif
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 12:17
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



XVR, вот спасибо, Айболит sm.gif Осталось мне разобраться, как удалось достичь этого. Может там 2 таймера, один из которых работает на PWM а другой с другим прескалером - на задание частоты опроса? В статье это явно не упомянуто вроде, а в код я сильно не вчитывался еще и не понял. Но в любом случае у меня в тиньке 13 один таймер, и придется извернуться/уложиться в него.
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 24 2016, 12:26
Сообщение #13


Просто Che
*****

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



Цитата(_Ivana @ Mar 24 2016, 13:55) *
препод в данном случае я, хочу со старшим сыном сделать интересную вещь.

Ну не угадал laughing.gif

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

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

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

1. Частота вашего прерывания по переполнению таймера = тактовая таймера / 256 (это если таймер 8-и битный и прескалер =1)
Это же время = один полный период ШИМа. Чаще его значение изменять нет смысла.

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

3. Таким образом, в прерывании:
- читаем предыдущее измеренное значение АЦП
- запускаем новое измерение АЦП
- взводим флаг обработки

4. В главном цикле ждем флаг, по флагу:
- вычисляем ПИД, выходное воздействие
- изменяем ШИМ (если таймер с буферированием)
- сбрасываем флаг
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 12:36
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Baser вот этот вариант я и имел в виду под номером 1 в стартовом посте. Мне конечно ВРОДЕ КАК нет смысла менять ШИМ чаще, чем период ПИД. Но если его запускать с той же частотой, то изменение будет отставать на целый один период опроса (не знаю насколько это критично), и я не смогу плавно менять период опроса - таймер будет гонять прерывание от 0 до 255 как ШИМ. Но может мне эта плавность и не потребуется. Но самое главное - мне бы гарантию, что при такой конфигурации у меня вообще будет меняться ШИМ - может там какая двойная буферизация, и изменение значения выхода ШИМ происходит только через 2 такта после обновления его в регистре - тогда у меня просто не будет успевать обновляться ШИМ из-за низкой частоты его настройки. Поэтому я и хотел с запасом частоту ШИМ увеличить по сравнению с частотой опроса датчика. И информация от XVR тоже не противоречит этому. А как это сделать на одном таймере - об это я попытался простыми словами написать в варианте 2 первого поста.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 24 2016, 12:51
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



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

Так забудьте о таймере... Сделайте сигма-дельта модулятор. Вычисляется воздействие - кладется (суммируется) в конденсатор, смотрим туда и либо ножку вверх и вычитаем константу, либо вниз и не вычитаем. Это если управляем только в одну сторону - нагреватель, к примеру. Если управление в разные стороны может действовать, то немного думаем...
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 24 2016, 13:00
Сообщение #16


Просто 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) *
А как это сделать на одном таймере

Вынудили меня все таки посмотреть даташиты sm.gif
PIC16F684 покруче будет, у него три таймера и один из них 16-и разрядный.
И памяти поболе раза в два.
Так что советую не заниматься мазохизмом, а взять МК чуть получше.

Делать на одном таймере 31 kHz - это 32 мкс период прерывания - и в нем счетчик/делитель на 120 - конечно можно,
но все будет впритирку, могут быть пропуски обработки.
Все это не слишком критично, но выглядит не очень красиво.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 13:05
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Tanya про модулятор не понял, но идею забыть о таймере уловил. Если действительно вычислять не по прерыванию таймера, а сразу как закончилось предыдущее вычисление - то есть без прерываний гонять цикл постоянно, может с добивкой фиктивными операциями для замедления, то пропорциональная составляющая должна отлично это перенести, вот с остальными похуже. Но если у меня один цикл вычисления (в зависимости от разных условных переходов) будет выполняться примерно одинаковое количество тактов, то можно и так попробовать. Но скорее всего это будет плавать, и Д/И составляющие будут сильно скакать, особенно Д. Все-таки я склоняюсь к своему же варианту 2 - таймер на частоту побольше для ШИМ, а запрашивать датчик и вычислять значение каждое n-е прерывание по этому же таймеру. Причем, n может быть и 255.

Baser вот, вижу поняли мой стартовый посыл первого поста sm.gif Не очень красиво, говорите? А что там - 100 раз ввалиться в прерывание таймера просто декрементировать счетчик, проверить на 0 и выйти если не 0 - неужели так будет мешать? Ну там несколько тактов на переход по icall/reti... Имхо, на данном камне - самый компромиссный вариант? Лучше, чем ШИМ с частотой опроса и опрос в цикле без таймера имхо.

ЗЫ к тому же не обязательно разгонять ШИМ до 31 КГц, может и 1 КГц при 256 Гц частоте опроса хватит. А это всего 3 лишних раза ввалиться в прерывание декрементировать счетчик - и снова вернуться к прерванному на середине расчету выходного значения sm.gif Если будет пищать на этих 1 КГц - будет не баг а фича sm.gif
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 24 2016, 13:24
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(_Ivana @ Mar 24 2016, 16:05) *
Tanya про модулятор не понял, но идею забыть о таймере уловил.

Можно немного почитать... про АЦП. Немного поясню. Управление ( для простоты рассмотрим простой случай) добавляет или вычитает каждый цикл какое-то число, и если сумма больше нуля, включается (пусть будет так) печка и вычитается некоторая константа оттуда же. Когда управление опять накопится, опять включается - один импульс. Получится более плавное управление по сравнению с ШИМом.
Вы бы сначала погоняли свое управление (фиктивно) для определения времени вычислений...
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 13:34
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Погоняю конечно. Но у меня могут быть достаточно радикальные изменения в коде, которые еще не однозначно решены. Писать я буду на ассемблере (кто там про мазохизм писал? wink.gif), и к примеру аппаратного умножения на моем камне нет (снова про мазохизм), надо будет умножать вручную. Так я пока даже не знаю, буду ли я 10 бит на 10 бит из АЦП умножать в 3 байта результата или возьму только по одному старшему байту из АЦП, а 2 младших бита отброшу... А от этого время вычислений будет меняться сильно. Я пока с общей структурой уже можно сказать определился с помощью участников этой темы. А например как управлять двигателем вправо-влево по двум выходам ШИМ (на моем камне 2 выхода ШИМ) я пока даже не представляю. В прототипе на PIC16F684 для управления двигателем использовано 4 вывода МК - у меня столько нет лишних. Но я подозреваю, что и двумя можно обойтись - один по часовой (второй при этом 0), второй - против (первый при этом 0).
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 24 2016, 13:45
Сообщение #20


Просто Che
*****

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



Цитата(_Ivana @ Mar 24 2016, 15:34) *
(кто там про мазохизм писал? wink.gif)

Я в такие игры лет 15 назад наигрался от отсутствия дешевых ресурсов на МК, больше не хочу sm.gif
Возмите что ль маленький STM32, ну или на крайний случай PIC24 - приятная архитектура wink.gif
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 13:57
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Baser согласен, если упрусь в препятствия непреодолимой силы - скрепя сердце возьму камень чуть мощнее sm.gif Но пока все-таки попробую на этом. Все мои сложности - от некоторого пока недопонимания отдельных моментов, контроллер меня почти не ограничивает - 4 входа АЦП, 2 выхода ШИМ - ровно столько сколько мне всего надо. Ну один таймер (вроде придумал как обойти), ну нет умножения (но тактов при 256 Гц опроса должно хватить на все вычисления). Так то можно и Ардуину взять и на Си написать, транжиря ресурсы. Но сейчас мне интересна именно такая игра.

ЗЫ есичо, я на той же Тини-13 некоторое время назад написал на асме тестировщик реле - замер времен прилета/улета/дребезга при подаче переключающего напряжения, с точностью до 10мкс и выводом таблицы результатов серии измерений в форматированном десятичном виде по вручную (!) реализованному USART (через ногодрыгание с нужными таймингами) на комп через терминал. Использовал почти весь флеш под кот. Так что кое-какой опыт мазохизма есть, но нельзя останавливаться на достигнутом sm.gif
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 24 2016, 14:50
Сообщение #22


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(_Ivana @ Mar 24 2016, 16:34) *
В прототипе на PIC16F684 для управления двигателем использовано 4 вывода МК - у меня столько нет лишних. Но я подозреваю, что и двумя можно обойтись - один по часовой (второй при этом 0), второй - против (первый при этом 0).


Вы с двигателем... осторожнее. ШИМ по напряжению - очень грубо и неправильно. Нужно током управлять - момент пропорционален току ведь... А еще там противоэдс - если полярность поменять все может сгореть, а мотор - разрушиться.
Go to the top of the page
 
+Quote Post
amaora
сообщение Mar 24 2016, 16:33
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778



Точная модель Вам не нужна, моделировать не будете, идентифицировать параметры системы не будете, синтезировать регулятор не будете, так? Тогда делайте как получается, существенного значения эти детали, о которых спрашиваете, для Вас иметь не будут. Главное, частота достаточно высока а схема замер-выдача стабильна и с минимальной задержкой.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 24 2016, 19:45
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Tanya ну в интегральном смысле у меня резких бросков не должно быть - параметры непрерывны, результирующее управление тоже, переход с плюса на минус плавный... В смысле мгновенных значений - да, ШИМ, но может индуктивность обмоток сгладит. Хотя если механическая инерция системы будет велика, то токи в обмотках могут скакать сильно. да.

amaora Формальского читал, линеаризованную модель составлял, оптимальное управление рассчитывал (через моменты инерции и т.п.), но в данном конкретном случае - Вы правы, простейший ПИД с настройкой коэффициентов безо всякой сложной теории. Если удастся победить управление двигателем постоянного тока через ШИМ, то остальное думаю осилю.
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Mar 24 2016, 20:09
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Возьмите ATtiny24 там два таймера, в два раза больше памяти, больше портов и он не на много дороже, к тому же если памяти не хватит то на ATtiny44, ATtiny84 можно портировать без труда.
Вдруг захочется дополнительные кнопки, светодиоды - а портов свободных нет.
Ну и на СИ можно свободно писать не мучаясь с асмом.
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 25 2016, 03:56
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Цитата(Ga_ry @ Mar 25 2016, 02:09) *
Возьмите ATtiny24 там два таймера
Тогда уж ATtiny25...85.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 25 2016, 07:14
Сообщение #27


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Baser @ Mar 24 2016, 16:45) *
Я в такие игры лет 15 назад наигрался от отсутствия дешевых ресурсов на МК, больше не хочу sm.gif
Возмите что ль маленький STM32, ну или на крайний случай PIC24 - приятная архитектура wink.gif

STM8S003 - 17р в розницу, а уж кишков на порядок больше

и космик бесплатный с этого года



--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Mar 25 2016, 10:27
Сообщение #28


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Если хочется именно AVR, то я бы как следующую ступень после тини13 рассматривал бы tiny2313
остальные варианты не распространены достаточно широко, купить их можно не везде... цены чуть выше всегда(даже на ali)
Грубо говоря, после tiny2313 стоит сразу рассматривать mega8
Это такие камни которые можно найти на каждом углу, дешево и сердито)


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Mar 25 2016, 11:02
Сообщение #29


Профессионал
*****

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



Цитата
...возьмите XXX ...
...не мучаясь...


Отстаньте вы от человека! Он же сразу сказал - это спорт такой.
Что-то вроде "я напишу hello world в N байт", только следующий уровень :-)

Если _Ivana хватит упорства и знаний затолкать всё это в тиньку, он будет на порядок больше молодец, чем реализация того же ПИДа на stm32discovery.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 25 2016, 11:15
Сообщение #30


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Тогда все просто sm.gif
Забить на прерывания и ловить флаг таймера в общем цикле.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 25 2016, 11:26
Сообщение #31


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



MrYuran поясните подробнее. Мне нужно вызывать некую процедуру каждые 256 Гц, при этом таймер у меня будет работать, допустим, на 256*256*n Гц, где n выберу от 2 до .... Останавливать/перезапускать таймер я опасаюсь - нужен гарантированный перманентный ШИМ.

ЗЫ по поводу структуры и логики работы мне сейчас вроде все понятно (хотя могут внезапно появиться вопросы, которые сейчас не подозреваю), остались детали - аналоговая схема управления двигателем от двух 256-битных шимов, сколько брать бит от АЦП, где и как ограничивать аддитивные составляющие ПИД. В конце концов какой взять двигатель и как реализовать механику, может приклеить по кругу резиновую зубчатую полоску и ездить по ней шестеренкой на двигателе, для отсутствия проскальзывания. Копировать код и реализацию один в один с прототипа не хочу.
Go to the top of the page
 
+Quote Post
EmbedElektrik
сообщение Mar 25 2016, 11:34
Сообщение #32


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 30-07-08
Из: Тверь, Россия
Пользователь №: 39 321



имхо проще врубить автостарт ацп и в его прерываниях считать коэффициенты. фактически появляется второй таймер.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 25 2016, 11:37
Сообщение #33


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



В общем цикле (main loop) занимаетесь своими мелкими делами и между делом опрашиваете флаг переполнения таймера ШИМ.
По флагу переставляете счетчик (оптимально декрементировать до нуля), по достижению нужного колиества циклов выполняете основную функцию ПИД. Не будет накладных расходов на прерывание.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 25 2016, 11:39
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



EmbedElektrik спасибо, хорошая мысль, думал ее. У меня в рабочем режиме один датчик (коэффициенты получаю по другим ножкам через АЦП при инициализации после включения), переключать входы АЦП не надо, значит можно запустить режим автоопроса одного канала. Если можно установить нужную его частоту, то должно сработать.

MrYuran спасибо, понятно. Получается уже 3 хороших варианта, как обойтись одним таймером и гарантировать строгую периодичность опроса.
ЗЫ хотя в этой ситуации непонятно, как мне продолжать декрементировать счетчик этого нужного количества периодов ШИМ, когда я начал рассчитывать результат ПИД. Его же надо продолжать декрементировать. Вариант с прерываниями мне все-таки более понятен.
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 25 2016, 15:29
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MrYuran @ Mar 25 2016, 14:37) *
В общем цикле (main loop) занимаетесь своими мелкими делами и между делом опрашиваете флаг переполнения таймера ШИМ.
По флагу переставляете счетчик (оптимально декрементировать до нуля), по достижению нужного колиества циклов выполняете основную функцию ПИД.

Если частота ШИМа будет большая можно пропустить несколько переполнений - потеряется равномерность цикла ПИД.
Лучше оставить счетчик в прерывании
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 31 2016, 18:36
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(_Ivana @ Mar 24 2016, 16:17) *
XVR, вот спасибо, Айболит sm.gif Осталось мне разобраться, как удалось достичь этого. Может там 2 таймера, один из которых работает на PWM а другой с другим прескалером - на задание частоты опроса? В статье это явно не упомянуто вроде, а в код я сильно не вчитывался еще и не понял. Но в любом случае у меня в тиньке 13 один таймер, и придется извернуться/уложиться в него.


Если у таймера есть несколько output compare устройств, то достаточно одного таймера. Потратьте время изучите как это работает -- окупится.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Apr 7 2016, 13:02
Сообщение #37


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Tarbal, давно не заходил на форум, не видел ваш ответ. Спасибо, попробую изучить. Сейчас изучаю ассортимент и выбираю интернет-магазин, где закупить все сразу - двигатели с редукторами (разные штук 5 на пробу), их ШИМ-контроллеры, колеса и прочую механику. С механикой у меня всегда нелегко идет, собственно электроника легче sm.gif
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Apr 7 2016, 13:52
Сообщение #38


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(MrYuran @ Mar 25 2016, 15:37) *
В общем цикле (main loop) занимаетесь своими мелкими делами и между делом опрашиваете флаг переполнения таймера ШИМ.
По флагу переставляете счетчик (оптимально декрементировать до нуля), по достижению нужного колиества циклов выполняете основную функцию ПИД. Не будет накладных расходов на прерывание.


Ой!!!

Не надо так делать. В прерывании, а не в главном цикле.

Цитата(_Ivana @ Apr 7 2016, 17:02) *
Tarbal, давно не заходил на форум, не видел ваш ответ. Спасибо, попробую изучить. Сейчас изучаю ассортимент и выбираю интернет-магазин, где закупить все сразу - двигатели с редукторами (разные штук 5 на пробу), их ШИМ-контроллеры, колеса и прочую механику. С механикой у меня всегда нелегко идет, собственно электроника легче sm.gif


С механикой у всех нелегко идет, зато на форуме механиков с электроникой нелегко идет, а с механикой легче.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Apr 7 2016, 14:57
Сообщение #39


Гуру
******

Группа: Модераторы
Сообщений: 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
Выдаем воздействие.
-----------------------------------
Экономим целый таймер. И ШИМ.
Параметры считываем в цикле, так как тут нужно глазами смотреть...
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Apr 7 2016, 20:29
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Вы уже предлагали такой вариант, но мне кажется, что он полон недостатков. Возможно я чего-то не понимаю, но при таком подходе:
1) будут большие задержки, т.к. после переключения единственного АЦП на разные входы надо вроде как выжидать паузы. Или будет большая погрешность АЦП. Поэтому лучше при инициализации прочитать коэффициенты и в дальнейшей работе оставить АЦП только на входе датчика.
2) если количество тактов расчета не будет постоянным (а при наличии разных нормализаций по условиям превышения порогов оно постоянным не будет) - то И и Д компонента будет работать плохо, т.к. не выдержим строго постоянное время опроса датчика

К тому же у меня есть бортовой ШИМ - зачем его экономить? А про таймер 2 варианта вроде теоретически есть - использовать таймер АЦП при периодическом опросе или опрашивать каждый 4-й такт основного таймера.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Apr 8 2016, 10:11
Сообщение #41


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(_Ivana @ Apr 7 2016, 23:29) *
Вы уже предлагали такой вариант, но мне кажется, что он полон недостатков. Возможно я чего-то не понимаю, но при таком подходе:
1) будут большие задержки, т.к. после переключения единственного АЦП на разные входы надо вроде как выжидать паузы. Или будет большая погрешность АЦП. Поэтому лучше при инициализации прочитать коэффициенты и в дальнейшей работе оставить АЦП только на входе датчика.
2) если количество тактов расчета не будет постоянным (а при наличии разных нормализаций по условиям превышения порогов оно постоянным не будет) - то И и Д компонента будет работать плохо, т.к. не выдержим строго постоянное время опроса датчика

К тому же у меня есть бортовой ШИМ - зачем его экономить? А про таймер 2 варианта вроде теоретически есть - использовать таймер АЦП при периодическом опросе или опрашивать каждый 4-й такт основного таймера.

Про экономию ШИМа - шутка, в которой есть доля шутки. Каков у Вас период ШИМа предполагается?
А вместо потенциометра и АЦП можно сделать кнопки - увеличить и уменьшить.
А время вычислений легко сделать постоянным.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Apr 8 2016, 11:08
Сообщение #42


Местный
***

Группа: Свой
Сообщений: 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) *
А время вычислений легко сделать постоянным.

Наверное. Если закопаться в математику и написать чисто линейный алгоритм нормализаций и масштабирований значений в диапазоны безо всяких условных переходов, который будет на порядок сложнее и неочевиднее.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Apr 8 2016, 12:40
Сообщение #43


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(_Ivana @ Apr 8 2016, 14:08) *
При частоте опроса датчика 256Гц (ориентируясь на прототип, может сделаю и в 2-4 раза меньше) частота таймера ШИМ пусть в 4 раза больше - 1кГц. Каждый 4-й тик полного счетчика таймера считаю управление. Если, конечно, мой выбранный драйвер на L298N будет нормально работать на такой частоте ШИМа. Если пищать будет - пока думаю что некритично.

Можно новые значения считывать с потенциометров при нажатии кнопочки. Только нужно плавно двигать ручки или держать маятник рукой...
Не читала про этот драйвер. Используем от TI. Allegro почему-то умирают. Для сохранения их жизни используем компаратор контроллера, подключенный к шунту. Вроде бы в драйвере примерно так и сделано, но горят иногда. Все же рекомендую сделать небольшую аналоговую добавку для интегрирования тока.
А почему Вам не взять нормальный быстрый контроллер? STM32F303, например. Все текущие проблемы отодвинутся очень далеко. Там к нему в ДСП-библиотеке есть несколько вариантов ПИДа (подразумевается управление моторами). И ДМА раскладывает все числа по полочкам. И ЦАП в комплекте.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Apr 8 2016, 13:04
Сообщение #44


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Ну вот я и планирую новые значения считывать с потенциометров при нажатии кнопочки - только кнопочка называется Power Off sm.gif И Держать рукой, да.
Можно взять нормальный контроллер, можно ардуину, можно вообще готовый ПИД или сразу все готовое купить и не мучиться sm.gif
Пока я пытаюсь определиться с заказом комплектующих - у меня нет опасений, что выбранного контроллера мне не хватит. Может, когда дойдет до практики, они появятся.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 21:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01822 секунд с 7
ELECTRONIX ©2004-2016