Управление сервами с МК — различия между версиями
=DeaD= (обсуждение | вклад) (→Использование аппаратного генератора ШИМ на МК) |
Blindman (обсуждение | вклад) (вводная часть, достоинства и недостатки методов) |
||
Строка 1: | Строка 1: | ||
+ | Существует несколько основных методов управления сервами с помощью микроконтроллера: | ||
+ | |||
+ | * чисто аппаратная генерация ШИМ с использованием внутреннего ШИМ-генератора микроконтроллера | ||
+ | * программная генерация ШИМ без использования таймера | ||
+ | * программная генерация ШИМ с использованием таймера | ||
+ | * программная генерация ШИМ с использованием таймера и внешних компонент (счетчики, сдвиговые регистры) | ||
+ | |||
+ | Каждый метод имеет свои особенности, достоинства и недостатки. Рассмотрим их подробнее. | ||
+ | |||
== Использование аппаратного генератора ШИМ на МК == | == Использование аппаратного генератора ШИМ на МК == | ||
Самый простой но не всегда подходящий способ управления сервой - задействовать аппаратный ШИМ-контроллер МК. Преимущество такого подхода - нулевая дополнительная вычислительная нагрузка на МК, однако часто это бывает невозможно по одной из следующих причин: | Самый простой но не всегда подходящий способ управления сервой - задействовать аппаратный ШИМ-контроллер МК. Преимущество такого подхода - нулевая дополнительная вычислительная нагрузка на МК, однако часто это бывает невозможно по одной из следующих причин: | ||
Строка 9: | Строка 18: | ||
=== Без использования таймера === | === Без использования таймера === | ||
− | Самый простой и наименее приемлимый вариант - сделать основной цикл программы с частотой 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 значений, которые мы заранее подготовили. | ||
+ | |||
+ | '''Достоинства''' : возможность управлять большим количеством приводов с использование всего одного таймера (при использовании нескольких портов и таблице большего размера). | ||
+ | |||
+ | '''Недостатки''' : высокая загрузка процессора, ограниченное разрешение, большой расход памяти | ||
+ | |||
+ | === С использованием таймера и внешних компонент === |
Версия 03:20, 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 значений, которые мы заранее подготовили.
Достоинства : возможность управлять большим количеством приводов с использование всего одного таймера (при использовании нескольких портов и таблице большего размера).
Недостатки : высокая загрузка процессора, ограниченное разрешение, большой расход памяти