-
ЗНАКОМСТВО С TINKERCAD 2
-
Лекция1.1
-
Лекция1.2
-
-
ОСНОВЫ ЭЛЕКТРОНИКИ 10
-
Лекция2.1
-
Лекция2.2
-
Лекция2.3
-
Лекция2.4
-
Лекция2.5
-
Лекция2.6
-
Лекция2.7
-
Лекция2.8
-
Лекция2.9
-
Викторина2.1
-
-
ЗНАКОМСТВО С ARDUINO 7
-
Лекция3.1
-
Лекция3.2
-
Лекция3.3
-
Лекция3.4
-
Лекция3.5
-
Лекция3.6
-
Викторина3.1
-
Аналоговые и цифровые сигналы
Не секрет, что все величины в физическом мире носят аналоговый характер. Слишком мощная лампочка может быть подключена к схеме, где, вращая ручку, мы плавно изменяем яркость. В электроплите на кухне, можно плавно настраивать температуру между 50 и 300⁰С. Для представления физических величин, непрерывно изменяющихся во времени, используют аналоговые сигналы.
В микроэлектронике же, помимо аналоговых сигналов, используют также цифровые сигналы. Ключевое отличие цифрового сигнала от аналогового – это наличие только дискретных значений (ограниченный набор значений, например 0 и 1). Цифровые сигналы являются искусственными.
Дискретность (от лат. discretus – разделенный, прерывистый) – свойство, противопоставляемое непрерывности.
Для измерения аналоговых величин люди придумали немало различных приборов. Так, например, термометр позволяет измерить температуру вещества, весы – узнать вес тела. Все эти устройства имеют шкалу, которую мы используем для фиксации их показаний. Рассмотрим процесс измерения температуры (уровня аналогового сигнала) с помощью градусника. Мы смотрим, к какому из делений ближе всего приблизился уровень жидкости в градуснике. Это значение и будет измеренной температурой. Фактически мы с вами произвели преобразование аналоговой физической величины в дискретную, которую можно представить в виде ограниченного набора чисел (шкалы показаний градусника).
Для автоматизации подобных процессов на сегодняшний день существует устройство АЦП(аналого-цифровой преобразователь), которое преобразует аналоговый сигнал в цифровой, понятный микроконтроллеру.
Существует также и устройство с обратной функцией – ЦАП (цифро-аналоговый преобразователь), переводящее цифровой сигнал в аналоговый. Например, во время прослушивания музыки на компьютере фактически происходит преобразование цифрового сигнала (файл .mp3) в аналоговый (звук).
Используя ЦАП, можно научить микроконтроллер генерировать различный уровень напряжения в цифровом виде. Это позволит, к примеру, зажечь светодиод на половину яркости или запустить двигатель не на полную мощность. Однако можно использовать и другой способ генерации сигнала с нужным уровнем напряжения – режим широтно-импульсной модуляции (ШИМ).
ШИМ – это операция получения изменяющегося аналогового значения посредством цифровых устройств. Устройства используются для получения прямоугольных импульсов – сигнала, который постоянно переключается между максимальным и минимальным значениями.
Длительность включения максимального значения называется шириной импульса. Для получения различных аналоговых величин изменяется ширина импульса.
К примеру, если подавать на светодиод сигнал в виде последовательности импульсов с частотой 100 кГц, то можно рассматривать следующие ситуации:
График ШИМ | Уровень напряжения (В) | Яркость светодиода (%) |
0 | 0 | |
≈1.25 | 25 | |
≈2.5 | 50 | |
5 | 100 |
Для вывода аналогового сигнала применяют специальную команду: analogWrite.
Функция имеет следующий вид:
analogWrite(пин, уровень сигнала)
В качестве пина можно использовать любой контакт контроллера, поддерживающий ШИМ: 3, 5, 6, 9, 10, 11.
Уровень сигнала задается числом от 0 до 255 и соответствует ширине сигнала в ШИМ (255=100%).
Пример. Плавное увеличение яркости светодиода
В качестве примера, создадим устройство, позволяющее плавно увеличивать яркость светодиода каждую секунду на 25%. Для этого:
- Зайдите в свое рабочее пространство TinkerCad.
- Создайте новое электронное устройство.
- На рабочее поле добавьте плату Arduino UNO, светодиод и резистор. С помощью проводников создайте замкнутую электрическую цепь.
- Перейдите в режим написания программы в виде текстового кода и создайте следующую программу:
Исходный код | Комментарии |
int redPin=6; | Установить ножку светодиода в пин 6 |
void setup() { | |
pinMode(redPin, OUTPUT); | Настраиваем пин 6 в режим вывода |
} | |
void loop(){ | |
analogWrite(redPin, 0); | Выдаем на светодиод число 0, что соответствует 0% яркости светодиода |
delay(1000); | Пауза в 1 секунду |
analogWrite(redPin, 64); | Выдаем на светодиод число 64, что соответствует 25% яркости светодиода |
delay(1000); | Пауза в 1 секунду |
analogWrite(redPin, 128); | Выдаем на светодиод 50% яркости |
delay(1000); | Пауза в 1 секунду |
analogWrite(redPin, 192); | Выдаем на светодиод 75% яркости |
delay(1000); | Пауза в 1 секунду |
analogWrite(redPin, 255); | Выдаем на светодиод 100% яркости |
delay(1000); | Пауза в 1 секунду |
} |
- Запустив симуляцию, мы сможем убедиться в правильности нашего кода.
Поскольку в программе повторяются действия (5 раз светодиод меняет яркость), то используем оператор цикла.
for (инициализация; проверка условия; изменение) { Тело цикла } |
Инициализация используется для присвоения начального значения счетчику цикла. Проверка условия обычно содержит условное выражение. Оно позволяет определить момент завершения цикла. Изменение или приращение аргумента обычно используется для изменения счетчика цикла. Все параметры оператора цикла отделяются друг от друга точкой с запятой.
Тело цикла выполняется, если условие (условное выражение) истинно. Как только условие принимает значение «ложь», реализуется выход из цикла и начинает выполняться оператор, следующий за оператором цикла.
Перепишем теперь код для плавного изменения яркости светодиода с применением оператора цикла:
Исходный код | Комментарии |
int redPin=6; | Установить ножку светодиода в пин 6 |
void setup() { | |
pinMode(redPin, OUTPUT); | Настраиваем пин 6 в режим вывода |
} | |
void loop(){ | |
for (int i=0; i<=255; i=i+64) { | int i=0 – создаем переменную целого типа (счетчик цикла) и задаем ей начальное значение равное 0. Фактически переменная i отвечает за яркость светодиода в данный момент.i<=255 – проверяем условие цикла «достигли ли мы уже максимальной яркости?»;i=i+64 – увеличиваем счетчик цикла на 64 (меняем яркость светодиода на 25%). |
analogWrite(redPin, i); | Выдаем на светодиод число i, что соответствует очередному изменению яркости светодиода. |
delay(1000); | Пауза в 1 секунду |
} | Конец цикла |
} |
- Запустив симуляцию, мы сможем убедиться в том, что устройство работает также, как и раньше, но код при этом значительно сократился.
Задания: |
Задание 12. Создайте виртуальное устройство, позволяющее плавно увеличивать и уменьшать яркость светодиода каждые 0.1 сек. на 1% .
Задание 13***. Создайте виртуальное устройство, позволяющее плавно увеличивать и уменьшать яркость двух светодиодов, работающих в асинхронном режиме.
Предоставьте общий доступ к своим виртуальным устройствам и отправьте ссылки на решения с помощью формы.