Arduino аналоговый компаратор

Аналоговый функционал Arduino: как использовать его в своих проектах

Lee Goldberg, Electronic Products

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

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

Если Вы еще не знакомы с Arduino, обратите внимание на ссылки в конце статьи.

В соответствии с принятой философией – сделать применение цифровых технологий в реальном мире максимально простым, – аппаратная платформа Arduino была разработана таким образом, чтобы обеспечить возможность полного использования аналоговых функций, встроенных в универсальный 8-разрядный микроконтроллер ATmega компании Atmel. Все варианты микроконтроллеров, используемых в платформе Arduino, оснащены внутренним многоканальным АЦП, который имеет 10-битное разрешение и способен производить до 15000 выборок в секунду, представляя результаты в форме целых чисел от 0 до 1023. Основной функцией аналоговых выводов микроконтроллера является чтение входных аналоговых значений, но любой из них может быть сконфигурирован как цифровая линия ввода/вывода общего назначения.

Хотя некоторые AVR микроконтроллеры оснащены цифро-аналоговыми преобразователями, в нынешнем поколении плат Arduino используются представители семейства, аналоговые сигналы на выходах которых получаются с помощью широтно-импульсной модуляции (ШИМ). Коэффициент заполнения импульсов, имеющих частоту приблизительно 490 Гц, программируется на каждом выходе ШИМ, что дает возможность получать эквивалентное действующее напряжение в диапазоне от 0 В до 5 В с 8-битным разрешением (Рисунок 1). Несмотря на некоторые ограничения в своих возможностях, выходы Arduino могут быть использованы для многих задач, таких как управление светодиодами и электродвигателями.

Рисунок 1. Широтно-импульсная модуляция позволяет превратить цифровые линии ввода/вывода общего назначения в аналоговые выходы Arduino.

Большинство плат Arduino, как «официальных», так и других изготовителей, предоставляют легкий доступ к аналоговым (и цифровым) сигналам микроконтроллера посредством разъемов по краям платы. Количество аналоговых каналов и их физическое соответствие варьируются в зависимости от конкретного используемого микроконтроллера и форм-фактора платы, но многие варианты придерживаются соглашений, принятых для официальных проектов Arduino – Arduino Uno (Рисунок 2), Mega и Nano.

Рисунок 2. Аналоговые входы (A0 – A5) на плате Arduino Uno (rev3) и выходы ШИМ (цифровые выходы 3, 5, 6, 9, 10, 11) физически доступны через стандартные однорядные разъемы по краям платы.

Разработка программного кода для функций аналогового ввода/вывода также несложна, т.к. среда разработки Arduino IDE содержит набор соответствующих собственных команд. Эти команды позволяют считывать аналоговые значения, генерировать выходной ШИМ сигнал и конфигурировать опорное напряжения для АЦП.

Аналого-цифровое преобразование и чтение данных

Задача использования аналоговых входов платформы Arduino в реальных приложениях довольно проста, но требует определенного внимания при выборе надлежащего источника опорного напряжения для АЦП. Чтобы определить верхний предел диапазона входного напряжения АЦП, здесь можно использовать источник опорного напряжения по умолчанию (Default), внутренний (Internal) или внешний (External).

В режиме Default микроконтроллер в качестве опорного источника использует выход установленного на плате Arduino стабилизатора напряжения. В зависимости от конкретного типа платы, это либо 5 В, либо 3.3 В.

В режиме Internal используется встроенный в микроконтроллер прецизионный источник опорного напряжения. Выходное напряжение этого источника различно в различных микроконтроллерах, и как правило составляет 1.1 В (для ATmega168 и ATmega328) или 2.56 В (для ATmega8 и других из серии mega). Режим External позволяет подключить внешний источник опорного напряжения к выводу микроконтроллера AREF через резистор номиналом 5 кОм. Вывод AREF имеет внутренний защитный резистор 32 кОм, который совместно с резистором 5 кОм образует делитель напряжения. Это означает, что при напряжении 2.5 В, приложенном через резистор, на выводе AREF будет 2.5 × 32 / (32 + 5) ≈ 2.2 В.

Чтение аналоговых напряжений с помощью языка программирования Arduino заключается в выборе источника опорного напряжения с использованием команды analogReference (type) и вызова функции analogRead(pin), где

pin указывает на номер вывода разъема платы.

После назначения источника опорного напряжения он остается активным до выбора другого источника. Несмотря на то, что микроконтроллеры AVR поддерживают скорость преобразования до 15000 выборок в секунду, аппаратно-программная платформа Arduino, как правило, ограничивает это значение до 10000 выборок.

Создание аналоговых выходов ШИМ

Для генерации аналогового напряжения на одном из выводов ШИМ платы Arduino требуется конфигурирование этого вывода с помощью команды pinMode(pin, mode) и последующего вызова функции analogWrite(pin, value), где

pin – указывает номер вывода ШИМ на разъеме платы Arduino,
value – значение, задающее выходное напряжение ШИМ (8-битное число в диапазоне 0-255).

На сконфигурированном однажды выходе будет постоянно присутствовать сигнал ШИМ частотой 490 Гц с заданными параметрами до следующего вызова функции analogWrite() (или digitalRead(), или digitalWrite()) для этого же вывода микроконтроллера.

Линии ввода/вывода микроконтроллера способны отдавать в нагрузку ток до 40 мА, поэтому они пригодны для непосредственного управления небольшими массивами светодиодов. Для управления более мощными источниками света или электродвигателями аналоговый выход микроконтроллера можно соединить с мощным транзистором или мостовой схемой. В приложениях более требовательных к качеству аналогового сигнала (усилители, источники тока) могут применяться простые RC фильтры.

Дополнительные аналоговые функции

Некоторые микроконтроллеры AVR (включая ATmega8 и ATmega168) имеют аналоговый компаратор, позволяющий сравнивать входное напряжение с другим внешним напряжением, которое может поступать с выхода ШИМ или от встроенного источника опорного напряжения микроконтроллера. Выход компаратора может опрашиваться микроконтроллером, или же может инициировать прерывание. Несмотря на дополнительный программный код, работа компаратора с выработкой прерывания позволяет процессору реализовать функции определения повышенного/пониженного напряжения без постоянного чтения аналоговых данных. Эта функция может использоваться в детекторах движения с регулируемым порогом и датчиках удара в биомедицинском мониторинге.

Для плат Arduino, микроконтроллеры которых не имеют встроенного аналогового компаратора, относительно легко можно добавить внешний компаратор LM741, LM339N или TLC3704, установив его в макетной области платы. Если свободного места на вашей плате нет, можно использовать специальную плату для прототипирования (Рисунок 3).

Рисунок 3. АналоПлата для прототипирования позволит подключать ваши собственные аналоговые (или цифровые) схемы ввода/вывода к стандартным платам Arduino.

Ссылки

  1. Радиолоцман», 2011, 11, стр. 13, «Как создавали и продвигали Arduino».
  2. Радиолоцман», 2011, 12, стр. 44, «Открытая платформа Arduino высвобождает творческий потенциал».
  3. Радиолоцман», 2012, 01, стр. 34, «Открытая платформа Arduino высвобождает творческий потенциал. Arduino Shields – расширение возможностей аппаратной платформы».

Перевод: Vadim по заказу РадиоЛоцман

Источник

Arduino.ru

компаратор на ардуино

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Пожалуйста подскажите как сделать на компараторе дуни сравнение двух аналоговых сигналов. Алгаритм такой:

если напряжение U1>U2 тогда на на цифровом выходе ардуино D1 логическая 1

если U1 Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Так ТС же вроде про аналоговый компаратор спрашивал, а Вы ему цифровой пихаете.

Вам чего надо-то? В даташите что-то непонятно, или в чём проблема?

И, кстати, что у Вас за ардуина? Они разные. Если на базе 328, то там всё тривиально, не знаю, что Вам непонятно. Вот, держите работающий пример всего из восьми строк, не считая комментариев. А так, читайте даташит, и говорите толком, что неясно.

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

Я тут подумал и решил привести для Вас ещё более брутальный пример — делает ровно тоже самое, что и предыдущий, только не использует прерывание.

Источник

Аналого-цифровые преобразования — АЦП

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

Все эти устройства имеют шкалу, которую мы используем для фиксации их показаний. Рассмотрим простой пример — определение температуры с помощью обычного градусника. Человек решает эту задачу очень просто: мы смотрим, к какому из делений ближе всего приблизился уровень жидкости в градуснике. Полученное таким образом значение и будет измеренной температурой. Иными словами, мы осуществляем преобразование аналоговой непрерывной величины в дискретную, которую можно записать на бумаге с помощью цифр.

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

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

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

Следует отметить, что существует и устройство с обратной функцией, называемое цифро-аналоговым преобразователем (ЦАП, DAC). Оно позволяет переводить цифровой сигнал в аналоговый. Например, во время проигрывания мелодии на мобильном телефоне происходит преобразование цифрового кода из MP3 файла в звук, который вы слышите у себя в наушниках.

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

Функции работы с АЦП

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

На карте Arduino Uno аналоговые входы имеют буквенно-цифровые обозначения A0, A1, …, A5 (снизу слева).

Во время работы всё с теми же кнопками, мы познакомились с функцией digitalRead, которая умеет считывать цифровой сигнал с определенного входа контроллера. У этой функции существует аналоговая версия analogRead, которая может делать то же самое, но только для аналогового сигнала.

результат = analogRead( номер_контакта );

после вызова этой функции, микроконтроллер измерит уровень аналогового сигнала на заданном контакте, и сохранит результат работы АЦП в переменную «результат». При этом результатом функции analogRead будет число от 0 до 1023.

Разрядность АЦП

Надо заметить, что число 1023 здесь появилось неспроста. Дело в том, что у каждого устройства АЦП есть такой важный параметр как разрядность. Чем больше значение этого параметра, тем точнее работает прибор. Предположим, что у нас есть АЦП с разрядностью 1. Подавая на вход любое напряжения от 0 до 2,5 Вольт, на выходе мы получим 0. Любое же напряжение от 2,5 до 5 вольт даст нам единицу. То есть 1-битный АЦП сможет распознать только два уровня напряжения. Графически это можно изобразить следующим образом:

АЦП с разрядностью 2 распознает уже четыре уровня напряжения:

  • от 0 до 1,25 — это 0;
  • от 1,25 до 2,5 — это 1;
  • от 2,5 до 3,75 — это 2;
  • наконец, от 3,75 до 5 — это 3.

На следующих двух картинках изображена работа АЦП с разрядностью 2 и 3 бит:

В Arduino Uno установлен 10-битный АЦП, и это значит, что любое напряжение на аналоговом входе в диапазоне от 0 до 5 вольт будет преобразовано в число с точностью 1/1024 вольта. На графике будет сложно изобразить столько ступенек. Имея такую точность, 10-битный АЦП может «почувствовать» изменение напряжение на входе величиной всего 5 милливольт.

Опорное напряжение

Есть нюанс, который может стать причиной ошибки измерения с помощью АПЦ. Помните тот диапазон от 0 до 5 вольт в котором работает устройство? В общем случае этот диапазон выглядит иначе:

от 0 до опорного напряжения

Это изменение повлечет за собой изменение формулы расчет точности АЦП:

точность = опорное напряжение/1024

Опорное напряжение определяет границу диапазона, с которым будет работать АЦП.

В нашем примере опорное напряжение будет равно напряжению питания Arduino Uno, которое дал USB порт компьютера. У моем конкретном случае это напряжение было 5.02 Вольта, и я могу смело заявить, что измерил заряд батарейки с высокой точностью.

Что если вы питаете микроконтроллер от другого источника? Допустим у вас есть четыре NiMh аккумулятора на 1.2 Вольта. В сумме они дадут 4.8 Вольта (пусть они немного разряжены, ведь в действительности их заряжают до 1.4 Вольта). Точность измерения будет равна 4.8/1024. Это следует учесть в нашей программе.

Наконец рассмотрим случай, когда мы питаем Arduino Uno одним напряжением, а в качестве опорного хотим установить совсем другое, например, 3.3 Вольта. Что делать? Для такого варианта на Arduino Uno есть специальный вывод Vref. Чтобы решить проблему, нам нужно подать на этот контакт напряжение 3.3 Вольта, и разрешить использование внешнего источника опорного напряжения функцией:

которую следует вызвать внутри функции setup нашей программы.

Также следует учитывать, что результат измерения значения напряжения не может превышать границы диапазона. Если мы выбираем в качестве опорного напряжения 3.3 Вольта, а поступающий сигнал будет с большим напряжением, то мы получим неправильное значение напряжения, поскольку АЦП «не знает» о наличии более высокого напряжения.

Программа

Наша первая программа с использованием АЦП будет крайне простой: каждую секунду мы будем измерять аналоговое значение на входе A0, и передавать его в последовательный порт.

Теперь загружаем программу на Arduino, и переходим к измерениям.

Подключение

Чтобы измерить напряжение на батарейке, мы должны подключить её к нашей Arduino всего двумя контактами. Для примера используем щелочную батарейку на 1.5 Вольта.

Теперь откроем окно COM-монитора в Arduino IDE, и посмотрим какие значение выдает нам АЦП:

Что означает число 314? Вспомним, что 10-битный АЦП разбивает диапазон от 0 до 5 вольт на 1024 части. Значит точность 10-битного АЦП — 5/1024. Зная точность, мы можем записать формулу для преобразования показаний АЦП к вольтам:

где V — измеренное напряжение на батарейке;
ADC — результат работы функции analogRead.

Подставим эту формулу в программу и снова попробуем измерить заряд батарейки!

Уже больше похоже на правду.

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

На нашем портале можно найти несколько уроков, выполнение которых зависит от понимания темы АЦП: датчик температуры, ёмкостный датчик, фоторезистор, потенциометр и аналоговый джойстик. А в совокупности с еще одной важной темой — ШИМ, применение АЦП позволит создать диммер светодиодной лампы и регулятор хода двигателя. Успехов!

Источник

Adblock
detector