Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

ESP32: PWM

Микроконтроллеры ESP32 не поддерживают стандартную функцию Arduino analogWrite() для управления широтно-импульсной модуляции (ШИМ). Вместо неё предусмотрены другие функции, которые мы рассмотрим.

  • ledcSetup(channel, freq, resolution_bits) - настройки, указываются канал, частота и разрешение
  • ledcAttachPin(GPIO, channel) - указываются порт и канал
  • ledcWrite(channel, dutycycle) - указываются канал и коэффициент заполнения ШИМ-сигнала

Плата поддерживает независимых 16 каналов (от 0 до 15), которые можно настроить на генерирование ШИМ-сигналов с различными свойствами. Вам нужно выбрать любой из них. Затем следует выбрать частоту ШИМ-сигнала, для светодиодов подойдут значения 5000Гц, 10 000Гц. Ещё один важный параметр - разрешение от 1 до 16 бит, для значений от 0 до 256 требуется 8-битное разрешение. Когда определились со всеми параметрами, осталось выбрать номер вывода.

Примеры использования показаны в статьях.

RGB-модуль

M5Stack. PWM. Изменяем яркость светодиода

Подключаем несколько светодиодов


// номера портов для светодиодов
const int ledPin1 = 16;
const int ledPin2 = 17;
const int ledPin3 = 5;

// задаём свойства ШИМ-сигнала
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
 
void setup(){
  ledcSetup(ledChannel, freq, resolution);
  
  // привязываем канал к портам светодиодов
  ledcAttachPin(ledPin1, 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);
  }
}

Дополнительные материалы

Реклама