Управление сервами с МК
Содержание
Введение
Существует несколько основных методов управления сервами с помощью микроконтроллера:
- чисто аппаратная генерация ШИМ с использованием внутреннего ШИМ-генератора микроконтроллера
- программная генерация ШИМ без использования таймера
- программная генерация ШИМ с использованием таймера
- программная генерация ШИМ с использованием таймера и внешних компонент (счетчики, сдвиговые регистры)
Каждый метод имеет свои особенности, достоинства и недостатки. Рассмотрим их подробнее.
Использование аппаратного генератора ШИМ на МК
Самый простой но не всегда подходящий способ управления сервой - задействовать аппаратный ШИМ-контроллер МК. Преимущество такого подхода - нулевая дополнительная вычислительная нагрузка на МК, однако часто это бывает невозможно по одной из следующих причин:
- Слишком много сервоприводов, у МК нет столько встроенных ШИМ-генераторов;
- ШИМ-генераторы уже заняты для управления драйвером двигателей;
- Заняты таймеры на базе которых работают встроенные ШИМ-генераторы;
Программная генерация ШИМ
Часто вместо аппаратного генератора приходится по вышеуказанным причинам делать программную реализацию ШИМ-генератора. Существует несколько подходов к этой задаче, которые будут рассмотрены ниже.
Вот пример управления: 8 сервоприводов, команды поступают с ПК по rs232 - контроллер ATmega16.
При использовании таймеров и прерываний следует учитывать, что точность формирования импульсов ШИМ может ухудшаться — порой весьма существенно — если используются другие прерывания, кроме прерывания от таймера. Это не относится к случаю с использованием внешних компонентов.
Без использования таймера
Самый простой и наименее приемлимый вариант - сделать основной цикл программы с частотой 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 таймер.
Краткое описание счетчика 4017
Примеры кода
Архив содержит примеры кода и схему подключения 4017