ESP32:Примеры/Вывод ШИМ от одного канала на несколько разных GPIO-контактов: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
 
Нет описания правки
 
(не показаны 4 промежуточные версии 2 участников)
Строка 1: Строка 1:
{{ESP32 панель перехода}}
{{ESP32 панель перехода}}
{{Перевод от Сubewriter}}
{{Перевод от Сubewriter}}
{{Myagkij-редактор}}
{{Myagkij-редактор}}
{{Черновик}}


=Вывод ШИМ от одного канала на несколько разных GPIO-контактов=
=Вывод ШИМ от одного канала на несколько разных GPIO-контактов=
Строка 20: Строка 17:
* Далее нужно задать GPIO-контакт или GPIO-контакты, где будет генерироваться [[ШИМ-сигнал]]. Для этого используется следующая функция:
* Далее нужно задать GPIO-контакт или GPIO-контакты, где будет генерироваться [[ШИМ-сигнал]]. Для этого используется следующая функция:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
ledcAttachPin(GPIO, channel)
ledcAttachPin(GPIO, channel)
</syntaxhighlight>
</syntaxhighlight>
Строка 28: Строка 25:
* Наконец, для управления яркостью светодиода при помощи ШИМ-сигнала понадобится следующая функция:
* Наконец, для управления яркостью светодиода при помощи ШИМ-сигнала понадобится следующая функция:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
ledcWrite(channel, dutycycle)
ledcWrite(channel, dutycycle)
</syntaxhighlight>
</syntaxhighlight>
Строка 36: Строка 33:
В начале скетча мы задаем контакты, к которым подключены светодиоды. В нашем случае светодиоды подключены к контактам GPIO16, GPIO17, GPIO5.
В начале скетча мы задаем контакты, к которым подключены светодиоды. В нашем случае светодиоды подключены к контактам GPIO16, GPIO17, GPIO5.


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
const int ledPin = 16;  // «16» соответствует контакту GPIO16
const int ledPin = 16;  // «16» соответствует контакту GPIO16
const int ledPin2 = 17; // «17» соответствует контакту GPIO17
const int ledPin2 = 17; // «17» соответствует контакту GPIO17
Строка 44: Строка 41:
Затем задаем свойства [[ШИМ-сигнала]]: частота – 5000 Гц, канал для генерирования сигнала – 0, разрешение – 8 бит. Если хотите, можете поэкспериментировать с этими свойствами, чтобы получить какие-нибудь другие [[ШИМ-сигнал]]ы.
Затем задаем свойства [[ШИМ-сигнала]]: частота – 5000 Гц, канал для генерирования сигнала – 0, разрешение – 8 бит. Если хотите, можете поэкспериментировать с этими свойствами, чтобы получить какие-нибудь другие [[ШИМ-сигнал]]ы.


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
// задаем свойства ШИМ-сигнала:
// задаем свойства ШИМ-сигнала:
const int freq = 5000;
const int freq = 5000;
Строка 53: Строка 50:
В блоке setup() настраиваем [[ШИМ-сигнал]] при помощи свойств, заданных выше. Делаем это при помощи функции ledcSetup(), параметрами для которой служат канал для генерирования [[ШИМ]], частота и разрешение:
В блоке setup() настраиваем [[ШИМ-сигнал]] при помощи свойств, заданных выше. Делаем это при помощи функции ledcSetup(), параметрами для которой служат канал для генерирования [[ШИМ]], частота и разрешение:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
ledcSetup(ledChannel, freq, resolution);
ledcSetup(ledChannel, freq, resolution);
</syntaxhighlight>
</syntaxhighlight>
Строка 59: Строка 56:
Далее нам нужно задать контакты, на который будет выведен [[ШИМ-сигнал]]. Делаем это при помощи функции ledcAttachPin(), которая принимает в качестве параметров GPIO-контакт, на который нужно вывести [[ШИМ-сигнал]], и канал, который будет его генерировать. В нашем случае GPIO-контактами для вывода [[ШИМ]] будет «ledPin» (т.е. контакт GPIO16),«ledPin2» (т.е. контакт GPIO17),«ledPin3» (т.е. контакт GPIO5), а каналом, генерирующим [[ШИМ-сигнал]] – «ledChannel» (т.е. канал 0):
Далее нам нужно задать контакты, на который будет выведен [[ШИМ-сигнал]]. Делаем это при помощи функции ledcAttachPin(), которая принимает в качестве параметров GPIO-контакт, на который нужно вывести [[ШИМ-сигнал]], и канал, который будет его генерировать. В нашем случае GPIO-контактами для вывода [[ШИМ]] будет «ledPin» (т.е. контакт GPIO16),«ledPin2» (т.е. контакт GPIO17),«ledPin3» (т.е. контакт GPIO5), а каналом, генерирующим [[ШИМ-сигнал]] – «ledChannel» (т.е. канал 0):


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
Строка 69: Строка 66:
В блоке loop() мы сначала меняем коэффициент заполнения с «0» до «255», тем самым увеличивая яркость [[светодиод]]ов.
В блоке loop() мы сначала меняем коэффициент заполнения с «0» до «255», тем самым увеличивая яркость [[светодиод]]ов.


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
// увеличиваем яркость светодиода:
// увеличиваем яркость светодиода:
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
Строка 80: Строка 77:
Затем уменьшаем коэффициент заполнения с «255» до «0», уменьшая яркость [[светодиод]]ов.
Затем уменьшаем коэффициент заполнения с «255» до «0», уменьшая яркость [[светодиод]]ов.


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
// уменьшаем яркость светодиода:
// уменьшаем яркость светодиода:
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
Строка 91: Строка 88:
Чтобы задать яркость [[светодиод]]ов, нам нужна лишь функция ledcWrite(), параметрами в которой служат канал, генерирующий [[ШИМ]], и коэффициент заполнения [[ШИМ-сигнал]]а.
Чтобы задать яркость [[светодиод]]ов, нам нужна лишь функция ledcWrite(), параметрами в которой служат канал, генерирующий [[ШИМ]], и коэффициент заполнения [[ШИМ-сигнал]]а.


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
ledcWrite(ledChannel, dutyCycle);
ledcWrite(ledChannel, dutyCycle);
</syntaxhighlight>
</syntaxhighlight>
Строка 111: Строка 108:
==Схема==
==Схема==


{{Спойлер|На данной схеме используется плата [[ESP32S-HiLetgo]], если вы используете другую, сверьтесь с вашей распиновкой.}}
{{Примечание1|На данной схеме используется плата [[ESP32S-HiLetgo]], если вы используете другую, сверьтесь с вашей распиновкой.}}


[[File:esp32_pwm_leds_exm_1.png|center]]
[[File:esp32_pwm_leds_exm_1.png|center]]
Строка 117: Строка 114:
==Код==
==Код==


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
// номера контактов для светодиодов:
// номера контактов для светодиодов:
const int ledPin = 16;  // «16» соответствует контакту GPIO16
const int ledPin = 16;  // «16» соответствует контакту GPIO16
Строка 160: Строка 157:


<references />
<references />
{{Навигационная таблица/Портал/ESP32}}


[[Категория:ESP32]]
[[Категория:ESP32]]

Текущая версия от 09:18, 18 июня 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Вывод ШИМ от одного канала на несколько разных GPIO-контактов

На этом примере мы научимся менять яркость нескольких светодиодов при помощи ШИМ-контроллера платы ESP32, программируемого с помощью IDE Arduino.

Функционал ESP32 позволяет использовать один канал для вывода сгенерированного ШИМ-сигнала на несколько разных GPIO-контактов. Для этого вам нужно лишь привязать все эти GPIO-контакты к одному и тому же ШИМ-каналу в блоке setup().

ШИМ-контроллер ESP32 оснащен 16 независимыми каналами, которые можно настроить на генерирование ШИМ-сигналов с различными свойствами.

Чтобы поменять яркость светодиода при помощи ШИМ и IDE Arduino, нужно сделать следующее:

  • Выберите ШИМ-канал. Всего их 16 (с номерами от «0» до «15»)
  • Задайте частоту ШИМ-сигнала. Для светодиода подойдут 5000 Гц
  • Вам также нужно будет задать разрешение ШИМ-сигнала: оно может варьироваться между 1 и 16 битами. Мы воспользуемся 8-битным разрешением, т.е. управление яркостью светодиода будет осуществляться при помощи значений между «0» и «255»
  • Далее нужно задать GPIO-контакт или GPIO-контакты, где будет генерироваться ШИМ-сигнал. Для этого используется следующая функция:
ledcAttachPin(GPIO, channel)

Эта функция использует два параметра: «GPIO» – это контакт, на который будет выведен ШИМ-сигнал, а «channel» – это канал, который будет генерировать ШИМ-сигнал.

  • Наконец, для управления яркостью светодиода при помощи ШИМ-сигнала понадобится следующая функция:
ledcWrite(channel, dutycycle)

У нее два параметра: «channel» – канал, генерирующий ШИМ-сигнал, и «dutycycle» – коэффициент заполнения ШИМ-сигнала.

В начале скетча мы задаем контакты, к которым подключены светодиоды. В нашем случае светодиоды подключены к контактам GPIO16, GPIO17, GPIO5.

const int ledPin = 16;  // «16» соответствует контакту GPIO16
const int ledPin2 = 17; // «17» соответствует контакту GPIO17
const int ledPin3 = 5;  // «5» соответствует контакту GPIO5

Затем задаем свойства ШИМ-сигнала: частота – 5000 Гц, канал для генерирования сигнала – 0, разрешение – 8 бит. Если хотите, можете поэкспериментировать с этими свойствами, чтобы получить какие-нибудь другие ШИМ-сигналы.

// задаем свойства ШИМ-сигнала:
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;

В блоке setup() настраиваем ШИМ-сигнал при помощи свойств, заданных выше. Делаем это при помощи функции ledcSetup(), параметрами для которой служат канал для генерирования ШИМ, частота и разрешение:

ledcSetup(ledChannel, freq, resolution);

Далее нам нужно задать контакты, на который будет выведен ШИМ-сигнал. Делаем это при помощи функции ledcAttachPin(), которая принимает в качестве параметров GPIO-контакт, на который нужно вывести ШИМ-сигнал, и канал, который будет его генерировать. В нашем случае GPIO-контактами для вывода ШИМ будет «ledPin» (т.е. контакт GPIO16),«ledPin2» (т.е. контакт GPIO17),«ledPin3» (т.е. контакт GPIO5), а каналом, генерирующим ШИМ-сигнал – «ledChannel» (т.е. канал 0):

ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);

Это значит, что на этих контактах будет выводиться один и тот же ШИМ-сигнал, сгенерированный ШИМ-каналом 0.

В блоке loop() мы сначала меняем коэффициент заполнения с «0» до «255», тем самым увеличивая яркость светодиодов.

// увеличиваем яркость светодиода:
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
 // меняем яркость светодиода при помощи ШИМ:
 ledcWrite(ledChannel, dutyCycle);
 delay(15);
}

Затем уменьшаем коэффициент заполнения с «255» до «0», уменьшая яркость светодиодов.

// уменьшаем яркость светодиода:
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
 // меняем яркость светодиода при помощи ШИМ:
 ledcWrite(ledChannel, dutyCycle);
 delay(15);
}

Чтобы задать яркость светодиодов, нам нужна лишь функция ledcWrite(), параметрами в которой служат канал, генерирующий ШИМ, и коэффициент заполнения ШИМ-сигнала.

ledcWrite(ledChannel, dutyCycle);

Поскольку мы используем 8-битное разрешение, коэффициент заполнения ШИМ-сигнала будет варьироваться между «0» и «255». Обратите внимание, что в функции ledcWrite() первым параметром является канал, генерирующий ШИМ, а не GPIO-контакт.

Загрузите код на ESP32. Убедитесь, что в IDE Arduino выбраны правильная плата и COM-порт.

Взгляните на цепь. Все три GPIO-контакта выводят один и тот же ШИМ-сигнал, поэтому яркость всех трех светодиодов будет синхронно уменьшаться и увеличиваться.

Необходимое оборудование

Схема

Примечание

На данной схеме используется плата ESP32S-HiLetgo, если вы используете другую, сверьтесь с вашей распиновкой.

Код

// номера контактов для светодиодов:
const int ledPin = 16;  // «16» соответствует контакту GPIO16
const int ledPin2 = 17; // «17» соответствует контакту GPIO17
const int ledPin3 = 5;  // «5» соответствует контакту GPIO5

// задаем свойства ШИМ-сигнала:
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
 
void setup(){
  // настраиваем ШИМ-сигнал согласно свойствам, заданным выше:
  ledcSetup(ledChannel, freq, resolution);
  
  // привязываем канал к трем GPIO-контактам:
  ledcAttachPin(ledPin, ledChannel);
  ledcAttachPin(ledPin2, ledChannel);
  ledcAttachPin(ledPin3, ledChannel);
}
 
void loop(){
  // увеличиваем яркость светодиода:
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // меняем яркость светодиода при помощи ШИМ:
    ledcWrite(ledChannel, dutyCycle);
    delay(15);
  }

  // уменьшаем яркость светодиода:
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // меняем яркость светодиода при помощи ШИМ:
    ledcWrite(ledChannel, dutyCycle);   
    delay(15);
  }
}

См.также

Внешние ссылки