PWM
К СВЕДЕНИЮ
Выход 16-битного контроллера ШИМ Repka Pi 3 подключен к контакту PL10 и доступен только на 5-ом варианте распиновки GPIO-разъема.
setupPwm() #
Инициализирует функцию управления интегрированным ШИМ контроллером.
Синтаксис #
int setupPwm(void)
Параметры #
Ничего.
Возврат #
0 при успешном выполнении, или отрицательное значение в случае ошибки.
releasePwm() #
Высвобождает ресурсы задействованные функцией управления интегрированным ШИМ контроллером.
Синтаксис #
void releasePwm(void)
Параметры #
Ничего.
Возврат #
Ничего.
pwmSetClock() #
Устанавливает предделитель системной частоты таймера OSC24MHz ШИМ.
Синтаксис #
void pwmSetClock(int divisor)
Параметры #
divisor
- значение предделителя частоты таймера OSC24MHz ШИМ, допустимые значения:
PWM_CLK_DIV_120
(значение по умолчанию).PWM_CLK_DIV_180
.PWM_CLK_DIV_240
.PWM_CLK_DIV_360
.PWM_CLK_DIV_480
.PWM_CLK_DIV_12K
.PWM_CLK_DIV_24K
.PWM_CLK_DIV_36K
.PWM_CLK_DIV_48K
.PWM_CLK_DIV_72K
.PWM_CLK_DIV_1
.
Возврат #
Ничего.
pwmSetMode() #
Устанавливает режим генерирования сигнала ШИМ контроллером.
Синтаксис #
void pwmSetMode(int mode)
Параметры #
mode
- значение режима генерирования сигнала ШИМ контроллером, допустимые значения:
PWM_CYCLE_MODE
- цикл.PWM_PULSE_MODE
- пульс.
Возврат #
Ничего.
pwmSetRange() #
Устанавливает количество полных циклов в тактовой частоте ШИМ.
Синтаксис #
void pwmSetRange(unsigned int range)
Параметры #
range
- количество полных циклов в тактовой частоте, вычисляемой по формуле PWM_CLK = 24 MHz / pre-scale. Принимает значение в диапазоне от 0 до 65535.
Возврат #
Ничего.
pwmWrite() #
Устанавливает количество активных циклов в тактовой частоте ШИМ.
Синтаксис #
void pwmWrite(int value)
Параметры #
value
- количество активных циклов в тактовой частоте, вычисляемой по формуле PWM_CLK = 24 MHz / pre-scale. Принимает значение в диапазоне от 0 до 65535. Для значения должно выполнятся условие value <= range
(см. pwmSetRange() выше).
Возврат #
Ничего.
pwmToneWrite() #
Устанавливает частоту модулируемого ШИМ сигнала. Использоваться для генерации нот и аккордов.
Синтаксис #
void pwmToneWrite(int freq)
Параметры #
freq
- частота сигнала. Принимает значение в диапазоне от 0 до 65535.
Возврат #
Ничего.
Пример использования pwmWrite #
Код имитирует аналоговый выход с помощью широтно-импульсной модуляции для изменения яркости свечения светодиода, подключенного к выходу контроллера PWM0 (PL10). Уровень яркости задается в диапазоне от 0% до 100%, и отображается в целевой диапазон от 0 до 1000 с помощью функции map()
.
предупреждение
Пример может быть запущен только на 5-ом варианте распиновки GPIO-разъема.
#include <stdlib.h>
#include "wiringRP.h"
#include "pwm.h"
// Глобальные переменные и константы
void setup() {
// Инициализация библиотек wiringRP
if(setupWiringRP(WRP_MODE_SUNXI) < 0)
exit(EXIT_FAILURE);
setupPwm();
// Инициализация пользовательских объектов
pwmSetClock(PWM_CLK_DIV_120);
pwmSetMode(PWM_CYCLE_MODE);
pwmSetRange(1000);
}
void loop() {
// Основной цикл программы
for (int i = 0; i < 100; i++) {
int val = map(i, 0, 100, 0, 1000);
pwmWrite(val);
delay(10);
}
for (int i = 100; i > 0; i--) {
int val = map(i, 0, 100, 0, 1000);
pwmWrite(val);
delay(10);
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
pwmWrite(0);
// Завершение работы библиотек
releaseWiringRP();
releasePwm();
exit(0); // выход из программы
}
MAIN_WIRINGRP();
Пример использования pwmTone #
Код запускает функцию частотно-импульсной модуляции (24 MHz) для воспроизведения мелодии на пьезоэлектрическом динамике, подключенном к выходу контроллера PWM0 (PL10).
предупреждение
Пример может быть запущен только на 5-ом варианте распиновки GPIO-разъема.
#include <stdlib.h>
#include "wiringRP.h"
#include "pwm.h"
// Глобальные переменные и константы
const int frq[17] = {440, 165, 440, 440, 165, 440, 330, 294, 262, 494, 440, 494, 262, 294, 330, 165, 440};
const int pause[17] = {250, 250, 250, 250, 250, 250, 125, 125, 125, 125, 125, 125, 125, 125, 250, 250, 250};
void setup() {
// Инициализация библиотек wiringRP
if(setupWiringRP(WRP_MODE_SUNXI) < 0)
exit(EXIT_FAILURE);
setupPwm();
// Инициализация пользовательских объектов
pwmSetClock(PWM_CLK_DIV_120);
pwmSetMode(PWM_CYCLE_MODE);
pwmSetRange(65535);
}
void loop() {
// Основной цикл программы
for (int j = 0; j < 17; j++) {
pwmToneWrite(frq[j]);
delay(pause[j]);
pwmToneWrite(0);
delay(pause[j]);
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
pwmWrite(0);
// Завершение работы библиотек
releasePwm();
releaseWiringRP();
exit(0); // выход из программы
}
MAIN_WIRINGRP();
Пример использования Servo PWM #
Код формирует импульсы для управления серводвигателем SG90, подключенным к выходу контроллера PWM0 (PL10).
предупреждение
Пример может быть запущен только на 5-ом варианте распиновки GPIO-разъема.
// For servo SG90 (5V)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "wiringRP.h"
#include "pwm.h"
// Глобальные переменные и константы
const int DEG_0 = 110;
const int DEG_180 = 510;
const int PULSE_TIME = 2;
const int STEP_DEG = 1;
const int DECELERATION = 1;
void setup() {
// Инициализация библиотек wiringRP
if(setupWiringRP(WRP_MODE_SUNXI) < 0)
exit(EXIT_FAILURE);
setupPwm();
// Инициализация пользовательских объектов
pwmSetClock(PWM_CLK_DIV_120);
pwmSetMode(PWM_CYCLE_MODE);
pwmSetRange(3999); // 50 Hz
}
void loop() {
// Основной цикл программы
// Поворот вала ротора на 180 градусов по часовой стрелке с максимальной скоростью
for (int i = 0; i <= 180; i += STEP_DEG) {
int val = map(i, 0, 180, DEG_0, DEG_180);
pwmWrite(val);
delay(PULSE_TIME * DECELERATION * STEP_DEG);
}
// Поворот вала ротора на 180 градусов против часовой стрелки с максимальной скоростью
for (int i = 180; i >= 0; i -= STEP_DEG) {
int val = map(i, 0, 180, DEG_0, DEG_180);
pwmWrite(val);
delay(PULSE_TIME * DECELERATION * STEP_DEG);
}
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
pwmWrite(0);
// Завершение работы библиотек
releaseWiringRP();
releasePwm();
exit(0); // выход из программы
}
MAIN_WIRINGRP();