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

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

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

 

ЗЫ по поводу структуры и логики работы мне сейчас вроде все понятно (хотя могут внезапно появиться вопросы, которые сейчас не подозреваю), остались детали - аналоговая схема управления двигателем от двух 256-битных шимов, сколько брать бит от АЦП, где и как ограничивать аддитивные составляющие ПИД. В конце концов какой взять двигатель и как реализовать механику, может приклеить по кругу резиновую зубчатую полоску и ездить по ней шестеренкой на двигателе, для отсутствия проскальзывания. Копировать код и реализацию один в один с прототипа не хочу.

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


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

имхо проще врубить автостарт ацп и в его прерываниях считать коэффициенты. фактически появляется второй таймер.

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


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

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

По флагу переставляете счетчик (оптимально декрементировать до нуля), по достижению нужного колиества циклов выполняете основную функцию ПИД. Не будет накладных расходов на прерывание.

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


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

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

 

MrYuran спасибо, понятно. Получается уже 3 хороших варианта, как обойтись одним таймером и гарантировать строгую периодичность опроса.

ЗЫ хотя в этой ситуации непонятно, как мне продолжать декрементировать счетчик этого нужного количества периодов ШИМ, когда я начал рассчитывать результат ПИД. Его же надо продолжать декрементировать. Вариант с прерываниями мне все-таки более понятен.

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


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

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

По флагу переставляете счетчик (оптимально декрементировать до нуля), по достижению нужного колиества циклов выполняете основную функцию ПИД.

Если частота ШИМа будет большая можно пропустить несколько переполнений - потеряется равномерность цикла ПИД.

Лучше оставить счетчик в прерывании

 

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


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

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

 

Если у таймера есть несколько output compare устройств, то достаточно одного таймера. Потратьте время изучите как это работает -- окупится.

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


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

Tarbal, давно не заходил на форум, не видел ваш ответ. Спасибо, попробую изучить. Сейчас изучаю ассортимент и выбираю интернет-магазин, где закупить все сразу - двигатели с редукторами (разные штук 5 на пробу), их ШИМ-контроллеры, колеса и прочую механику. С механикой у меня всегда нелегко идет, собственно электроника легче :)

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


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

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

По флагу переставляете счетчик (оптимально декрементировать до нуля), по достижению нужного колиества циклов выполняете основную функцию ПИД. Не будет накладных расходов на прерывание.

 

Ой!!!

 

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

 

Tarbal, давно не заходил на форум, не видел ваш ответ. Спасибо, попробую изучить. Сейчас изучаю ассортимент и выбираю интернет-магазин, где закупить все сразу - двигатели с редукторами (разные штук 5 на пробу), их ШИМ-контроллеры, колеса и прочую механику. С механикой у меня всегда нелегко идет, собственно электроника легче :)

 

С механикой у всех нелегко идет, зато на форуме механиков с электроникой нелегко идет, а с механикой легче.

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


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

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

 

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

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

 

 

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

Вижу третий.

В бесконечном цикле

Считываем АЦП1- П-компонента. Потенциометры на питание - 3 штуки.

Считываем АЦП2- И-компонента

Считываем АЦП3- Д-компонента

Обновляем константы ПИДа

Считываем АЦП4- разбаланс

Считаем воздействие. 1 или 0

Выдаем воздействие.

-----------------------------------

Экономим целый таймер. И ШИМ.

Параметры считываем в цикле, так как тут нужно глазами смотреть...

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


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

Вы уже предлагали такой вариант, но мне кажется, что он полон недостатков. Возможно я чего-то не понимаю, но при таком подходе:

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

2) если количество тактов расчета не будет постоянным (а при наличии разных нормализаций по условиям превышения порогов оно постоянным не будет) - то И и Д компонента будет работать плохо, т.к. не выдержим строго постоянное время опроса датчика

 

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

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


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

Вы уже предлагали такой вариант, но мне кажется, что он полон недостатков. Возможно я чего-то не понимаю, но при таком подходе:

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

2) если количество тактов расчета не будет постоянным (а при наличии разных нормализаций по условиям превышения порогов оно постоянным не будет) - то И и Д компонента будет работать плохо, т.к. не выдержим строго постоянное время опроса датчика

 

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

Про экономию ШИМа - шутка, в которой есть доля шутки. Каков у Вас период ШИМа предполагается?

А вместо потенциометра и АЦП можно сделать кнопки - увеличить и уменьшить.

А время вычислений легко сделать постоянным.

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


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

Каков у Вас период ШИМа предполагается?

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

А вместо потенциометра и АЦП можно сделать кнопки - увеличить и уменьшить.

Можно. К тому же я предполагаю снимать коэффициенты в 6 бит (64 варианта от 0 до 100%), с одной стороны можно было бы и побольше, но так я гарантированно уложусь в 2 байта результата при однобайтном значении ошибки каждой составляющей и сумме трех умноженных на коэффициенты ошибок. Но тогда возникает вопрос визуализации значений коэффициентов - переменный резистор отличный прибор задания значения и визуализации его же забесплатно (можно хоть круговую шкалу нарисовать), кнопки и всякие энкодеры в этом отношении проигрывают.

А время вычислений легко сделать постоянным.

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

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


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

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

Можно новые значения считывать с потенциометров при нажатии кнопочки. Только нужно плавно двигать ручки или держать маятник рукой...

Не читала про этот драйвер. Используем от TI. Allegro почему-то умирают. Для сохранения их жизни используем компаратор контроллера, подключенный к шунту. Вроде бы в драйвере примерно так и сделано, но горят иногда. Все же рекомендую сделать небольшую аналоговую добавку для интегрирования тока.

А почему Вам не взять нормальный быстрый контроллер? STM32F303, например. Все текущие проблемы отодвинутся очень далеко. Там к нему в ДСП-библиотеке есть несколько вариантов ПИДа (подразумевается управление моторами). И ДМА раскладывает все числа по полочкам. И ЦАП в комплекте.

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


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

Ну вот я и планирую новые значения считывать с потенциометров при нажатии кнопочки - только кнопочка называется Power Off :) И Держать рукой, да.

Можно взять нормальный контроллер, можно ардуину, можно вообще готовый ПИД или сразу все готовое купить и не мучиться :)

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

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


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

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

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

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

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

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

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

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

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

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