Пульс плотности модуляции , или ДПМ , является одной из форм модуляции используется для представления аналогового сигнала с двоичным сигналом . В сигнале PDM, конкретные амплитуды значение не кодируется в кодовые слова импульсов разного веса , как они были бы в импульсно-кодовой модуляции (PCM); а относительная плотность импульсов соответствует амплитуде аналогового сигнала. Выход в 1-битного ЦАП является таким же , как PDM кодирования сигнала. Широтно-импульсной модуляции (ШИМ) представляет собой частный случай ДПМ , где фиксируется частота коммутации и все импульсы , соответствующие одному образцу являются смежными в цифровом сигнале. Для 50% напряжения с разрешением 8 бит, ШИМ сигнал включится на 128 тактовых циклов , а затем выключить для остальных 128 циклов. С ДПМ и той же тактовой частоте сигнала будет чередоваться между включением и выключением любого другого цикла. В среднем составляет 50% для обоих сигналов, но сигнал ДПМ переключается чаще. При 100% или 0% уровня, они одинаковы.
Двигатель который может находиться в заданном положении, а при воздействии внешних факторов, например, принудительном отклонении вала, удерживает его положение неизменным – называется сервоприводом. Вообще определение звучит несколько иначе:
Сервопривод, это двигатель управляемый отрицательной обратной связью.
Обычно с сервопривода выходит три провода:
- Плюс питания.
- Минус питания.
- Управляющий сигнал.
Блок управления сравнивает сигнал на встроенном датчике положения и сигнал, пришедший по управляющему проводу, если они различаются, то происходит поворот на угол, при котором разница между сигнала нивелируется.
Основные характеристики сервоприводов:
- Скорость поворота (время, за которое вал поворачивается на угол 60°);
- Крутящий момент (кг/см, т.е. сколько килограмм может выдерживать двигатель на рычаге в 1 см от вала);
- Напряжение питания;
- Потребляемый ток;
- По способу управления (аналоговый или цифровой, существенной разницы нет, но цифровой более быстродействующий и стабильный).
Обычно период сигнала равен 20 мс, а длительность управляющего импульса:
- 544 мкс – соответствует 0°;
- 2400 мкс – соответствует углу 180°.
Сервопривод для Ардуино
Сервопривод – это такой вид привода, который может точно управлять параметрами движения. Другими словами, это двигатель, который может повернуть свой вал на определенный угол или поддерживать непрерывное вращение с точным периодом.
Схема и типы сервоприводов
Принцип работы сервопривода основан на обратной связи с одним или несколькими системными сигналами. Выходной показатель подается на вход, где сравнивается его значение с задающим действием и выполняются необходимые действия – например, выключается двигатель. Самым простым вариантов реализации является переменный резистор, который управляется валом – при изменении параметров резистора меняются параметры питающего двигатель тока.
В реальных сервоприводов механизм управления гораздо сложнее и использует встроенные микросхемы-контроллеры. В зависимости от типа используемого механизма обратной связи выделяют аналоговые и цифровые сервоприводы. Первые используют что-то, похожее на потенциометр, вторые – контроллеры.
Вся схема управления серво находится внутри корпуса, управляющие сигналы и питание подаются, как правило, идут по трем проводам: земля, напряжение питания и управляющий сигнал.
Подключение серводвигателя к ардуино
Сервопривод обладает тремя контактами, которые окрашены в разные цвета. Коричневый провод ведет к земле, красный – к питанию +5В, провод оранжевого или желтого цвета – сигнальный. К Ардуино устройство подключается через макетную указанным на рисунке образом. Оранжевый провод (сигнальный) подключается к цифровому пину, черный и красный – к земле и питанию соответственно. Для управления серводвигателем не требуется подключение именно к шим-пинам – принцип управления серво мы уже описывали ранее.
Не рекомендуется подключать мощные серво напрямую к плате , т.к. они создают для схемы питания Arduino ток, не совместимый с жизнью – повезет, если сработает защита. Чаще всего симптомы перегрузки и неправильного питания сервопривода заключаются в “дергании” серво, неприятному звуку и перезагрузке платы. Для питания лучше использовать внешние источники, обязательно объединяя земли двух контуров.
Сервопривод SG90
Характеристики и подключение SG-90
Если вы собрались купить самый дешевый и простой сервопривод, то SG 90 будет лушим вариантом Этот серво чаще всего используется в управлении небольшими легкими механизмами с углом поворота от 0° до 180°.
Технические характеристики SG90:
- Скорость отработки команды 0,12с/60 градусов;
- Питание 4,8В;
- Рабочие температуры от -30С до 60 С;
- Размеры 3,2 х 1,2 х 3 см;
- Вес 9 г.
Описание SG90
Цвета проводов стандартные. Сервопривод стоит недорого, он не обеспечивает точных настроек начальных и конечных позиций. Для того, чтобы избежать лишних перегрузок и характерного треска в положении 0 и 180 градусов лучше выставлять крайние точки в 10° и 170°. При работе устройства важно следить за напряжением питания. При сильном завышении этого показателя могут повредиться механические элементы зубчатых механизмов.
Скетч для управления сервоприводом в Arduino
Управление сервоприводом напрямую через изменение в скетче длительности импульсов – достаточно нетривиальная задача, но у нас, к счастью, есть отличная библиотека Servo, встроенная в среду разработки Arduino. Все нюансы программирования и работы с сервоприводами мы рассмотрим в отдельной статье. Здесь же приведем простейший пример использования Servo.Алгоритм работы прост:
- Для начала мы подключаем Servo.h
- Создаем объект класса Servo
- В блоке setup указываем, к какому пину подключен серво
- Используем методы объекта обычным для C++ способом. Самым популярным является метод write, которому мы подаем целочисленное значение в градусах (для сервопривода 360 эти значения будут интерпретироваться по-другому).
Для управления такими сервоприводами с ардуино в вашем распоряжении есть встроенная в IDE библиотека Servo, у неё небольшой набор команд:
- attach() — добавить переменную к пину. Пример: названиеПривода.attach(9) – к 9 пину подключаем сервопривод. Если вашему приводу нужны нестандартные длины управляющих импульсов (544 и 2400 мкс), то их можно задать через запятую после номера пина, например: servo.attach(pin, min угол (мкс), max угол в МКС));
- write() — задает угол поворота вала в градусах;
- writeMicroseconds() — задает угол, через длину импульса в микросекундах;
- read() — определяет текущее положение вала;
- attached() — Проверяет, задан ли пин с подключенным сервоприводом;
- detach() — отмена команды attach.
Пример простого скетча для работы с сервоприводом
Пример проекта, в котором мы сразу сначала устанавливаем серводвигатель на нулевой угол, а затем поворачиваем на 90 градусов.- #include <Servo.h>
- Servo servo; // Создаем объект
- void setup() {
- servo.attach(9); // Указываем объекту класса Servo, что серво присоединен к пину 9
- servo1.write(0); // Выставляем начальное положение
- }
- void loop() {
- servo.write(90); // Поворачиваем серво на 90 градусов
- delay(1000);
- servo.write(1800);
- delay(100);
- servo.write(90);
- delay(1000);
- servo.write(0);
- delay(1000);
- }
Скетч для двух сервпоприводов
А в этом примере мы работаем сразу с двумя сервоприводами:- #include <Servo.h>
- Servo servo1; // Первый сервопривод
- Servo servo2; // Второй сервопривод
- void setup() {
- servo1.attach(9); // Указваем объекту класса Servo, что серво присоединен к пину 9
- servo2.attach(10); // А этот servo присоединен к 10 пину
- }
- void loop() {
- // Выставялем положения
- servo1.write(0);
- servo2.write(180);
- delay(20);
- // Меняем положения
- servo2.write(0);
- servo1.write(180);
- }
Управление сервоприводом с помощью потенциометра
В этом примере поворачиваем серво в зависимости от значения, полученное от потенциометра. Считываем значение и преобразовываем его в угол с помощи функции map:- //Фрагмент стандартного примера использования библиотеки Servo
- void loop() {
- val = analogRead(A0); // Считываем значение с пина, к которому подключен потенциометр
- val = map(val, 0, 1023, 0, 180); // Преобразуем число в диапазоне от 0 до 1023 в новый диапазон - от 0 до 180.
- servo.write(val);
- delay(15);
- }
map(value, fromLow, fromHigh, toLow, toHigh)
long
map(
long
x,
long
in_min,
long
in_max,
long
out_min,
long
out_max)
{
return
(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}