Сервоуправление через USB с помощью SAM4S Xplained Pro
Часть первая в этой серии статей посвящена аппаратной настройке и использованию сигнала с широтно-импульсной модуляцией для управления сервоприводом.
Вспомогательная информация
- Введение в разработку проекта с помощью Atmel SAM4S Xplained Pro
- Широтно-импульсная модуляция
- Превратите свою ШИМ в ЦАП
- Низкочастотный фильтр ШИМ-сигнал в аналоговое напряжение
- Модуляция с широтно-импульсной модуляцией с помощью SAM4S Xplained Pro
Требуемое оборудование / программное обеспечение
- Комплект оценки SAM4S Xplained Pro
- PROTO1 Xplained Pro (не обязательно, но очень полезно)
- Студия Atmel
- Servo TowerPro SG92R (или любой эквивалентный серво)
- Настенный трансформатор переменного / постоянного тока, 5 В (или любой другой источник питания 5 В с достаточной пропускной способностью)
- 2 провода-перемычки
- 1 перемычка для подключения проводов
Другое приложение PWM
Если вы просмотрите статьи, перечисленные в разделе «Вспомогательная информация», вы заметите, что недавно я получил довольно немного информации об использовании сигнала с широтно-импульсной модуляцией (с помощью фильтра нижних частот) в качестве недорогой цифровой системы, к-аналоговому преобразователю. В процессе изучения этой темы я продемонстрировал, как генерировать сигналы PWM с платформой разработки SAM4S Xplained Pro. Учитывая, что все это PWM-бизнес свежий в наших умах, я думаю, что имеет смысл взглянуть на другое стандартное приложение для сигналов ШИМ: сервоконтроллера.
Как вы, вероятно, знаете, термин «сервопривод» (короткий для серводвигателя) обычно относится к управляемому PWM вращающемуся приводу, который использует обратную связь для точного управления угловым положением своего выходного вала. Ширина импульса управляющего сигнала соответствует угловому положению, и двигатель автоматически поворачивает свой вал в правильное положение на основе текущей ширины импульса; это простая и эффективная схема. Типичные сервоприводы «хобби» используют стандартную схему управления, в которой импульс 1 мс соответствует крайнему левому положению, 1, 5 мс соответствует центру, а 2 мс соответствует крайне правым. (Вы скоро увидите, что эти значения являются «рекомендациями», могут потребоваться некоторые корректировки.)
Сервоприводы - или недостаток
Серво, который я буду использовать для этого проекта, является TowerPro SG92R. Страница продуктов Digi-Key для SG92R указывает на «техническое описание», которое должно быть одним из самых неинформативных технических документов, которые я когда-либо читал. Это общая сумма двух страниц, первая из которых полностью состоит из фотографии. Единственный кусок солидной информации - серво может вращаться на 180 °. В нем также упоминается стандартное отношение ширины импульса к позиции, которое (по крайней мере, для моего сервомотора) оказалось очень неточным. Отсутствие характеристик тока или напряжения, отсутствие крутящего момента, отсутствие ширины запрещенной зоны, отсутствие рекомендаций по частоте ШИМ и, что хуже всего, отсутствие выводов. В техническом описании довольно много говорится об использовании сервопривода в сочетании с аппаратной информацией Arduino, которая для меня совершенно бесполезна, поскольку я не владею и никогда не использовал продукт Arduino.
К счастью для вас, я предоставлю необходимую информацию, чтобы вы могли пропустить таблицу данных. Номинальное напряжение питания составляет 5 В, и я могу подтвердить, что 5 В работает, потому что это то, что я использую. Один веб-сайт утверждает, что допустимый диапазон составляет от 3 В до 7, 2 В. Я также могу подтвердить, что вы можете успешно управлять управляющим сигналом с помощью логики 3, 3 В, даже если напряжение питания составляет 5 В. Я не измерял ток, но сервопривод работает нормально с трансформатором настенного монтажа 5 В, 1 А. Тема частоты сервоуправления PWM немного сложна, поэтому я обойду детали; достаточно сказать, что хороший выбор находится где-то в диапазоне от 40 до 60 Гц. В этом проекте мы будем использовать 50 Гц. Наконец, вот распиновка:

Мощность двигателя
Таким образом, сервомашинкам требуется 5 В. У нас есть 5 V, доступных от SAM4S Xplained Pro; зачем беспокоиться о настенном трансформаторе? Ну, дело в том, что двигатели вообще не добры к источникам питания. Питание 5 V от SAM4S происходит от USB-соединения, и не стоит рисковать повреждением USB-порта, попросив его подавать питание на двигатель. С небольшим сервоприводом, подобным этому, вы можете уйти от него, но мне нужны все мои USB-порты, поэтому в этой ситуации я выберу сейф, возможно, извиняюсь. К счастью, довольно удобно использовать внешнюю энергию, особенно если вы используете плату расширения PROTO1. Плата SAM4S может питаться от USB-разъема «DEBUG», USB-разъема «SAM4S» или внешнего источника питания. Более того, он автоматически определяет, какие напряжения присутствуют, и соответственно обеспечивает питание платы. Если присутствует более одного напряжения, он выбирает источник питания на основе следующей схемы приоритета: внешняя мощность используется всякий раз, когда она присутствует; если внешнее питание не предусмотрено, и оба USB-соединения имеют мощность в шине, плата использует мощность USB «DEBUG»; Питание «SAM4S» USB используется только тогда, когда два других источника не активны.
Таким образом, все, что нам нужно сделать, - это подключить выводы настенного трансформатора к разъему около верхнего правого угла платы PROTO1 следующим образом:

Пружинное лезвие внутри клемм разъема зажимает провод, когда вы его вставляете. Это прекрасно работает, пока ваш провод достаточно жесткий; если это не так, нанесите немного припоя. Плата SAM4S будет автоматически использовать эту внешнюю энергию, когда она будет доступна. Чтобы включить сервопривод, просто припаяйте перемычку к одному из сквозных отверстий на внешней шине питания (с надписью «EP5V0») и подключите другой конец перемычки к красно-проводной клемме сервопривода.
Сигнал и земля
Об остальной части аппаратной настройки мало что можно сказать. Один из контактов в заголовке PROTO1 помечен как «PWM +»; переместите его на клемму оранжевого провода сервопривода. Добавьте перемычку на землю, и вам хорошо идти.

Прошивка
Вам необходимо добавить три новых модуля Atmel Software Framework (ASF) в ваш новый проект: один для интерфейса PWM, один для USB-связи и один для функций задержки ASF:

Обратите внимание, что мы используем версию CDC для USB-модуля. Это означает «класс коммуникационных устройств», который является общим классом, который может использоваться в любой ситуации, когда требуется базовая последовательная связь. Модуль CDC ASF делает удивительно простым создание виртуального соединения с COM-портом с ПК, а виртуальное соединение с COM-портом - вот что нам нужно - простой интерфейс, который позволяет нам общаться с ПК с помощью стандартной терминальной программы или любого другого которая включает в себя функции последовательного порта. Мы рассмотрим часть USB этого проекта в следующей статье.
Вот код, который мы будем использовать, чтобы подтвердить, что мы можем правильно контролировать серво.
#include#define PWM0H_SERVO IOPORT_CREATE_PIN(PIOA, 23) #define PWM_CLOCKSOURCE_FREQ 1000000 #define PWM_FREQ 50 #define PWM_PERIOD_TICKS PWM_CLOCKSOURCE_FREQ/PWM_FREQ #define PULSE_WIDTH_FULL_LEFT_TICKS 1000 #define PULSE_WIDTH_CENTER_TICKS 1500 #define PULSE_WIDTH_FULL_RIGHT_TICKS 2000 pwm_channel_t PWM0_config; int main (void) { //clock configuration and initialization sysclk_init(); /*Disable the watchdog timer and configure/initialize port pins connected to various components incorporated into the SAM4S Xplained development platform, eg, the NAND flash, the OLED interface, the LEDs, the SW0 pushbutton.*/ board_init(); //connect peripheral B to pin A23 pio_configure_pin(PWM0H_SERVO, PIO_TYPE_PIO_PERIPH_B); //enable the peripheral clock for the PWM hardware pmc_enable_periph_clk(ID_PWM); //disable the PWM channel until it is properly configured pwm_channel_disable(PWM, PWM_CHANNEL_0); //PWM clock configuration pwm_clock_t PWM_clock_config = {.ul_clka = PWM_CLOCKSOURCE_FREQ,.ul_clkb = 0,.ul_mck = sysclk_get_cpu_hz() }; //apply the clock configuration pwm_init(PWM, &PWM_clock_config); //select channel 0 PWM0_config.channel = PWM_CHANNEL_0; //select clock A PWM0_config.ul_prescaler = PWM_CMR_CPRE_CLKA; //active state is logic high PWM0_config.polarity = PWM_HIGH; //left-aligned mode PWM0_config.alignment = PWM_ALIGN_LEFT; PWM0_config.ul_period = PWM_PERIOD_TICKS; PWM0_config.ul_duty = PULSE_WIDTH_CENTER_TICKS; //apply the channel configuration pwm_channel_init(PWM, &PWM0_config); //configuration is complete, so enable the channel pwm_channel_enable(PWM, PWM_CHANNEL_0); while(1) { delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_FULL_LEFT_TICKS); delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_FULL_RIGHT_TICKS); delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_CENTER_TICKS); } }
Комментарии и описательные идентификаторы должны позволять вам понимать, что происходит в коде. Однако, если вы запутались в чем-то, связанном с функциональностью PWM или конфигурации порта, обратитесь к модулю Pulse-Width Modulation с помощью SAM4S Xplained Pro для получения дополнительной информации.
Конфигурация синхронизации PWM определяется шестью определениями препроцессора рядом с началом кода:
#define PWM_CLOCKSOURCE_FREQ 1000000 #define PWM_FREQ 50 #define PWM_PERIOD_TICKS PWM_CLOCKSOURCE_FREQ/PWM_FREQ #define PULSE_WIDTH_FULL_LEFT_TICKS 1000 #define PULSE_WIDTH_CENTER_TICKS 1500 #define PULSE_WIDTH_FULL_RIGHT_TICKS 2000
Часы, управляющие оборудованием ШИМ, установлены на 1 МГц. Период ШИМ и ширина импульса определяются в единицах тактовых импульсов, поэтому любые значения, которые мы загружаем в периоды и регистры ширины импульса, соответствуют длительности в микросекундах. Значения, показанные выше, соответствуют номинальным длинам импульсов для крайних левых, центральных и крайних правых положений: 1000 тактов за 1 мс, 1500 тактов за 1, 5 мс и 2000 тактов за 2 мс. Бесконечный цикл while в конце функции main () циклически проходит через эти три позиции с последующими обновлениями в регистре ширины импульса, разделенных односекундной задержкой. На следующем видео показаны результаты:
Как вы можете видеть, диапазон вращения вала нигде не приближается к 180 °; он больше похож на 90 °. С небольшой проб и ошибок я обнаружил, что следующие значения дают ожидаемый поворот на 180 °:
#define PULSE_WIDTH_FULL_LEFT_TICKS 480 #define PULSE_WIDTH_CENTER_TICKS 1440 #define PULSE_WIDTH_FULL_RIGHT_TICKS 2350
Вы можете использовать следующую ссылку для загрузки исходных файлов и файлов проекта:
Файлы источника и проекта
Вывод
Мы создали наше оборудование и внедрили простую прошивку с сервоконтролем. Мы также установили ширину импульса, которая фактически перемещает вал в крайнее левое, центральное и крайнее правое. В следующей статье мы будем включать функции USB, чтобы мы могли управлять сервоприводом с ПК.
Следующая статья в серии: Сервоконтроль через USB с SAM4S Xplained Pro, часть 2
Попробуйте этот проект сами! Получить спецификацию.