Компаратор принцип работы
Компаратор – это устройство, предназначенное для сравнения каких-либо величин (от лат. comparare – «сравнивать»).
Является операционным усилителем с большим коэффициентом умножения. Имеет входы: прямой и инверсный. При необходимости опорный сигнал может быть подключен к любому из них.
Как работает компаратор?
На один из входов подается постоянный сигнал, который называется опорным.
Он используется как образец для сравнения. Ко второму поступает испытуемый сигнал. На выходе стоит транзистор, меняющий свое состояние в зависимости от условий:
Соответственно, выходное напряжение меняется скачком от минимума до максимума, или наоборот.
Применение компаратора
Используются в схемах измерения электрических сигналов и в аналогово-цифровых преобразователях. В логических цепях работают элементы «или» и «не», также являющиеся компараторами. Соответственно, использование этого компонента не ограничивается конкретными примерами, поскольку он применяется повсеместно.
Стоит отметить, что устройство сравнения можно сделать из любого операционного усилителя, но не наоборот. Коэффициент усиления компаратора достаточно высок. Соответственно, его входы очень чувствительны к разнице напряжений между ними. Расхождение в несколько милливольт значительно изменяет напряжение выхода.
Таким образом, компаратор позволяет наблюдать минимальные колебания уровней входных напряжений.
Это делает его незаменимым элементом схем сравнения и измерительных приборов высокой точности:
Принцип действия аналогового компаратора
Аналоговый компаратор сравнивает непрерывные сигналы – входной измеряемый и входной опорный.
При медленном изменении входного сигнала, происходит многократное переключение компаратора за малый отрезок времени.
Такое явление называют «электронным дребезгом». Его наличие значительно снижает эффективность сравнения. Поскольку часто повторяющиеся смены состояния выхода, вводят оконечный транзистор в состояние насыщения.
Для уменьшения эффекта «электронного дребезга», в схему вводят ПОС – положительную обратную связь.
Она обеспечивает гистерезис – небольшую разницу между уровнем напряжения включения и отключения.
Некоторые компараторы имеют встроенную ПОС, что уменьшает количество дополнительных элементов построения конструкции.
Особенности цифрового компаратора
Цифровой компаратор – это однобитный аналогово-цифровой преобразователь.
Напряжение выхода представляет либо логический «0», либо «1».
На вход может быть подан как аналоговый, так и цифровой сигнал.
Устройство используется в качестве формирователя импульсов для сопряжения схем датчиков и устройств отображения.
Может применяться для анализа спектра звукового или светового сигнала.
Компаратор – это также логические элементы «или» и «не», используемые в вычислительной технике.
Теоретически при незначительно малых колебаниях уровня входного сигнала, может возникать состояние неопределенности выхода. На практике равенство измеряемого и опорного напряжений не наступает. Поскольку компаратор имеет ограниченный коэффициент усиления или положительную обратную связь.
Компаратор-микросхема
Промышленность выпускает компараторы в виде интегральных схем. Их использование позволяет создавать компактные приборы, с минимумом навесных элементов. Также преимущество малогабаритных деталей в незначительной длине соединительных проводников. В условиях повышенного электромагнитного излучения они являются приемными антеннами для всевозможных электрических помех.
Компаратор на операционном усилителе
У компараторов есть немалое сходство с операционными усилителями:
Пример практического применения компаратора
На принципиальной схеме представлен датчик освещенности.
Опорное напряжение задается резисторами RV1 и R2. При этом, RV1 служит регулятором чувствительности конструкции. Индикация реализована на светодиоде D1. Датчиком является элемент LDR1, который меняет омическое сопротивление в зависимости от освещенности. Собственно компаратор представлен операционным усилителем LM324. Это простое устройство демонстрирует то, как работает компаратор на практике.
Компараторы массы: понятие
Компаратор массы это устройство, предназначенное для уточнения разности значений массы гирь при контроле стандартов массы и веса, а также, для прецизионного взвешивания. Наиболее точные компараторы массы способны взвесить любой образец и сравнить его с иным, подобным ему. Происходит это на уровне атомов. Необходимость в таких устройствах возникает по причине несовершенства эталонных образцов мер веса и объема жидкости.
Типы компараторов
– компаратор для сравнения разнополярных сигналов;
– компаратор для сравнения однополярных сигналов.
Пишите компараторы правильно
Как обнаружилось, несоблюдение этих свойств — не такая уж редкая ситуация. Проблема возникает при сравнении вещественных чисел — float или double.
Предположим, у нас имеется класс с полем типа double, и мы хотим упорядочивать объекты этого класса в зависимости от значения поля. Нередко можно встретить такой код:
Ни рефлексивности, ни антисимметричности не наблюдается. Можно встретить и такую реализацию сравнения:
Здесь все три предыдущих сравнения выдадут ноль, то есть как будто бы свойства соблюдаются. Но, конечно, радоваться рано:
Здесь нарушается транзитивность: первый объект равен второму, второй равен третьему, но первый третьему не равен.
Чем же это грозит простому обывателю? Чтобы понять это, создадим простой список и попробуем его перемешать и посортировать несколько раз:
Вывод в каждом запуске отличается и может выглядеть, например, так:
Или для второй реализации compareTo :
Примерно в половине случаев элемент с NaN прибивается к началу или концу сортируемого списка, а в других случаях начинает блуждать, портя порядок окружающих элементов.
Первый вариант сравнивающей функции психоделичнее. Напишем, например, такой тест:
Мы вставили по пять элементов, содержащих NaN, и по пять элементов, содержащих каждую цифру от 1 до 9. В результате имеем следующее:
Вполне ожидаемо увидеть пять раз NaN: ведь они не равны друг другу. Но из-за неправильных сравнений и некоторые другие элементы вставились по нескольку раз. Можете сами посмотреть, что случится с TreeMap. Заметьте, что один случайно попавший NaN может испортить всю коллекцию, причём это не всегда легко отладить: коллекция может долго существовать в некорректном состоянии и делать вид, что всё нормально.
Что любопытно, этой проблемы вообще не должно существовать. Ещё в JDK 1.4 появились специальные статические методы Float.compare и Double.compare, которые сделают всё за вас, корректно обработав специальные случаи. Надо лишь написать:
Видимо, сказывается обманчивая простота алгоритма сравнения: порой программист считает, что проще написать самому, чем искать в документации стандартный способ сделать это.
Примеры неправильного сравнения double/float в различных открытых проектах: JTS, Batik, Hadoop, Hudson, ICU4J, Lucene. Трудно определить, в каких случаях это может привести к проблемам, но это тот случай, когда я бы исправлял безусловно: правильный и надёжный вариант обычно при этом ещё и короче неправильного.
Чтобы изменить ситуацию, я написал маленький детектор для FindBugs, который находит некорректно реализованные функции сравнения и предлагает использовать Float.compare/Double.compare.
Вообще для всех примитивных типов есть подобные методы. Если вам надо сравнить несколько полей по очереди, можно написать так:
Смотрится лучше, чем куча веток с больше и меньше. А если вы пользуетесь Guava или чем-то подобным, тогда так:
Выбор между Comparator и Comparable
Для реализации сортировки требуется, чтобы сортируемые объекты можно было сравнивать между собой на больше-меньше. Иначе говоря, чтобы было определено правило, которое позволит для любых двух объектов указать, какой из них в рамках данного контекста идет раньше, а какой позже.
В java эти правила определяются на уровне классов, к которым принадлежат объекты. Для примера возьмем класс для описания счета пользователя:
В зависимости от контекста сравнение счетов пользователя может происходить по разным правилам, например:
в приложении пользователь видит счета, отсортированные по currency, потом по value;
в админке счета всех пользователей отсортированы по дате изменения.
Для реализации сравнения на больше-меньше в java предусмотрено две возможности:
UserAccount реализует интерфейс Comparable В этом случае два объекта получают возможность сравнения между собой: acc1.compareTo(acc2)
Очевидно, что в некоторых случаях выбора между Comparable и Comparator нет. Если исходный класс нельзя модифицировать, или если требуются разные правила сравнения, то придется использовать Comparator. В остальных случаях, технически, можно использовать как Comparator, так и Comparable.
Согласно документации использование Comparable возможно, если для сравнения используется естественный порядок (class’s natural ordering). По ссылке есть представление разработчиков, что такое естественный порядок для стандартных классов (String, Date). Мне не удалось выяснить, что такое естественный порядок в общем случае. Выглядит, что это интуитивное представление разработчика о порядке в данном контексте. При этом даже для стандартных классов порядок может быть не интуитивен (в каком порядке должны идти значения BigDecimal с разной точностью, например 4.0 и 4.00?). Практика показывает, что «естественность» правил различается в понимании разных разработчиков и контекстов. Для меня необходимость опоры на интуицию является аргументом против использования Comparable.
При написании кода приходится лавировать между явностью и неявностью. Явность хороша тем, что для понимания участка кода требуется рассмотреть лишь узкий контекст его использования. В то же время неявность позволяет использовать одинаковые правила для всех участков кода. Разберем на примере: разработчику требуется отсортировать список счетов. Правила сравнения можно указать:
явно: Arrays.sort(accountsList, accountByValueComparator)
В случае явной передачи компаратора найти его использования элементарно. Я считаю это аргументом за использование компаратора. (Еще одним примером сложностей с поиском неявных использований может служить equals/hashCode, но альтернативы в виде «Equalator»-а для них нет).
Руководство по компаратору Java 8.сравнение()
Практическое руководство по статическим функциям и методам экземпляра сопоставимого интерфейса, которые были представлены в Java 8.
1. Обзор
2. Начало работы
2.1. Пример класса Бобов
Для примеров в этой статье давайте создадим Employee bean и будем использовать его поля для сравнения и сортировки:
2.2. Наши Данные Тестирования
Давайте также создадим массив сотрудников, который будет использоваться для хранения результатов нашего типа в различных тестовых случаях на протяжении всей статьи:
Первоначальное упорядочение элементов сотрудников будет:
На протяжении всей статьи мы будем сортировать выше Employee массив, используя различные функции.
Для тестовых утверждений мы будем использовать набор предварительно отсортированных массивов, которые мы сравним с нашими результатами сортировки (т. Е. массивом employees ) для различных сценариев.
Давайте объявим несколько из этих массивов:
Как всегда, не стесняйтесь обращаться к нашей ссылке GitHub для получения полного кода.
3. Использование компаратора.
В этом разделе рассматриваются варианты функции Comparator.comparing static.
3.1. Вариант выбора Ключа
Функция Comparator.comparing static принимает ключ сортировки Function и возвращает Comparator для типа, содержащего ключ сортировки:
Чтобы увидеть это в действии, давайте использовать поле name в Employee в качестве ключа сортировки и передадим ссылку на его метод в качестве аргумента типа Function. Компаратор , возвращенный из того же самого, используется для сортировки:
Как вы можете видеть, значения массива employees сортируются по имени в результате сортировки:
3.2. Выбор ключа и Вариант компаратора
Как вы можете видеть, результаты сортируются в порядке убывания по имени :
3.3. Использование компаратора.
Результаты сортируются в порядке убывания по имени :
3.4. Использование компаратора.
Давайте посмотрим, как упорядочиваются значения массива employees после сортировки:
3.5. Использование компаратора.
Давайте посмотрим, как упорядочиваются значения массива employees после сортировки с mobile в качестве ключа:
3.6. Использование компаратора.
Давайте посмотрим, как упорядочиваются значения массива employees после сортировки с зарплатой в качестве ключа сортировки:
4. Учет естественного порядка в компараторе
4.1. Использование Естественного порядка
Функция естественный порядок возвращает Компаратор для типа возврата, указанного в подписи:
Давайте посмотрим, как упорядочиваются значения массива employees после сортировки:
4.2. Использование Обратного Естественного Порядка
Давайте посмотрим, как упорядочиваются значения массива employees после сортировки:
5. Учет нулевых значений в компараторе
5.1. Сначала Рассмотрим Null
Давайте случайным образом вставим null значения в массив employees :
Давайте посмотрим, как упорядочиваются значения массива employees после сортировки:
5.2. Считать Нулевым Последнее
Давайте посмотрим, как упорядочиваются значения массива employees после сортировки:
6. Использование компаратора.
Функция thenComparing позволяет настроить лексикографическое упорядочение значений, предоставив несколько ключей сортировки в определенной последовательности.
Давайте рассмотрим другой массив класса Employee :
Рассмотрим следующую последовательность элементов в приведенном выше массиве:
Давайте запишем последовательность сравнений как возраст с последующим именем и посмотрим порядок этого массива:
Давайте посмотрим, как упорядочиваются значения массива employees после сортировки:
Аналогично, существуют функции then Comparing Long и then Comparing Double для использования long и double ключей сортировки.
7. Заключение
Компаратор
Компаратор (аналоговых сигналов) (англ. comparator — сравнивающее устройство [1] ) — электронная схема, принимающая на свои входы два аналоговых сигнала и выдающая логическую «1», если сигнал на прямом входе («+») больше чем на инверсном входе («−»), и логический «0», если сигнал на прямом входе меньше, чем на инверсном входе.
Одно напряжение сравнения двоичного компаратора делит весь диапазон входных напряжений на два поддиапазона. Двоичный логический сигнал (бит) на выходе двоичного компаратора указывает в каком из двух поддиапазонов находится входное напряжение.
Простейший компаратор представляет собой дифференциальный усилитель. Компаратор отличается от линейного операционного усилителя (ОУ) устройством и входного и выходного каскадов:
При подаче эталонного напряжения сравнения на инвертирующий вход, входной сигнал подаётся на неинвертирующий вход и компаратор является неинвертирующим (повторителем, буфером).
При подаче эталонного напряжения сравнения на неинвертирующий вход, входной сигнал подаётся на инвертирующий вход и компаратор является инвертирующим (инвертором).
Несколько реже применяются компараторы на основе логических элементов, охваченных обратной связью (см., например, триггер Шмитта — не компаратор по своей природе, но устройство с очень схожей областью применения).
При математическом моделировании компаратора возникает проблема выходного напряжения компаратора при одинаковых напряжениях на обоих входах компаратора. В этой точке компаратор находится в состоянии неустойчивого равновесия. Проблему можно решить, если принять доопределение, что, в точке неустойчивого равновесия выходное напряжение компаратора остаётся в предыдущем состоянии.
Содержание
Реализации
В аналоговой схемотехнике компаратор обычно реализуется на базе операционного усилителя, охваченного резистивной положительной обратной связью.
Компараторы с двумя и более напряжениями сравнения
Строятся на двух и более дифференциальных усилителях.
Компараторы, построенные на двух дифференциальных усилителях, можно условно разделить на двухвходовые и трёхвходовые. Двухвходовые компараторы применяются в тех случаях, когда сигнал изменяется достаточно быстро (не вызывает быстрых переключений состояния выхода, и на выходе генерируют один из потенциалов, которыми запитаны опреационные усилители (как правило — +5В или 0В).
Троичный компаратор
Многовходовые компараторы
Входной каскад параллельных АЦП прямого преобразования является многоуровневым компаратором. В нём применяются 
Промышленные компараторы
Пример широко известных компараторов: LM311 (российский аналог — КР554СА3), LM339 (российский аналог — К1401СА1). Эта микросхема часто встречается, в частности, на системных платах ЭВМ, а также в системах управления ШИМ контроллеров в блоках преобразования напряжения (например в компьютерных блоках питания с системой питания ATX). Подробнее о них можно узнать из книги «Электроника», О. В. Миловзоров, И. Г. Панков — 2004; «Электронные приборы и усилители», Ф. И. Вайсбурд, Г. А. Панаев, Б. Н. Савельев — 2005






