К СВЕДЕНИЮ
Выход 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();