Управление сервами с МК — различия между версиями
Blindman (обсуждение | вклад) (добавлено описание еще одного метода) |
Digit (обсуждение | вклад) м |
||
Строка 1: | Строка 1: | ||
+ | == Введение == | ||
Существует несколько основных методов управления сервами с помощью микроконтроллера: | Существует несколько основных методов управления сервами с помощью микроконтроллера: | ||
Версия 07:44, 11 июня 2008
Содержание
Введение
Существует несколько основных методов управления сервами с помощью микроконтроллера:
- чисто аппаратная генерация ШИМ с использованием внутреннего ШИМ-генератора микроконтроллера
- программная генерация ШИМ без использования таймера
- программная генерация ШИМ с использованием таймера
- программная генерация ШИМ с использованием таймера и внешних компонент (счетчики, сдвиговые регистры)
Каждый метод имеет свои особенности, достоинства и недостатки. Рассмотрим их подробнее.
Использование аппаратного генератора ШИМ на МК
Самый простой но не всегда подходящий способ управления сервой - задействовать аппаратный ШИМ-контроллер МК. Преимущество такого подхода - нулевая дополнительная вычислительная нагрузка на МК, однако часто это бывает невозможно по одной из следующих причин:
- Слишком много сервоприводов, у МК нет столько встроенных ШИМ-генераторов;
- ШИМ-генераторы уже заняты для управления драйвером двигателей;
- Заняты таймеры на базе которых работают встроенные ШИМ-генераторы;
Программная генерация ШИМ
Часто вместо аппаратного генератора приходится по вышеуказанным причинам делать программную реализацию ШИМ-генератора. Существует несколько подходов к этой задаче, которые будут рассмотрены ниже.
Без использования таймера
Самый простой и наименее приемлимый вариант - сделать основной цикл программы с частотой 50Гц и где-то в этом цикле выдавать в нужный порт 1, потом ждать от 1 до 2мс и после выдавать в этот порт 0.
Достоинства : никаких.
Очевидные недостатки : не всегда основной цикл удобно делать такой длительности и время пока мы ждем никак не используется, а из-за этого мы можем пропустить важные события, как то прием информации через UART или важное прерывание.
С использованием таймера, вариант 1
Наиболее удобным представляется использование таймера для генерации программного ШИМ. Для этого надо повесить прерывание на переполнение счетчика, установить частоту его срабатывания равной частоте дискретизации ШИМ-сигнала (то есть если нам надо 100 возможных положения сервопривода, тогда мы должны попадать в прерывание каждые 1/100мс=10мкс, то есть при частоте 16МГц это каждые 160 тактов). Внутри прерывания обеспечиваем счетчик, который обнуляем каждые 20мс, то есть 20'000*16=320'000 тактов. А теперь в каждые 320 тактов внутри прерывания мы можем управлять 2-3 сервоприводами, вначале мы устанавливаем выходы всех сервоприводов в 1, затем ждем 1мс (160 тактов), затем ждем нужное количество тактов в зависимости от требуемого положения, затем выставляем в порт 0.
Достоинства : возможность управлять большим количеством приводов с использование всего одного таймера.
Недостатки : высокая загрузка процессора, ограниченное разрешение
С использованием таймера, вариант 2
Еще одна схема с использованием таймера основывается на подготовленной заранее таблице из 256 значений порта, которые соответствуют тому, что должно выдаваться на сервопривод. В этом случае вешаем таймер на частоту вызова 1/256мс (16000/256=62.5такта), так же ставим счетчик обнуляемый каждые 20мс и как только он выставился в 0 выдаём в нужный порт 0xFF, ждем 1мс (256 тактов), а потом начинаем выдавать в порт 256 значений, которые мы заранее подготовили.
Достоинства : возможность управлять большим количеством приводов с использование всего одного таймера (при использовании нескольких портов и таблице большего размера).
Недостатки : высокая загрузка процессора, ограниченное разрешение, большой расход памяти
С использованием таймера, вариант 3
В этом методе, прерывания от таймера происходят не с определенным периодом, а через интервалы, равные длительности импульса, подаваемого на серву. Сервы лучше всего подключать к одному порту. При каждом прерывании, устанавливается единица в разряде порта, соответствующем текущей серве, остальные выставляются в 0. Таймер перенастраивается таким образом, чтобы следующее прерывание произошло через период времени, равный требуемой ширине импульса.
В контроллерах ATMega удобно использовать 16-битный таймер-счетчик (Timer/counter1) и прерывание по совпадению таймера с регистром OCR1A. Таймер работает в режиме простого счетчика от 0 до 0xFFFF. Обработчик прерывания обновляет регистр OCR1A таким образом, чтобы следуещее совпадение произошло через время, равное ширине импульса:
OCR1A += servo_position[i];
В отличие от предыдущих методов, за одно прерывание обрабатывается только одна серва, из чего вытекает ограничение на максимальное число приводов - до 8 на 1 обработчик прерываний (исходим из того, что максимальная длительность импульса составляет [с запасом] 2500мкс, а период 20мс, 20000/2500 = 8). Если задействовать также регистр OCR1B (а также соответствующие прерывание и вывод контроллера), то получим 16 приводов на 1 таймере.
Подобным образом можно использовать и 8-битный таймер, но придется или уменьшать разрешение, или использовать более сложный обработчик прерываний, который обеспечит выдачу тактового импульса не при каждом совпадении таймера.
Ограничение на количество серв аналогично предыдущему методу.
Достоинства : высокое разрешение, низкая частота прерываний (а следовательно, меньшая загрузка процессора и менее жесткие требования к обработчику прерываний)
Недостатки : сравнительно небольшое число приводов на 1 таймер.
С использованием таймера и внешних компонент
В этом методе используется таймер, способный периодически изменять состояние вывода микроконтроллера (как, например, таймеры контроллеров серии ATMega компании Atmel). К этому выводу подключается тактовый вход сдвигового регистра (например, 4015) или счетчика с декодером (например, 4017). При этом, сигналы и временные интервалы генерируются аппаратно, а работа программы заключается в установки времени следующего срабатывания таймера. Импульсы появляются на выходах регистра(счетчика) последовательно. В этом методе, как и в предыдущем, период прерываний от таймера не фиксирован, а определяется длиной импульса для сервы, обрабатываемой в текущий момент.
В контроллерах ATMega удобно использовать 16-битный таймер-счетчик (Timer/counter1) и прерывание по совпадению таймера с регистром OCR1A. Таймер работает в режиме простого счетчика от 0 до 0xFFFF. Вывод OC1A настраивается на переключение при совпадении регистра сравнения. При совпадении, вывод переключается, логическая 1 переходит на следующий выход сдвигового регистра, и возникает прерывание. Обработчик прерывания обновляет регистр OCR1A таким образом, чтобы следуещее совпадение произошло через время, равное ширине импульса:
OCR1A += servo_position[i];
В зависимости от использованных компонентов, обработчик прерывания может выполнять другие действия (обнуление внешнего счетчика, задание начального состояния сдвигового регистра, и т.п.)
Достоинства : высокое разрешение, низкая частота прерываний (а следовательно, меньшая загрузка процессора и менее жесткие требования к обработчику прерываний), использование небольшого количества выводов контроллера.
Недостатки : необходимость использования внешних компонент, сравнительно небольшое число приводов на 1 таймер.