Припаяйте небольшие крепежные элементы 2×1. В качестве альтернативы можно также использовать винтовые клеммы. Опять же, оставьте пространство между разъемами и транзисторами.
Использование широтно-импульсной модуляции (ШИМ) в Arduino
В этой статье мы рассмотрим принципы широтно-импульсной модуляции (ШИМ) в плате Arduino на основе схемы для управления свечением светодиода.
Принципы работы широтно-импульсной модуляции (ШИМ)
Рассмотрим схему, показанную на рисунке ниже. Как мы увидим, управляя рабочим циклом конфигурации ШИМ, можно регулировать мигание светодиода.
Когда выключатель выключен на определенное время, как показано на рисунке, лампа будет гореть в течение такого же периода времени. Если выключатель замкнут на 8 мс и разомкнут на 2 мс с интервалом 10 мс, лампа будет гореть только в течение 8 мс. В примере выше мы можем сказать, что среднее выходное напряжение (на лампе) будет составлять 80% от напряжения батареи.
В другом случае выключатель замыкается на 5 мс и размыкается на те же 5 мс с интервалом в 10 мс, так что среднее напряжение на лампе составляет 50% от напряжения батареи. Если напряжение батареи составляет 5 В, а рабочий цикл — 50 %, среднее напряжение на клемме (лампе) составляет 2,5 В.
В третьем показанном случае рабочий цикл составляет 20%, поэтому среднее напряжение на лампе составляет 20% от напряжения батареи.
Работа ШИМ наглядно показана на следующих рисунках.
Давайте рассмотрим возможности ШИМ на плате Arduino.
Как показано на рисунке, плата Arduino UNO имеет 6 каналов ШИМ (широтно-импульсной модуляции). Мы можем использовать ШИМ на любом из этих 6 выводов. В этом проекте мы будем использовать вывод 3 (PIN3).
Функция ШИМ в практическом проекте также достаточно наглядно показана в следующей статье — Arduino Uno вентилятор с контролем температуры.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Конденсатор 100 мкФ (купить на AliExpress).
- Резистор 10 кОм (2 шт.) (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Кнопка (2 шт.).
- Источник питания с напряжение 5 В.
Принципиальную схему устройства можно увидеть на следующем рисунке.
Схема собрана на макетной плате. Хотя почти все кнопки имеют эффект «отскока контакта», в данном случае нам не стоит об этом беспокоиться — он нам не нужен.
Управление конфигурацией ШИМ на плате Arduino очень простое, в отличие, например, от использования ШИМ на микроконтроллерах ATMEGA, где для этой задачи необходимо конфигурировать различные регистры и выполнять различные другие настройки — на Arduino всего этого делать не нужно.
По умолчанию все необходимые заголовочные файлы и все регистры, необходимые для функции ШИМ, были настроены программой ARDUINO IDE, нам остается только вызвать соответствующую функцию, указав в качестве параметра номер вывода, на котором должен быть установлен сигнал ШИМ.
То есть, чтобы сгенерировать сигнал ШИМ на соответствующем пине платы Arduino, нам нужно сделать две вещи:
1. pinMode(ledPin, OUTPUT) 2. analogWrite(pin, value).
Сначала нам нужно выбрать номер вывода для ШИМ из шести возможных выводов, которые Arduino имеет для этой цели, а затем настроить этот вывод для вывода данных.
После этого мы должны сгенерировать ШИМ-сигнал на определенном пине Arduino с помощью функции «analogWrite(pin, value)». Здесь переменная «pin» обозначает номер вывода, на котором генерируется ШИМ-сигнал, в нашем случае это вывод 3. А переменная value задает желаемый рабочий цикл ШИМ; он может принимать значения от 0 (сигнал всегда выключен) до 255 (сигнал всегда включен). Кнопки на рисунке увеличивают и уменьшают значение этой переменной.
1 Общие сведения о широтно-импульсной модуляции
Цифровые контакты Arduino могут выводить только два значения: логический 0 (LOW, низкий уровень) и логическую 1 (HIGH, высокий уровень). Именно поэтому они являются цифровыми. Но есть «специальные» контакты Arduino, контакты PWM, которые иногда обозначаются волнистой линией «~» PWM означает широтно-импульсную модуляцию или ШИМ.
Широтно-импульсный модулированный сигнал — это импульсный сигнал с постоянной частотой, но переменным рабочим циклом (отношение ширины импульса к периоду его повторения). Поскольку большинство физических процессов в природе обладают инерцией, резкие изменения напряжения от 1 до 0 сглаживаются путем взятия среднего значения. Среднее напряжение на выходе ШИМ можно изменить, регулируя рабочий цикл.
Если рабочий цикл равен 100%, то на цифровом выходе Arduino будет постоянно присутствовать логическая «1» или 5 вольт. Если установить рабочий цикл на 50%, на выходе будет логическая «1» половину времени и логический «0» половину времени, а среднее напряжение составит 2,5 вольта. И так далее.
Программа задает рабочий цикл не в процентах, а в виде числа от 0 до 255. Например, команда analogWrite(10, 64) предписывает микроконтроллеру подать сигнал на цифровой ШИМ-выход #10 с рабочим циклом 25 %.
Импульсно-модулированные выходы Arduino работают на частоте около 500 Гц. Это означает, что время повторения импульса составляет около 2 миллисекунд, что обозначено зелеными вертикальными линиями на рисунке. Оказывается, мы можем имитировать аналоговый сигнал на цифровом выходе! Интересно, не правда ли!
Как же мы можем использовать ШИМ? Существует множество вариантов применения! Например, управлять яркостью светодиода, скоростью вращения двигателя, током транзистора, звуком пьезоизлучателя и т.д. ……
3 Пример скетча с ШИМ
Давайте откроем пример эскиза «Fade».
Давайте немного изменим его и загрузим в память Arduino.
int ledPin = 3; // объявляем пин, управляющий светодиодом int brightness = 0; // переменная для задания яркости int fadeAmount = 5; // шаг изменения яркости void setup() pinMode(ledPin, OUTPUT);>void loop() analogWrite(ledPin, brightness); // устанавливаем яркость на ledPin brightness += fadeAmount; // изменяем значение яркости /* когда яркость достигает 0 или 255, изменяем направление изменения яркости */ if (brightness == 0 || brightness == 255)delay(30); // задержка для большей видимости эффекта>
4 Управление яркостью светодиода с помощью PWM и Arduino
Включите питание. Яркость светодиода медленно увеличивается, а затем снова уменьшается. Имитация аналогового сигнала на цифровом выходе с помощью широтно-импульсной модуляции.
В прилагаемом видеоролике на дисплее осциллографа DSO138 хорошо видно, как меняется яркость светодиода и как меняется сигнал от Arduino.
Текст программы
int led = 9; // вывод ШИМ, к которому подключен светодиод int brightness = 0; // насколько ярким будет светодиод int fadeAmount = 5; // на сколько единиц потускнеет светодиод // процедура настройки выполняется один раз при нажатии кнопки reset: void setup()/ declare pin 9 to be an output: pinMode(led, OUTPUT);>// процедура цикла запускается снова и снова: void loop()/ set the brightness of pin 9: analogWrite(led, brightness); // change the brightness for next time through the loop: brightness = brightness + fadeAmount; // reverse the direction of the fading at the ends of the fade: if (brightness = 255)// wait for 30 milliseconds to see the dimming effect delay(30);>
Текст программы должен быть понятен сейчас, чуть позже мы его изменим и детализируем. В данный момент нас интересует только функция analogWrite(), которая устанавливает вывод 9 на 5 вольт, но особым образом.
Скважность
Причиной этого является взаимосвязь между периодом повторения импульсов и их длительностью. Чтобы лучше понять это, давайте рассмотрим диаграммы.
ШИМ — это изменение рабочего цикла последовательности квадратных импульсов. Коэффициент можно рассматривать как процент времени, в течение которого квадратная волна имеет ВЫСОКИЙ уровень, деленный на общее время повторения. Рабочий цикл 50% означает, что половина периода — высокий уровень, а половина — низкий.
Функция analogWrite() определяет рабочий цикл последовательности квадратных волн в соответствии с переданным ей значением.
Диаграммы показывают, что для сигнала с рабочим циклом 25 % одна четверть периода является ВЫСОКОЙ, а остальные 75 % времени — НИЗКОЙ. Частота прямоугольной последовательности импульсов составляет около 490 Гц в случае Arduino. Другими словами, уровень сигнала изменяется от высокого (5 В) до низкого (0 В) примерно 490 раз в секунду.
Как вы можете видеть, напряжение, подаваемое на светодиод, на самом деле не уменьшается. Почему же яркость светодиода уменьшается при уменьшении рабочего цикла? Это связано с особенностью нашего зрения. Когда светодиод включается и выключается раз в 1 мс (при рабочем цикле 50%), вы видите около 50% от его максимальной яркости, потому что он включается и выключается быстрее, чем ваши глаза могут зарегистрировать. Ваш мозг усредняет сигнал, и у вас создается впечатление, что светодиод работает на половинной яркости.
Теперь давайте изменим программу и создадим более интересную схему.
Мы подключаем все 4 светодиода с помощью резисторов к портам шины Arduino. Мы подключаем катоды всех диодов к общей земле. Мы используем контакты 3, 6, 9 и 11.
Давайте объявим массив светодиодов, счетчик и определим контакты к выводам.
int brightness = 0; int fadeAmount = 5; int leds =; int j=0; int delta=1; void setup()
Для выключения и включения светодиодов мы напишем собственную функцию. Он введет количество светодиодов в массиве, включит их и снова выключит.
void fade(int i)= 0; brightness-=fadeAmount)>
А в цикле main() мы вызываем функцию и передаем номера массива по порядку. В конце мы изменяем переменную delta так, чтобы цикл выполнялся в обратном направлении.
Полный текст программы
int brightness = 0; int fadeAmount = 5; int leds =; int j=0; int delta=1; void setup()void fade(int i)= 0; brightness-=fadeAmount)>void loop()= 3)>>
Мы рассмотрели понятия ШИМ и рабочего цикла, использовали новую функцию analogWrite() и написали собственную функцию, которая равномерно включает и выключает светодиод. В следующий раз мы рассмотрим, как считывать аналоговый сигнал.