![]() |
![]() |
![]() |
![]() |
Общие сведения
В этом уроке мы разберёмся что такое ШИМ.
Каждый вывод Raspberry Pi Pico в режиме OUTPUT может
принимать значение логического нуля или логической единицы. Полного
напряжения питания (+3.3 вольта относительно GND) или отсутствие этого
напряжения (ноль вольт относительно GND). Соответственно мы можем зажечь
светодиод или выключить светодиод, если он подключён к выводу Pi Pico.
Но что если нам надо получить среднюю яркость светодиода? У данной
проблемы есть не один способ решения (источник постоянного тока, ЦАП),
но мы рассмотрим самый простой - ШИМ.
ШИМ - Широтно-Импульсная Модуляция.
Для управления яркостью светодиода мы можем включать и выключать его так быстро, что для человеческого глаза это будет выглядеть как изменение яркости. По своей сути быстрое включение и выключение (изменение логического уровня вывода) и есть ШИМ, но помимо изменения уровня у ШИМ есть ещё два важных параметра:
- Частота импульса (frequency) - как быстро мы переключаем уровни
- Широта импульса (duty) - процентное отношение уровней (в каком состоянии вывод проводит большую часть времени)
Собственно при помощи широты импульса мы и будем менять яркость светодиода. Широта импульса в Ардуино задаётся следующим образом:
analogWrite(ВЫВОД, ЧИСЛО_БЕЗ_ЗНАКА )
ЧИСЛО_БЕЗ_ЗНАКА - может быть как восьмибитное, так и
шестнадцатибитное. Битность числа задаётся функцией
alalogWriteResolution(). По умолчанию в Arduino ШИМ
задаётся восьмибитным числом, это значит что числа должны быть в
диапазоне от 0 до 255.
Если задать широту числом 255 - это будет всё равно что отключить ШИМ и подать логическую единицу на вывод, светодиод будет гореть с максимальной яркостью. Ноль, соответственно, выключит светодиод.
Для этого урока нам понадобится:
Подключение
Подключим Trema-модуль Светодиод согласно таблице
| Вывод модуля | Вывод Pi Pico |
|---|---|
| Vcc | 3V3(OUT) |
| GND | GND |
| S | GP15 |
Подключим Trema-модуль Кнопку согласно таблице
| Вывод модуля | Вывод Pi Pico |
|---|---|
| Vcc | 3V3(OUT) |
| GND | GND |
| S | GP2 |

Управляем яркостью
// определяем вывод к которому подключен светодиод
#define LED_PIN 15
void setup()
{
// устанавливаем режим работы вывода
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
// яркость светодиода на ноль
analogWrite(LED_PIN, 0);
delay(500);
// яркость светодиода на 25%
analogWrite(LED_PIN, 64);
delay(500);
// яркость светодиода на 50%
analogWrite(LED_PIN, 127);
delay(500);
// яркость светодиода на 100%
analogWrite(LED_PIN, 255);
delay(500);
}
Диммер
При нажатии и удержании кнопки светодиод начнёт менять свою яркость. Если отпустить кнопку и зажать снова - направление изменения яркости поменяется (нажали и удерживаем первый раз - светодиод становится ярче, отпустили и нажали снова - светодиод начинает гаснуть).
// определяем вывод к которому подключена кнопка
#define BUT_PIN 2
// определяем вывод к которому подключён светодиод
#define LED_PIN 15
// направление изменения яркости
bool direction = false;
// предыдущее состояние кнопки
bool last_state = false;
// широта импульса
uint8_t duty = 0;
// смена яркости светодиода
void fadeLED()
{
// увеличиваем яркость (приращение широты импульса)
if (direction && duty < 255) {
duty++;
}
// уменьшаем яркость
else if (duty > 0) {
duty--;
}
// устанавливаем широту импульса на выводе светодиода
analogWrite(LED_PIN, duty);
}
void setup()
{
// Устанавливаем работу вывода светодиода
pinMode(LED_PIN, OUTPUT);
// Устанавливаем работу вывода кнопки
pinMode(BUT_PIN, INPUT);
}
void loop()
{
// сохраняем состояние кнопки
bool button_state = digitalRead(BUT_PIN);
// если состояние отличается от предыдущего
if (button_state != last_state) {
// записываем новое состояние
last_state = button_state;
// если состояние - кнопка была нажата
if (button_state) {
// меняем направление изменения яркости
direction = !direction;
}
}
// если кнопка зажата - меняем яркость
if (button_state) {
fadeLED();
}
delay(20);
}





Обсуждение