Raspberry Pi и Pi4J. Урок 11. Soft PWM/Программная ШИМ на Java и C/C++

WiringPi включает в себя программно-управляемый обработчик ШИМ (Soft PWM), способный выводить сигнал ШИМ на любой из выводов GPIO Raspberry Pi (или Banana Pi, Orange Pi, NanoPi, Odroid и т.п.).

Есть некоторые ограничения. Для поддержания низкой загрузки процессора минимальная ширина импульса составляет 100 мкс. Это в сочетании с предлагаемым по умолчанию диапазоном 100 дает частоту ШИМ 100 Гц. Вы можете уменьшить диапазон, чтобы получить более высокую частоту за счет разрешения, или увеличить, чтобы получить большее разрешение, но это снизит частоту. Если вы измените ширину импульса в коде драйвера, то имейте в виду, что при задержках менее 100 мкс (WiringPi делает это в программном цикле) загрузка ЦП резко возрастет, а управление более чем одним выводом будет практически невозможно.

Также обратите внимание, что хотя подпрограммы могут работают с более высоким приоритетом или с приоритетом в реальном времени, Linux по-прежнему может влиять на точность генерируемого сигнала. Впрочем, даже несмотря на ограничения, с помощью этих функций можно управлять устройствами вроде светодиодов и моторов.

Soft PWM/Программная ШИМ на C/C++

Чтобы использовать эти функции в своей программе на C/C++, нужно включить следующие библиотеки/файлы:

При компиляции вашей программы, вы должны будете подключить pthread, а также библиотеку wiringPi, выглядеть это будет примерно так:

Описание функций softPwm.h

Доступны следующие функции:

softPwmCreate (int, int, int)

Задает контакт, на котором будет генерироваться программная ШИМ. Можно использовать любой GPIO-контакт (int pin), а распиновкой служит та, что используется функцией wiringPiSetup(). Если вписать в параметре int range значение «100», то диапазон значений на этом контакте будет от «0» (выкл) до «100» (полный ход).

Если операция пройдет успешно, функция вернет «0». Если функция вернет другое значение, то о том, что случилось, можно узнать у глобальной переменной errno.

softPwmWrite (int, int)

Обновляет значение (int value) ШИМ на указанном контакте (int pin). Значение проверяется на предмет того, не выходит ли оно за пределы заданного диапазона. Контакты, которые ранее не были инициализированы при помощи функции softPwmCreate(), будут просто проигнорированы.

softPwmStop (int)

Эта функция отключает ШИМ на данном выводе (int pin).

Пример программы

Инициализировать WiringPi можно при помощи функций wiringPiSetup(), wiringPiSetupGpio() и wiringPiSetupPhys(). Функция wiringPiSetupSys() недостаточно быстра, поэтому вам нужно будет запускать программы при помощи sudo.

Компиляция, сборка и запуск программы

  1. Сознаём файл wiringpi_soft_pwm.cpp и вставляем вышеприведённый код:
  2. Компилируем и собираем программу:
  3. Запускаем программу:

Результат

Soft PWM/Программная ШИМ на C/C++ - Результат

Soft PWM/Программная ШИМ на Java

В Pi4J есть библиотека/и для работы с ШИМ с помощью Java на Raspberry Pi, Banana Pi, Orange Pi, Nano Pi и Odroid. Все классы и интерфейсы находятся в пакетах com.pi4j.io.gpio.*; и com.pi4j.wiringpi.*;.

Интерфейс GpioPinPwm

Этот интерфейс является расширением интерфейса GpioPin с чтением значений PWM.

getPwm()

Возвращает значение, установленное в данный момент для выхода ШИМ:
Если это аппаратная Широтно-импульсная модуляция, значение будет в диапазоне от 0 до 1024, а если это программная Широтно-импульсная модуляция, значение будет в диапазоне от 0 до 100.

Интерфейс GpioPinPwmOutput

Этот интерфейс является расширением интерфейса GpioPinPwm и добавляет операции для установки выходного значения PWM.

setPwm(int)

Устанавливает значение/длину рабочего цикла ШИМ.
Если это аппаратная Широтно-импульсная модуляция, значение должно быть в диапазоне от 0 до 1024, а если это программная Широтно-импульсная модуляция, значение должно быть в диапазоне от 0 до 100.

setPwmRange(int)

Устанавливает диапазон ШИМ. По умолчанию 1024 для аппаратного ШИМ, для программного — 100.

Примеры программы

Данный пример кода генерирует программную ШИМ на одном выводе GPIO одноплатного компьютера Orange Pi PC. Если вы планируете запустить этот пример кода на другой плате, тогда не забудьте указать правильную платформу:

  • Raspberry Pi: PlatformManager.setPlatform(Platform.RASPBERRYPI);
  • Banana Pi: PlatformManager.setPlatform(Platform.BANANAPI);
  • Banana Pro: PlatformManager.setPlatform(Platform.BANANAPRO);
  • Synovoip BPI: PlatformManager.setPlatform(Platform.BPI);
  • Odroid: PlatformManager.setPlatform(Platform.ODROID);
  • Orange Pi: PlatformManager.setPlatform(Platform.ORANGEPI);
  • NanoPi: PlatformManager.setPlatform(Platform.NANOPI);
  • Simulated: PlatformManager.setPlatform(Platform.SIMULATED);

Тоже самое по поводу пинов, для Orange Pi — это com.pi4j.io.gpio.OrangePiPin, для Nano Pi — com.pi4j.io.gpio.NanoPiPin и т.д..

Компиляция, сборка и запуск программы

  1. создаём java файл и вставляем код:
  2. компилируем файл:
  3. запускаем программу:

Результат

Soft PWM/Программная ШИМ на Pi4J/Java - Результат

Примечания

  • Каждый «цикл» выхода ШИМ занимает 10 мс со значением диапазона по умолчанию 100, поэтому попытка изменить значение ШИМ более 100 раз в секунду будет бесполезной.
  • Каждый вывод, активированный в режиме soft PWM, использует приблизительно 0,5% ЦП.
  • В настоящее время нет способа отключить softPWM на выводе во время работы программы.
  • Вы должны держать свою программу в рабочем состоянии, чтобы поддерживать выход ШИМ.

Материалы

Software PWM Library
Широтно-импульсная модуляция
The Pi4J Project
Установка Pi4J на Raspberry Pi и Orange Pi, Banana Pi
Установка и настройка BPI-WiringPi/WiringPi на Banana Pi
Установка и настройка WiringOP/WiringPi на Orange Pi PC
ШИМ управление активным охлаждением на Raspberry Pi, Orange Pi, Banana Pi
Raspberry Pi:Библиотеки/WiringPi/Функции для выдачи Ш.И.М.

Похожие записи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *