Опубликован: 24.11.2024 | Доступ: свободный | Студентов: 2 / 0 | Длительность: 05:47:00
Лекция 5:

Широкоимпульсная модуляция

Предупреждения о работе с сервоприводами

Среди всех устройств, используемых в данном курсе, сервопривод, безусловно, является тем, который потребляет больше всего энергии. Именно поэтому вы должны обратить особое внимание на следующие рекомендации:

Сервопривод имеет 3 провода: Питание, Сигнал и Заземление. Не существует стандарта на порядок или цветовую маркировку этих проводов, поэтому обязательно ознакомьтесь с документацией на сервопривод, чтобы сделать правильные подключения.

  1. НЕ следуйте схеме подключения на фотографиях сервопривода, который вы только что видели. Эта схема подходит для конкретного сервопривода, который был использован в этом приложении.
  2. НЕ пробуйте несколько соединений, пока не найдете подходящее. Если вы подключите линии питания в обратном порядке, вы можете повредить сервопривод, источник питания или и то, и другое.
  3. Убедитесь, что линия заземления Red-V Thing Plus и линия заземления сервопривода соединены вместе.
  4. Обязательно обеспечьте соответствующий источник питания для вашего сервопривода. Прочтите примечание ниже.
  5. Трижды проверьте подключения и убедитесь, что все в порядке.
  6. Мы выбрали уменьшенный сервопривод, чтобы снизить потребление энергии, и вы тоже должны это сделать. Чем больше сервопривод, тем больше энергии он будет требовать, и тем больший блок питания вам понадобится.

Вспомните рекомендации по питанию сервопривода в списке деталей:

Напряжение питания сервопривода должно соответствовать напряжению сервопривода, обычно 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, чтобы узнать об аппаратном обеспечении ШИМ и регистрах конфигурации.
  • Мы изучили дребезг кнопок и несколько методов борьбы с ним.
  • Мы создали приложение для управления яркостью светодиодов.
  • Мы узнали, как подключить шаговый сервопривод к вашей плате.
  • Мы создали приложение для управления шаговым сервоприводом.

Не стесняйтесь возвращаться к этому материалу, если в будущем вам понадобится подтянуть знания.