Разработка программного обеспечения контроллера двигателя

Мне нужно разработать ПИД-регулятор для робота с дифференциальным приводом.

  • Аппаратная плата состоит из AVR atmega168, работающего на частоте 16 МГц.
  • Приводится в движение двумя мотороллерами 24 В с энкодерами 256 CPR.
  • Двигатели вращаются примерно со скоростью около 4700 об / мин и имеют передаточное число 51,56: 1.

Пока я могу прочитать направление энкодера и количество тиков. Но я понятия не имею, как преобразовать это в скорость. И, наконец, ПИД-регулятор. Я также хочу иметь возможность поворачивать робота на заданный угол. Может кто-нибудь, пожалуйста, помогите мне начать?

В настоящее время у меня возникают проблемы с определением подходящего расчета таймера для этого.

хорошо .. вы можете дифференцировать положение, чтобы получить скорость; если вы измеряете угол, скажем, 50 раз в секунду, то вы знаете, как далеко он повернулся за 1/50 секунды, поэтому 50 раз это будут градусы (или любая другая угловая единица, которую вы используете) в секунду.
изменение количества/угла с течением времени?
Энкодеры стоят перед редуктором или после? (Предположительно раньше, но...)
пожалуйста, разбейте на отдельные конкретные вопросы
Для ПИД-регулятора: вы можете прочитать эту пару записей в блоге, которые я написал: embeddedrelated.com/showarticle/121.php

Ответы (3)

Спасибо всем за полезные комментарии.

Я добился того, чего хотел, реализовав простой ПИД-регулятор скорости.

Через два прерывания (для каждого энкодера) я подсчитал, сколько тиков энкодера накопилось за данный интервал времени. Интервал, который я использовал, составлял 10 мс, и это было достигнуто с помощью функции сравнения таймеров на таймере 1 микроконтроллера AVR. Такты кодировщика рассчитывались путем получения разницы между предыдущими тактами кодировщика и текущими тактами. Затем это использовалось в качестве PV скорости ПИД-регулятора. Частота дискретизации ПИД-регулятора также была установлена ​​на уровне 10 мс. Просто чтобы все было просто.

Я написал простой графический интерфейс MATLAB для построения графика SP, PV переходной характеристики ПИД-регулятора. Вот как я вручную настроил ПИД-регулятор. Это может быть не лучший способ, но, безусловно, самый простой способ, который я мог придумать для настройки контроллера.

Я задокументирую это в своем блоге, когда у меня будет возможность, и поставлю ссылку на него в этом посте, чтобы он был полезен для всех.

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

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

Один из способов сделать это: (а) Инициализировать и запустить таймер и сбросить счетчик энкодера (б) написать процедуру обслуживания прерывания (ISR), которая вызывается, когда таймер заканчивается, перезапускает таймер и вычисляет угловую скорость. (c) Напишите еще одну ISR, которая запускается выходным тактом кодировщика и увеличивает глобальный счетчик тактов. (d) в таймере ISR вы знаете время, прошедшее с момента последнего вызова с момента инициализации таймера, который вы указали. У вас есть количество тактов энкодера с момента последнего вызова ISR таймера. Таким образом, вы можете рассчитать количество тиков в единицу времени. Вы должны знать из механических деталей вашего робота количество тактов на единицу угла поворота колеса, таким образом, вы должны быть в состоянии рассчитать угловую скорость колеса.

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

Это только один из способов сделать это. Я могу представить другие. Однако я обнаружил, что этот алгоритм хорошо работал для меня раньше.

Это будет довольно сложно сделать для двух двигателей, так как вам придется отслеживать два канала энкодера на каждый двигатель. Не невозможно, но нужно много действительно тщательного кодирования, чтобы быть уверенным, что вы не пропустите ни одного перехода любого канала энкодера на любом двигателе (т. е. у вас есть 4 вещи, чтобы следить за событиями, и хотя между каналами есть корреляция, нет ни одной). между двигателями). Может возникнуть соблазн дать каждому двигателю собственный микроконтроллер или использовать чип квадратурного счетчика для захвата обратной связи (или сделать свой собственный в дешевом CPLD).

Поскольку вы хотите иметь возможность поворачивать точные углы, предположительно, за счет дифференциального вращения двух колес, я бы подумал о создании пары контроллеров положения, а не контроллеров скорости, каждый из которых вращал бы свой двигатель, чтобы уравнять достигнутые подсчеты с подсчетами в нужном регистре позиций. Для упрощения ваш основной командный интерфейс может быть числом со знаком (не менее 16 бит, но, вероятно, 24 или даже 32), которое будет добавлено к желаемой позиции, которую ищет каждый контроллер.

На более высоком уровне у вас будет планировщик движения, который будет периодически использовать его для обновления желаемых позиций. При движении с фиксированной скоростью вы просто выдаете команду еще на n шагов каждые m миллисекунд, при ускорении или замедлении вы подбрасываете меньше. Чтобы превратиться, вы отправляете положительное число одному и менее положительное (или, на месте, отрицательное) другому. Концептуально это одно и то же, независимо от того, взаимодействуете ли вы между логическими блоками в программе на одном процессоре или управляете подчиненными процессорами.