Управление сервами с МК — различия между версиями
=DeaD= (обсуждение | вклад) (Новая: == Использование аппаратного генератора ШИМ на МК == Самый простой но не всегда подходящий способ упра...) |
Avr123 (обсуждение | вклад) (→Без использования таймера) |
||
(не показано 16 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
+ | == Введение == | ||
+ | === Распиновка разъема === | ||
+ | Три провода черный(коричневый), красный, белый(желтый) - соответственно земля, питание и управляющий сигнал (ШИМ) | ||
+ | . | ||
+ | === Управляющий сигнал === | ||
+ | Сервопривод управляется подачей на него прямоугольных импульсов по сигнальной линии с частотой около 50Гц, амплитудой не менее 3.3В (часто не менее 4.8В), шириной стандартно от 1000 до 2000мкс, что соответствует стандартным крайним положениям. Обычно реальный диапазон может быть чуть шире (например, 900-2100мкс), но это уже на усмотрение конкретного производителя сервоприводов. | ||
+ | |||
+ | == Основные методы управления сервами с МК == | ||
+ | |||
+ | Существует несколько основных методов управления сервами с помощью микроконтроллера: | ||
+ | |||
+ | * чисто аппаратная генерация ШИМ с использованием внутреннего ШИМ-генератора микроконтроллера | ||
+ | * программная генерация ШИМ без использования таймера | ||
+ | * программная генерация ШИМ с использованием таймера | ||
+ | * программная генерация ШИМ с использованием таймера и внешних компонент (счетчики, сдвиговые регистры) | ||
+ | |||
+ | Каждый метод имеет свои особенности, достоинства и недостатки. Рассмотрим их подробнее. | ||
+ | |||
== Использование аппаратного генератора ШИМ на МК == | == Использование аппаратного генератора ШИМ на МК == | ||
Самый простой но не всегда подходящий способ управления сервой - задействовать аппаратный ШИМ-контроллер МК. Преимущество такого подхода - нулевая дополнительная вычислительная нагрузка на МК, однако часто это бывает невозможно по одной из следующих причин: | Самый простой но не всегда подходящий способ управления сервой - задействовать аппаратный ШИМ-контроллер МК. Преимущество такого подхода - нулевая дополнительная вычислительная нагрузка на МК, однако часто это бывает невозможно по одной из следующих причин: | ||
− | + | * Слишком много сервоприводов, у МК нет столько встроенных ШИМ-генераторов; | |
− | + | * ШИМ-генераторы уже заняты для управления драйвером двигателей; | |
− | + | * Заняты таймеры на базе которых работают встроенные ШИМ-генераторы; | |
== Программная генерация ШИМ == | == Программная генерация ШИМ == | ||
Часто вместо аппаратного генератора приходится по вышеуказанным причинам делать программную реализацию ШИМ-генератора. Существует несколько подходов к этой задаче, которые будут рассмотрены ниже. | Часто вместо аппаратного генератора приходится по вышеуказанным причинам делать программную реализацию ШИМ-генератора. Существует несколько подходов к этой задаче, которые будут рассмотрены ниже. | ||
+ | |||
+ | Вот [http://avr123.nm.ru/z13.htm пример управления: 8 сервоприводов], команды поступают с ПК по rs232 - контроллер ATmega16. | ||
+ | |||
+ | При использовании таймеров и прерываний следует учитывать, что точность формирования импульсов ШИМ может ухудшаться — порой весьма существенно — если используются другие прерывания, кроме прерывания от таймера. Это не относится к случаю с использованием внешних компонентов. | ||
=== Без использования таймера === | === Без использования таймера === | ||
− | Самый простой и наименее приемлимый вариант - сделать основной цикл программы с частотой 50Гц и где-то в этом цикле выдавать в нужный порт 1, потом ждать от 1 до 2мс и после выдавать в этот порт 0. Очевидные недостатки | + | Самый простой и наименее приемлимый вариант - сделать основной цикл программы с частотой 50Гц и где-то в этом цикле выдавать в нужный порт 1, потом ждать от 1 до 2мс и после выдавать в этот порт 0. |
+ | |||
+ | '''Достоинства''' : простота. | ||
+ | |||
+ | '''Очевидные недостатки''' : не всегда основной цикл удобно делать такой длительности и время пока мы ждем никак не используется, а из-за этого мы можем пропустить важные события, как то прием информации через UART или важное прерывание. | ||
=== С использованием таймера, вариант 1 === | === С использованием таймера, вариант 1 === | ||
− | Наиболее удобным представляется использование таймера для генерации программного ШИМ. Для этого надо повесить прерывание на переполнение счетчика, установить частоту его срабатывания равной частоте дискретизации ШИМ-сигнала (то есть если нам надо 100 возможных положения сервопривода, тогда мы должны попадать в прерывание каждые 1/100мс=10мкс, то есть при частоте 16МГц это каждые 160 тактов). Внутри прерывания обеспечиваем счетчик, который обнуляем каждые 20мс, то есть 20'000*16=320'000 тактов. А теперь в каждые 320 тактов внутри прерывания мы можем управлять 2 сервоприводами, вначале мы устанавливаем выходы | + | Наиболее удобным представляется использование таймера для генерации программного ШИМ. Для этого надо повесить прерывание на переполнение счетчика, установить частоту его срабатывания равной частоте дискретизации ШИМ-сигнала (то есть если нам надо 100 возможных положения сервопривода, тогда мы должны попадать в прерывание каждые 1/100мс=10мкс, то есть при частоте 16МГц это каждые 160 тактов). Внутри прерывания обеспечиваем счетчик, который обнуляем каждые 20мс, то есть 20'000*16=320'000 тактов. А теперь в каждые 320 тактов внутри прерывания мы можем управлять 2-3 сервоприводами, вначале мы устанавливаем выходы всех сервоприводов в 1, затем ждем 1мс (160 тактов), затем ждем нужное количество тактов в зависимости от требуемого положения, затем выставляем в порт 0. |
+ | |||
+ | '''Достоинства''' : возможность управлять большим количеством приводов с использование всего одного таймера. | ||
+ | |||
+ | '''Недостатки''' : высокая загрузка процессора, ограниченное разрешение | ||
=== С использованием таймера, вариант 2 === | === С использованием таймера, вариант 2 === | ||
Еще одна схема с использованием таймера основывается на подготовленной заранее таблице из 256 значений порта, которые соответствуют тому, что должно выдаваться на сервопривод. В этом случае вешаем таймер на частоту вызова 1/256мс (16000/256=62.5такта), так же ставим счетчик обнуляемый каждые 20мс и как только он выставился в 0 выдаём в нужный порт 0xFF, ждем 1мс (256 тактов), а потом начинаем выдавать в порт 256 значений, которые мы заранее подготовили. | Еще одна схема с использованием таймера основывается на подготовленной заранее таблице из 256 значений порта, которые соответствуют тому, что должно выдаваться на сервопривод. В этом случае вешаем таймер на частоту вызова 1/256мс (16000/256=62.5такта), так же ставим счетчик обнуляемый каждые 20мс и как только он выставился в 0 выдаём в нужный порт 0xFF, ждем 1мс (256 тактов), а потом начинаем выдавать в порт 256 значений, которые мы заранее подготовили. | ||
+ | |||
+ | '''Достоинства''' : возможность управлять большим количеством приводов с использование всего одного таймера (при использовании нескольких портов и таблице большего размера). | ||
+ | |||
+ | '''Недостатки''' : высокая загрузка процессора, ограниченное разрешение, большой расход памяти | ||
+ | |||
+ | === С использованием таймера, вариант 3 === | ||
+ | В этом методе, прерывания от таймера происходят не с определенным периодом, а через интервалы, равные длительности импульса, подаваемого на серву. При каждом прерывании, устанавливается единица в разряде порта, соответствующем текущей серве, остальные выставляются в 0. Таймер перенастраивается таким образом, чтобы следующее прерывание произошло через период времени, равный требуемой ширине импульса. | ||
+ | |||
+ | В контроллерах ATMega удобно использовать 16-битный таймер-счетчик (Timer/counter1) и прерывание по совпадению таймера с регистром OCR1A. Таймер работает в режиме простого счетчика от 0 до 0xFFFF. Обработчик прерывания обновляет регистр OCR1A таким образом, чтобы следуещее совпадение произошло через время, равное ширине импульса: | ||
+ | |||
+ | <code>OCR1A += servo_position[i];</code> | ||
+ | |||
+ | В отличие от предыдущих методов, за одно прерывание обрабатывается только одна серва, из чего вытекает ограничение на максимальное число приводов - до 8 на 1 обработчик прерываний (исходим из того, что максимальная длительность импульса составляет [с запасом] 2500мкс, а период 20мс, 20000/2500 = 8). Если задействовать также регистр OCR1B (а также соответствующие прерывание и вывод контроллера), то получим 16 приводов на 1 таймере. | ||
+ | |||
+ | Подобным образом можно использовать и 8-битный таймер, но придется или уменьшать разрешение, или использовать более сложный обработчик прерываний, который обеспечит смену состояния порта не при каждом совпадении таймера. | ||
+ | |||
+ | '''Достоинства''' : высокое разрешение, низкая частота прерываний (а следовательно, меньшая загрузка процессора и менее жесткие требования к обработчику прерываний) | ||
+ | |||
+ | '''Недостатки''' : сравнительно небольшое число приводов на 1 таймер. | ||
+ | |||
+ | === С использованием таймера и внешних компонент === | ||
+ | В этом методе используется таймер, способный периодически изменять состояние вывода микроконтроллера (как, например, таймеры контроллеров серии ATMega компании Atmel). К этому выводу подключается тактовый вход сдвигового регистра (например, [http://www.standardics.nxp.com/products/shiftregisters/4015/ 4015]) или счетчика с декодером (например, [http://www.standardics.nxp.com/products/counters/4017/ 4017]). При этом, сигналы и временные интервалы генерируются аппаратно, а работа программы заключается в установки времени следующего срабатывания таймера. Импульсы появляются на выходах регистра(счетчика) последовательно. В этом методе, как и в предыдущем, период прерываний от таймера не фиксирован, а определяется длиной импульса для сервы, обрабатываемой в текущий момент. | ||
+ | |||
+ | В контроллерах ATMega удобно использовать 16-битный таймер-счетчик (Timer/counter1) и прерывание по совпадению таймера с регистром OCR1A. Таймер работает в режиме простого счетчика от 0 до 0xFFFF. Вывод OC1A настраивается на переключение при совпадении регистра сравнения. При совпадении, вывод переключается, логическая 1 переходит на следующий выход сдвигового регистра, и возникает прерывание. Обработчик прерывания обновляет регистр OCR1A таким образом, чтобы следуещее совпадение произошло через время, равное ширине импульса: | ||
+ | |||
+ | <code>OCR1A += servo_position[i];</code> | ||
+ | |||
+ | Ограничение на количество серв аналогично предыдущему методу. | ||
+ | |||
+ | В зависимости от использованных компонентов, обработчик прерывания может выполнять другие действия (обнуление внешнего счетчика, задание начального состояния сдвигового регистра, и т.п.) | ||
+ | |||
+ | '''Достоинства''' : высокое разрешение, низкая частота прерываний (а следовательно, меньшая загрузка процессора и менее жесткие требования к обработчику прерываний), использование небольшого количества выводов контроллера. | ||
+ | |||
+ | '''Недостатки''' : необходимость использования внешних компонент, сравнительно небольшое число приводов на 1 таймер. Главный недостаток в том, что период следования импульсов для второй и последующих серв в группе очень не постоянный и особенно сильно меняется у последней сервы. | ||
+ | |||
+ | [[Краткое описание счетчика 4017]] | ||
+ | |||
+ | == Примеры кода == | ||
+ | |||
+ | [[Media:ServoExamples.zip|ServoExamples.zip]] | ||
+ | |||
+ | Архив содержит примеры кода и схему подключения 4017 |
Текущая версия на 14:55, 4 октября 2009
Содержание
Введение
Распиновка разъема
Три провода черный(коричневый), красный, белый(желтый) - соответственно земля, питание и управляющий сигнал (ШИМ) .
Управляющий сигнал
Сервопривод управляется подачей на него прямоугольных импульсов по сигнальной линии с частотой около 50Гц, амплитудой не менее 3.3В (часто не менее 4.8В), шириной стандартно от 1000 до 2000мкс, что соответствует стандартным крайним положениям. Обычно реальный диапазон может быть чуть шире (например, 900-2100мкс), но это уже на усмотрение конкретного производителя сервоприводов.
Основные методы управления сервами с МК
Существует несколько основных методов управления сервами с помощью микроконтроллера:
- чисто аппаратная генерация ШИМ с использованием внутреннего ШИМ-генератора микроконтроллера
- программная генерация ШИМ без использования таймера
- программная генерация ШИМ с использованием таймера
- программная генерация ШИМ с использованием таймера и внешних компонент (счетчики, сдвиговые регистры)
Каждый метод имеет свои особенности, достоинства и недостатки. Рассмотрим их подробнее.
Использование аппаратного генератора ШИМ на МК
Самый простой но не всегда подходящий способ управления сервой - задействовать аппаратный ШИМ-контроллер МК. Преимущество такого подхода - нулевая дополнительная вычислительная нагрузка на МК, однако часто это бывает невозможно по одной из следующих причин:
- Слишком много сервоприводов, у МК нет столько встроенных ШИМ-генераторов;
- ШИМ-генераторы уже заняты для управления драйвером двигателей;
- Заняты таймеры на базе которых работают встроенные ШИМ-генераторы;
Программная генерация ШИМ
Часто вместо аппаратного генератора приходится по вышеуказанным причинам делать программную реализацию ШИМ-генератора. Существует несколько подходов к этой задаче, которые будут рассмотрены ниже.
Вот пример управления: 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