Для вывода данных с Arduino традиционно применяется двоичная система с применением логических значений 0 и 1. С этой задачей превосходно справляется управление портами вывода, имеющееся у большинства микроконтроллеров от производителей микросхем. Но не всегда схемотехнику необходимо значение нуля или единицы.
Возможно ли получить промежуточное значение с помощью Arduino?
С помощью широтно-импульсной модуляции, реализованной на некоторых портах микросхемы, это возможно. Так, Arduino Uno поддерживает ШИМ на следующих своих портах: 3,5,6, 9, 10 и 11.
С помощью PWM (ШИМ) позволяет создать сигнал, который имеет определенное напряжение и продолжительность. В зависимости от временного промежутка между импульсами на выходе выдается нужное значение, так называемый параметр скважности импульса. Если верить Википедии, скважность – это один из классификационных признаков импульсных систем, определяющий отношение его периода следования (повторения) к длительности импульса.
Микроконтроллер Arduino поддерживает восьмибитную ШИМ, что позволяет выбрать переменную в широком диапазоне значений от 0 до 256.
В качестве примера использования ШИМ можно использовать плавное включение и выключение светодиода, подключенному к 3 пину. При этом постепенно подается напряжение от 0 до 5В. Как видно на картинке ниже, при разном значении переменной мы получаем разное напряжение для светодиода: 5V, 2.5V, 1,25V, 3.75V.
Так же с помощью пьезоизлучателя и ШИМ можно воспроизводить звуки неплохого качества.
Пример использования ШИМ для управления яркостью светодиода
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const int Led = 3; // назовем 3 пин для удобства "LedPin" void setup() { pinMode(Led, OUTPUT); // инициализируем наш контакт как выход } void loop() { // создаем цикл, где яркость (brightness) изначально равна 0, и с каждым шагом увеличивается на 1 единицу for (int brightness = 0; brightness < 255; brightness ++) { // записываем значение в переменную analogWrite(Led, brightness); // создаем задержку 5 миллисекунд, для корректной работы delay(5); } // теперь производим уменьшение значения переменной (уменьшаем яркость) for (int brightness = 255; brightness >= 0; brightness --) { analogWrite(Led, brightness); // создаем задержку 5 миллисекунд, для корректной работы delay(5); } } |