PWM (ШИМ)

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();


61 просмотров0 комментариев

Комментарии (0)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Разделы

Навигация

ВойтиРегистрация