Аналого-цифровой преобразователь

Аналого-цифровой преобразовательВ предыдущих статьях мы занимались считыванием цифровых сигналов. Благодаря этому мы могли, например, проверить, была ли нажата кнопка. Однако, окружающий нас мир, не является цифровым, иногда двух состояний (1/0) недостаточно.

Поэтому теперь мы рассмотрим аналого-цифровой преобразователь, сокращенно АЦП.

Краткое теоретическое введение

Всю электронику можно разделить на цифровую и аналоговую. Цифровая ограничена тем фактом, что данный вход или выход может находиться в одном из двух состояний — высокое (1) или низкое (0). На практике это означает, что Arduino распознает 0 В или 5 В на своем входе (упрощенно).

К сожалению, не все в окружающем нас мире можно описать так просто. Подключая датчик расстояния, мы хотели бы знать точное расстояние до препятствия, а не только информацию, основанную на принципе: видимое препятствие или нет препятствия.

Такой датчик на своем выходе мог бы выдавать напряжение, пропорциональное расстоянию, тогда измерение будет заключаться в считывании напряжения, например, в диапазоне 0 — 5 В. Это аналоговый подход. Поэтому, в приведенных ниже примерах, мы будем использовать соответствующие периферийные устройства Arduino, которые позволяют нам измерять напряжение, подаваемое на специальные входы схемы.

Помните, что на входы платы Arduino UNO можно подавать только напряжение 0 — 5В . Другое напряжение может повредить плату и даже компьютер, к которому вы ее подключаете!

Так называемые АЦП или аналого-цифровой преобразователь — это одно из самых популярных периферийных устройств в микроконтроллерах. Его задача — взять напряжение, приложенное к входу схемы, и преобразовать его в цифровую форму.

Пример — для линейного преобразователя:

В данном случае был представлен 8-битный преобразователь, поскольку считываемое значение могло иметь 256 комбинаций (начиная с 0). На самом деле, мы можем встретить разные конвертеры, например, 12 или 16-битные. Преобразователь с большим количеством битов должен быть более точным, потому что его максимальное значение больше (он работает в том же диапазоне, но с более высоким разрешением).

Чисто из любопытства, стоит знать, что аналого-цифровые преобразователи работают относительно медленно. Конечно, вы не заметите этого в своих программах, но, сравнивая АЦП с другими периферийными устройствами микроконтроллера, они не очень хорошо себя показывают.

Измерение с помощью АЦП занимает 0,0001 с,
что означает максимум 10 000 измерений в секунду!

Вообще, эти преобразователи дороги в производстве. Как вы помните из второй статьи, в Arduino UNO есть 6 аналоговых входов (A0-A5). Фактически внутри микроконтроллера находится всего 1 АЦП, к которому подключен мультиплексор. Благодаря им можно измерять напряжение на 6 каналах.

Измерение напряжения на 6 каналах

На этом мы закончим с теорией. Теперь мы можем перейти к первой программе.

АЦП на практике

Пора проверить, как АЦП будет работать на практике. Для этого соберите схему, как показано на картинке ниже. Потенциометр здесь играет роль делителя напряжения. Если вы не помните, что такое делитель напряжения, обязательно прочтите эту статью из раздела электроники.

АЦП программа

Программное использование АЦП тривиально и ограничивается использованием буквально одной функции analogRead (канал АЦП) , где мы заменяем выбранный вывод (A0-A5) на канал АЦП .

Вначале мы ограничимся только отправкой считанного значения на компьютер. Для этого мы будем использовать USART, который мы изучили в предыдущей статье.

Читать также:  Начало работы с платой Ардуино Нано

Поворачивая потенциометр, мы получаем на экране значения от 0 до 1023. Это означает, что преобразователь АЦП, который находится в Arduino UNO, 10-битный.

Чем полезны нам такие сухие сведения? Трудно сказать. Лучше было бы считать результат, например, в вольтах, да?

Простой вольтметр

Эта задача проста и заключается только в соответствующем преобразовании считываемого значения. Мы знаем, что входное напряжение колеблется в пределах 0-5В, и с преобразователя АЦП получаем 1024 значения (считаем от 0 до 1023). Или же:

1024 => 5 В
1 => х

1024x = 1 * 5

х = (1 * 5 В) / 1024 = ~ 0,0049 В

Проще говоря — каждое увеличение входного напряжения на ~ 0,0049 В увеличивает показания АЦП на единицу. Таким образом, чтобы получить результат в вольтах, достаточно добавить одну строку:

Обратите внимание, что переменное напряжение было объявлено как тип с плавающей точкой, то есть такой, который позволяет хранить такие числа.

Числа, разделенные друг на друга, в приведенном выше коде, были записаны с суффиксом « .0 », это указывает компилятору рассматривать их как числа с плавающей точкой.

Отныне, на экране компьютера должно отображаться значение в диапазоне 0-5 В. Таким образом, мы только что создали очень простой, но рабочий вольтметр. Можно ли вместо потенциометра, измерить напряжение, например, батареи? Да, но только если вы будете очень осторожны.

Помните, что подключение напряжения выше 5 В повредит Arduino! Поэтому даже не пытайтесь подключить к нашему вольтметру аккумулятор на 9В.

Однако, если где-нибудь вы найдете самую обыкновенную батарейку АА 1,5 В (посмотрите в пультах ДУ телевизора) то, можно провести эксперимент:

  1. Подключите минус (GND) батареи проводом к земле Arduino.
  2. Подключите провод от пина А5 к плюсу аккумуляторной батареи.
  3. Считайте напряжение на компьютере.

В нашем случае на новой батарее показание было не выше 1,7 В, так что все нормально. Конечно, такой вольтметр очень неточен и собирает много шумов (о которых вы прочитаете позже). Так что к этому следует относиться только как к эксперименту.

Измерение напряжения на батарейке АА
Простой вольтметр на Arduino

Видите ли вы еще какое-нибудь практическое применение для измерений АЦП (кроме вольтметра)? Если нет, то попробуйте следующее упражнение.

Еще одна программа с АЦП

Предыдущая наша программа была предназначена только для демонстрации работы преобразователя. Теперь мы можем использовать потенциометр, подключенный к цепи, чтобы можно было влиять на работу программы. Для этого добавим в схему один светодиод.

Демонстрационная работа преобразователя

Значения преобразователя находятся в диапазоне 0-1023, что относительно мало. Что происходит, когда считанное число используется в программе в качестве значения задержки? Вот самый быстрый способ создать устройство, которое мигает светодиодом с частотой, регулируемой потенциометром:

Домашнее задание 3.1

Понаблюдайте, что происходит в одном из крайних положений потенциометра. Как вы думаете, что на это влияет?

Светодиодный индикатор

Пришло время для более сложного проекта. На этот раз, в зависимости от положения ползунка (головки) потенциометра, мы включим соответствующий светодиод. Сначала соедините все компоненты. Наше подключение выглядит так:

Читать также:  Контакты GPIO и их программирование

Схема светодиодного индикатора

Задача простая, достаточно разделить максимальное значение, которое может быть считано с АЦП, т.е. 1023 на 5, и исходя из этого, написать условия включения отдельных светодиодов. Однако, для этого мы можем использовать очень удобную функцию map ().

Ее применение на практике выглядит так:

Эта функция позволяет быстро масштабировать определенное значение. В качестве первого аргумента мы даем значение для масштабирования. В нашем случае это будет информация от АЦП. Второй и третий параметры — это диапазоны входного значения, а последние два параметра — это диапазоны выходного значения (после масштабирования).

В результате приведенной выше строки кода, мы всегда получаем значение в диапазоне 1-5. На практике это можно использовать следующим образом:

Проверьте, что происходит с отдельными светодиодами при повороте потенциометра. Если все подключено правильно, при повороте ползунка должен гореть другой светодиод.

В одном из крайних положений потенциометра можно заметить странное поведение светодиодов. Тогда лучше всего методом проб и ошибок изменить максимальное значение АЦП, заданное в функции map () . Нам кажется, что схема корректно вела себя при переходе с 1023 на 1021.

Домашнее задание 4.2

Если вам повезет (много есть интересного в окружающей нас среде), можно будет провести очень зрелищный эксперимент. Используйте ранее подключенную схему с 5 светодиодами. Отсоедините провод, идущий к потенциометру, и оставьте его висеть в воздухе.

Что произойдет, если поднести руку к проводу (не касаясь кончика)? В нашем случае 3 светодиода зажглись, хотя, провод был не подключен, но когда мы приблизили руку на 2 см ближе к проводу, то все светодиоды загорелись. Вы хоть представляете, почему это происходит?

Ждем ваших комментариев. Если ваш эффект не такой четкий, вы можете прикрепить к концу провода «антенну», например, с помощью серебряной цепочки.

Этот опыт должен остаться в вашей памяти как доказательство того, что вы не должны оставлять какие-либо провода «болтающимися» в воздухе.

Свет, который горит в темноте

Пришло время использовать новый элемент и создать что-то, что будет иметь практическое применение. В этом упражнении мы будем использовать фоторезистор, то есть элемент, сопротивление которого изменяется под действием падающего света (чем больше мы его освещаем, тем меньше сопротивление).

Используя потенциометр, мы можем сделать делитель напряжения, его работа будет зависеть от количества света в окружающей среде. Соберите макет, как показано на картинке ниже. Фоторезистор должен образовывать делитель вместе с резистором 1 кОм.

Делитель напряжения с фоторезистором

Когда на фоторезистор попадает много света, его сопротивление минимально, а напряжение в точке, подключенной к Arduino, относительно «высокое». Когда свет гаснет, сопротивление фоторезистора увеличивается, а напряжение на делителе становится низким.

С такой схемой мы можем создать лампу, которая будет включаться после наступления темноты. Код очень простой:

Как видите, есть условие, которое отвечает за включение или выключение светодиода. Вопрос в том, как выбрать это значение переключения? Отвечаем, желательно вручную.

Читать также:  Raspberry Pi — все серии плат

Мы, вначале, поставили значение на 500 и постепенно уменьшали, пока светодиод не включился в нужный момент (когда накрыли датчик рукой).

Теперь вместо синего светодиода достаточно подключить несколько более сильных белых (через транзистор) и мы уже можем похвастаться умной лампой, которая будет знать, когда светить. Но что, если мы переместим лампу в другое помещение с минимальными другими условиями? Придется ли нам несколько раз программировать Arduino, чтобы найти правильный порог? Напишите нам в комментариях, как вы думаете?

Регулировка света

На этот раз задача очевидна. Как и раньше, мы хотим создать лампу, которая будет сама включаться после наступления темноты. Однако регулировка включения должна быть намного проще. У вас есть идеи, как это сделать?

Мы использовали потенциометр, подключенный к следующему аналоговому входу (A4):

Регулировка света с помощью потенциометра

Вместо того, чтобы делать включение светодиода зависимым от жестких границ света, мы можем плавно регулировать порог переключения с помощью потенциометра. Изменить программу очень просто, отредактируем всего 3 строчки кода:

Как настроить схему быстро?

  1. Поместите устройство в помещение со светом, где светодиод должен быть выключен.
  2. Поверните потенциометр, и оставьте его в положении, при котором светодиод сразу погаснет.
  3. Готово!

Отныне, при уменьшении в помещении света, фоторезистор должен включать наше символическое освещение!

Как можете видеть, использовать АЦП очень просто, но вам уже пора поработать с домашним заданием. Не забывайте внимательно читать наши статьи. Со временем мы будем использовать множество функций в программах. Потом у вас не будет времени возвращаться к основам!

Домашнее задание 3.4

Расширьте программу умной лампы так, чтобы при включении диода она отправляла (один раз) на ПК информацию о напряжении на делителе.

Домашнее задание 3.5

Попробуйте написать простую игру. После запуска программы поверните потенциометр в произвольное место и нажмите кнопку. Затем Arduino должен отобразить на ПК следующее сообщение:

Напишите значение:

Если число, отправленное в Arduino, совпадает с показанием АЦП на +/- 50, игрок выигрывает. В противном случае загорится желтый светодиод, и у игрока будет еще 2 попытки. Каждый раз при вводе неправильного числа, на макетной плате будет загораться красный светодиод. А в случае победы — будет гореть зеленый.

Домашнее задание 3.6

Используйте два фоторезистора в качестве отдельных делителей напряжения. Разместите их на крайних сторонах макетной платы. Отобразите значения обоих датчиков в терминале. Что происходит, когда вы машете рукой перед платой (создавая тень) или светите на нее фонариком?

Анализируя разницу между измерениями двух датчиков, сможете ли вы написать программу, которая определит, на какой стороне платы находится более сильный источник света? Попробуйте показать направление на 5 светодиодах (левее, центр, правее и т.д.)!

Вывод

В этой статье мы описали, одно из самых интересных периферийных устройств — АЦП. Аналоговые преобразователи используются очень часто, для считывания некоторой информации извне. Важно отметить, что АЦП доступны не только в Arduino, поэтому практические знания в этой статье всегда будут актуальными.

С Уважением, МониторБанк

Добавить комментарий