ESP32:Примеры/Вывод ШИМ от одного канала на несколько разных GPIO-контактов: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Myagkij (обсуждение | вклад) Нет описания правки |
||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 1: | Строка 1: | ||
{{ESP32 панель перехода}} | {{ESP32 панель перехода}} | ||
{{Перевод от Сubewriter}} | {{Перевод от Сubewriter}} | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Вывод ШИМ от одного канала на несколько разных GPIO-контактов= | =Вывод ШИМ от одного канала на несколько разных GPIO-контактов= | ||
Строка 20: | Строка 17: | ||
* Далее нужно задать GPIO-контакт или GPIO-контакты, где будет генерироваться [[ШИМ-сигнал]]. Для этого используется следующая функция: | * Далее нужно задать GPIO-контакт или GPIO-контакты, где будет генерироваться [[ШИМ-сигнал]]. Для этого используется следующая функция: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
ledcAttachPin(GPIO, channel) | ledcAttachPin(GPIO, channel) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 28: | Строка 25: | ||
* Наконец, для управления яркостью светодиода при помощи ШИМ-сигнала понадобится следующая функция: | * Наконец, для управления яркостью светодиода при помощи ШИМ-сигнала понадобится следующая функция: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
ledcWrite(channel, dutycycle) | ledcWrite(channel, dutycycle) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 36: | Строка 33: | ||
В начале скетча мы задаем контакты, к которым подключены светодиоды. В нашем случае светодиоды подключены к контактам GPIO16, GPIO17, GPIO5. | В начале скетча мы задаем контакты, к которым подключены светодиоды. В нашем случае светодиоды подключены к контактам GPIO16, GPIO17, GPIO5. | ||
<syntaxhighlight lang="c | <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 | <syntaxhighlight lang="c"> | ||
// задаем свойства ШИМ-сигнала: | // задаем свойства ШИМ-сигнала: | ||
const int freq = 5000; | const int freq = 5000; | ||
Строка 53: | Строка 50: | ||
В блоке setup() настраиваем [[ШИМ-сигнал]] при помощи свойств, заданных выше. Делаем это при помощи функции ledcSetup(), параметрами для которой служат канал для генерирования [[ШИМ]], частота и разрешение: | В блоке setup() настраиваем [[ШИМ-сигнал]] при помощи свойств, заданных выше. Делаем это при помощи функции ledcSetup(), параметрами для которой служат канал для генерирования [[ШИМ]], частота и разрешение: | ||
<syntaxhighlight lang="c | <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 | <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 | <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 | <syntaxhighlight lang="c"> | ||
// уменьшаем яркость светодиода: | // уменьшаем яркость светодиода: | ||
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){ | for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){ | ||
Строка 91: | Строка 88: | ||
Чтобы задать яркость [[светодиод]]ов, нам нужна лишь функция ledcWrite(), параметрами в которой служат канал, генерирующий [[ШИМ]], и коэффициент заполнения [[ШИМ-сигнал]]а. | Чтобы задать яркость [[светодиод]]ов, нам нужна лишь функция ledcWrite(), параметрами в которой служат канал, генерирующий [[ШИМ]], и коэффициент заполнения [[ШИМ-сигнал]]а. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
ledcWrite(ledChannel, dutyCycle); | ledcWrite(ledChannel, dutyCycle); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 117: | Строка 114: | ||
==Код== | ==Код== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
// номера контактов для светодиодов: | // номера контактов для светодиодов: | ||
const int ledPin = 16; // «16» соответствует контакту GPIO16 | const int ledPin = 16; // «16» соответствует контакту GPIO16 | ||
Строка 156: | Строка 153: | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 163: | Строка 158: | ||
<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-контакта выводят один и тот же ШИМ-сигнал, поэтому яркость всех трех светодиодов будет синхронно уменьшаться и увеличиваться.
Необходимое оборудование
- Плата ESP32 - 1шт.;
- Резистор 330 Ом - 3шт.;
- Светодиод - 3шт.;
- Провода-перемычки;
- Макетная плата - 1шт;
Схема
Код
// номера контактов для светодиодов:
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);
}
}
См.также
Внешние ссылки