Широкоимпульсная модуляция
Предупреждения о работе с сервоприводами
Среди всех устройств, используемых в данном курсе, сервопривод, безусловно, является тем, который потребляет больше всего энергии. Именно поэтому вы должны обратить особое внимание на следующие рекомендации:
Сервопривод имеет 3 провода: Питание, Сигнал и Заземление. Не существует стандарта на порядок или цветовую маркировку этих проводов, поэтому обязательно ознакомьтесь с документацией на сервопривод, чтобы сделать правильные подключения.
- НЕ следуйте схеме подключения на фотографиях сервопривода, который вы только что видели. Эта схема подходит для конкретного сервопривода, который был использован в этом приложении.
- НЕ пробуйте несколько соединений, пока не найдете подходящее. Если вы подключите линии питания в обратном порядке, вы можете повредить сервопривод, источник питания или и то, и другое.
- Убедитесь, что линия заземления Red-V Thing Plus и линия заземления сервопривода соединены вместе.
- Обязательно обеспечьте соответствующий источник питания для вашего сервопривода. Прочтите примечание ниже.
- Трижды проверьте подключения и убедитесь, что все в порядке.
- Мы выбрали уменьшенный сервопривод, чтобы снизить потребление энергии, и вы тоже должны это сделать. Чем больше сервопривод, тем больше энергии он будет требовать, и тем больший блок питания вам понадобится.
Вспомните рекомендации по питанию сервопривода в списке деталей:
Напряжение питания сервопривода должно соответствовать напряжению сервопривода, обычно 5 В. Вы можете подойти к этому творчески:
- Подойдет выход 5 В Arduino UNO (если он у вас есть). Именно этот источник питания используется в демонстрационном примере.
- Кабель Hydra также является одним из вариантов. Вы можете получать питание от USB-порта (не рекомендуется) или настенного USB-адаптера, который, вероятно, у вас уже есть (например, зарядное устройство для смартфона).
- Обратите внимание, что использование для этого выхода 3V3 устройства Red-V Thing Plus может повредить плату микроконтроллера.
Код приложения для демонстрации сервопривода
В нашем приложении есть все необходимое для управления сервоприводом. Оно нуждается лишь в нескольких настройках:
- Частота должна изменяться от 1 кГц до 50 Гц.
- Ширина импульса должна изменяться не в диапазоне от 0% до 100%, а в диапазоне от 1 мс до 2 мс. Теперь наше приложение управляет рабочим циклом, а не шириной импульса. Таким образом, при постоянном периоде 20 мс требуемый диапазон ширины импульса для сервопривода соответствует диапазону рабочего цикла от 5% до 10%. Мы можем сделать это с шагом в 1%. На самом деле, мы и должны так делать, потому что параметр рабочего цикла является целым числом.
- Пусковой рабочий цикл должен измениться с 50% до 7%. Учитывая это, давайте взглянем на код.
Учитывая, что приложение LED требует нескольких доработок, здесь представлена модифицированная версия с использованием директив для условного включения кода (#ifdef). Макрос SERVO определяет, будет ли приложение управлять светодиодом или шаговым сервоприводом. Если вы следите за развитием событий, создайте новый проект на основе проекта-примера hello, как обычно, и скопируйте следующий код, чтобы заменить содержимое файла hello.c. Не стесняйтесь попробовать приложение, чтобы убедиться, что оно работает правильно.
/****************************************************************************** Red-V Thing Plus PWM_Demo, by Eduardo Corpe?o Controlling the brightness of the built-in LED with two external buttons using PWM. Alternatively, a hobby servo can be controlled with those buttons. The servo must receive a 50Hz signal, with pulse widths between 1ms and 2ms. Date: June 20, 2022 Developed using Freedom Studio v4.18.0.2021-04-1 on Windows 10 LICENSE: This code is released under the CC BY-SA 4.0 License (https://creativecommons.org/licenses/by-sa/4.0/) ******************************************************************************/ #include <metal/pwm.h> #include <metal/gpio.h> #include <stdint.h> // Откомментируйте следующее определение для применения сервопривода. // Оставьте его закомментированным для приложения яркости светодиодов. #define SERVO // Наши собственные макросы, определенные для эффективности или потому, что // Freedom Metal Library не обеспечила их функциональность. #define Red_V_enable_output(x) *((uint32_t *) 0x10012008) |= (1<<(x)) #define Red_V_set_pin(x) *((uint32_t *) 0x1001200C) |= (1<<(x)) #define Red_V_clear_pin(x) *((uint32_t *) 0x1001200C) &= ~(1<<(x)) #define Red_V_read_pin(x) (*((uint32_t *) 0x10012000) & (1<<(x))) #define Red_V_enable_pullup(x) *((uint32_t *) 0x10012010) |= (1<<(x)) #define Red_V_enable_DS(x) *((uint32_t *) 0x10012014) |= (1<<(x)) #define Red_V_enable_XOR(x) *((uint32_t *) 0x10012040) |= (1<<(x)) // Быстрая и грязная функция задержки для экспериментального использования.void delay(int t){ volatile uint32_t x, y; x = t; while(x--){ y=x; while(y--); } } int main (void) { #ifdef SERVO unsigned int dc = 7; // Примерно центральное положение сервоаривода #else unsigned int dc = 50; // Рабочий цикл по умолчанию 50% #endif struct metal_gpio *gpio_0; // Экземпляр GPIO struct metal_pwm *pwm_1; // Экземпляр ШИМ // Конфигурация GPIO для встроенного светодиода и кнопок gpio_0 = metal_gpio_get_device(0); // Получение экземпляра устройства GPIO // LED metal_gpio_disable_input(gpio_0, 5); // Отключить ввод 5 Red_V_enable_output(5); // Отключить вывод 5 metal_gpio_disable_pinmux(gpio_0, 5); // Отключить альтернативные функции для пина 5 // Нажатие кнопок metal_gpio_enable_input(gpio_0, 0); // Включить ввод 0 metal_gpio_enable_input(gpio_0, 1); // Включить ввод 1 metal_gpio_disable_output(gpio_0, 0); // Выключить вывод 0 metal_gpio_disable_output(gpio_0, 1); // Выключить вывод 1 metal_gpio_disable_pinmux(gpio_0, 0); // Отключить альтернативные функции для пина 0 metal_gpio_disable_pinmux(gpio_0, 1); // Отключить альтернативные функции для пина 1 Red_V_enable_pullup(0); // Включить подтягивающий резистор для пина 0 Red_V_enable_pullup(1); // Включить подтягивающий резистор для пина 1 // Конфигурация ШИМ. Мы будем использовать PWM1_1, который использует GPIO0_19. #ifndef SERVO Red_V_enable_DS(19); // Высокий уровень сигнала на входе #endif Red_V_enable_XOR(19); // Инвертируем выход для активно-высокого ШИМ pwm_1 = metal_pwm_get_device(1); // Получение экземпляра ШИМ-устройства while (pwm_1 == NULL); // Остановка. Что-то пошло не так. metal_pwm_enable(pwm_1); // Включить ШИМ1 metal_gpio_disable_pinmux(gpio_0, 20); // Отключить альтернативные функции для вывода 20 metal_gpio_disable_pinmux(gpio_0, 21); // Отключить альтернативные функции для вывода 21 metal_gpio_disable_pinmux(gpio_0, 22); // Отключить альтернативные функции для вывода 22 // Установка частоты ШИМ на 1кГц или 50Гц #ifdef SERVO metal_pwm_set_freq(pwm_1, 1, 50); // Установка частоты ШИМ1_1 на 50Гц для сервопривода #else metal_pwm_set_freq(pwm_1, 1, 1000); // Установка частоты ШИМ1_1 на 1 кГц для светодиода #endif metal_pwm_set_duty(pwm_1, 1, dc, METAL_PWM_PHASE_CORRECT_DISABLE); // Установить рабочий цикл для PWM1_1 metal_pwm_trigger(pwm_1, 1, METAL_PWM_CONTINUOUS); // Запуск в непрерывном режиме mode while(1){ if(Red_V_read_pin(0) == 0){ // Считываем входной пин 0 Red_V_set_pin(5); // Включаем светодиод #ifdef SERVO dc = (dc>5)? dc - 1 : dc; // Шаг 1% для серво #else dc = (dc>0)? dc - 10 : dc; // Шаг 10% для яркости #endif metal_pwm_set_duty(pwm_1, 1, dc, METAL_PWM_PHASE_CORRECT_DISABLE); delay(300); // Избегаем дребезг Red_V_clear_pin(5); // Выключаем светодиод while(Red_V_read_pin(0) == 0);// Ждем, пока кнопка будет отпущена delay(300); // Избегаем дребезг } else if(Red_V_read_pin(1) == 0){// Считываем входной пин 1 Red_V_set_pin(5); // Включаем светодиод #ifdef SERVO dc = (dc<10)? dc + 1 : dc; // Шаг 1% для серво #else dc = (dc<100)? dc + 10 : dc; // Шаг 10% для яркости #endif metal_pwm_set_duty(pwm_1, 1, dc, METAL_PWM_PHASE_CORRECT_DISABLE); delay(300); // Избегаем дребезг Red_V_clear_pin(5); // Выключаем светодиод while(Red_V_read_pin(1) == 0);// Ждем, пока кнопка будет отпущена delay(300); // Избегаем дребезг } } return 0; // Недостижимый код возврата }
Итоги лекции
Поздравляю! Вы наверняка узнали много нового только в этой главе. Давайте вспомним, что мы сделали в этой лекции:
- Мы рассмотрели, что такое широтно-импульсная модуляция и как ее можно использовать для подачи энергии на нагрузку.
- Мы обсудили, как микроконтроллеры обычно генерируют сигналы ШИМ. Мы изучили руководство FE310, чтобы узнать об аппаратном обеспечении ШИМ и регистрах конфигурации.
- Мы изучили руководство FE310, чтобы узнать об аппаратном обеспечении ШИМ и регистрах конфигурации.
- Мы изучили дребезг кнопок и несколько методов борьбы с ним.
- Мы создали приложение для управления яркостью светодиодов.
- Мы узнали, как подключить шаговый сервопривод к вашей плате.
- Мы создали приложение для управления шаговым сервоприводом.
Не стесняйтесь возвращаться к этому материалу, если в будущем вам понадобится подтянуть знания.