ESP32:Примеры/Изменение яркости светодиода при помощи ШИМ
Изменение яркости светодиода при помощи ШИМ
На этом примере мы научимся менять яркость светодиода при помощи ШИМ-контроллера платы ESP32, программируемого с помощью IDE Arduino.
ШИМ-контроллер 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.
const int ledPin = 16; // значение «16» соответствует контакту GPIO16
Затем задаем свойства ШИМ-сигнала: частота – 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), а каналом, генерирующим ШИМ-сигнал – «ledChannel» (т.е. канал 0):
ledcAttachPin(ledPin, ledChannel);
В блоке 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-порт.
Взгляните на цепь. Яркость светодиода должна то увеличиваться, то уменьшаться.
Необходимое оборудование
- Плата ESP32 - 1шт.;
- Резистор 330 Ом - 1шт.;
- Светодиод - 1шт.;
- Провода-перемычки;
- Макетная плата - 1шт;
Схема
Светодиод через резистор соединен с GPIO16.
Код
// номер контакта для светодиода:
const int ledPin = 16; // значение «16» соответствует контакту GPIO16
// задаем свойства ШИМ-сигнала:
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// настраиваем ШИМ-сигнал, используя свойства выше:
ledcSetup(ledChannel, freq, resolution);
// привязываем канал к GPIO-контакту, которым будем управлять:
ledcAttachPin(ledPin, 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);
}
}
См.также
Внешние ссылки