Аналогово-цифровой преобразователь, или АЦП, служит для преобразования аналогового сигнала в цифровой код, который далее может обрабатываться микроконтроллером, компьютером или другой цифровой вычислительной машиной. Это предложение было написано только для красоты и не несет особой смысловой нагрузки. Итак, приступаем сразу к делу))
У любого АЦП есть характеристика, которая называется «Динамический диапазон». Динамический диапазон — это диапазон аналогового сигнала на входе АЦП, в приделах которого результат преобразования меняется от минимального значения до максимального.
Для примера возьмем встроенный в ATMega8 АЦП. Его разрядность 10 бит, а это значит, что код на его выходе может изменяться в диапазоне от 0 до 2^10 — 1 = 1023. При опорном напряжении 2.5 вольт, результат преобразования будет следующим:
- на входе 0 вольт -> код на выходе 0
- на входе 1.25 вольт -> код на выходе 511
- на входе 2.5 вольт -> код на выходе 1023
- на входе 2.51 вольт -> код на выходе 1023
- на входе 3.0 вольт -> код на выходе 1023
Вот!!! Обратите внимание на последние 2 строчки: напряжение на входе увеличиваем, а код не меняется. Все, уперлись в рельсу (англ. rail — рейка, перекладина, ограда). Вот это и есть выход за динамический диапазон. А сам динамический диапазон лежит в пределах 0..2.5 вольт.
А что делать, когда надо измерять напряжения, например, от 0 до 3.5 вольт?
Можно увеличить опору АЦП до 4-х вольт, и тогда максимальному значению 1023 будет соответствовать уже 4 вольта, а не 2,5. И у нас остается еще небольшой запас в пределах динамического диапазона.
А если надо мерить до 10-и вольт? Опору в 10 вольт поставить не получится. Согласно datasheet-у на мегу8, напряжение опоры может быть в пределах от 2 вольт и до напряжения питания аналоговой части контроллера AVcc, а AVcc примерно равно напряжению питания цифровой части Vcc.
Рис. 1. Диапазон напряжений опоры и питания аналоговой части микроконтроллера.
Вот и получается, что при питании МК от 5-и вольт, сигнал опорного напряжения может быть в пределах от 2v до 5v.
Выйти из ситуации можно довольно просто: в качестве опоры выбрать всё те же 2.5 вольт, а на аналоговый вход АЦП подавать сигнал через делитель на 4:
Рис. 2. Схема масштабирования сигнала на резисторах.
Результат будет следующий:
- Uin = 0.0v: ADC_DATA = 0
- Uin = 2.5v: ADC_DATA = 255
- Uin = 5.0v: ADC_DATA = 511
- Uin = 7.5v: ADC_DATA = 767
- Uin = 10.0v: ADC_DATA = 1023
Отлично! Теперь мы можем мерить напряжения от 0 до 10 вольт. Изменив нужным образом коэффициент деления резистивного делителя можно скорректировать диапазон измеряемых напряжений.
Бывают случаи, когда нам нужно получить высокое входное сопротивление аналогового входа Uin, порядка нескольких МегаОм. А в нашем случае (рис. 2) входное сопротивление всего 50 ком. Решить проблему крайне просто: перед делителем на R1 и R2 поставить повторитель на операционном усилителе:
Рис. 3. Схема масштабирования с высоким входным сопротивлением.
У современных ОУ сопротивление входа запросто может быть несколько десятков мегаом, а у лучших образцах и того больше — Гигаомы. Тут следует помнить об одной вещи: если мы хотим на Uin измерять напряжения от 0 до 10 вольт, то питание операционного усилителя должно быть соответствующим: для так называемых Rail-to-Rail ОУ напряжение питания должно быть равно 10 вольт, или немного больше.
Если использовать «обычный» операционник, то надо помнить, что ему на вход нельзя подавать напряжение, равное напряжению питания. Для очень популярного LM358 необходимо «отступить» от напряжений питания целых 2 вольта. Т.е. для нашего случая, чтоб ОУ не уходил в насыщение при подачи на Uin 10 вольт (относительно земли), на «плюс» питания ОУ надо подать минимум +12 вольт. То же самое и при Uin=0 вольт: на «минус» питания подаем -2 вольта относительно земли. Если с +12-ю вольтами особых проблем и не возникает, то с -2 вольтами придется повозиться: или использовать трансформатор с двумя вторичными обмотками, или какой-то DC-DC преобразователь ставить, геморрой лишний короче. А в результате у нас получится мега-сложная схема, которая делает мега-простую вещь. Поэтому использование Rail-to-Rail операционников в некоторых схемах очень даже к стати)))
Так, вроде все круто и замечательно, но только до тех пор, пока нам не нужно мерить отрицательные напряжения. А если нужно? Например, от -10 до +10 вольт. Решение есть!!!
Конечно, можно найти специальные микросхемы АЦП, которые могут работать с отрицательными напряжениями. Тогда всю входную схему можно свести рис. 3. Однако, во всеми любимыми AVR-ках АЦП не может измерять отрицательные относительно земли напряжения. Более того, если на любой вход микроконтроллера, в том числе и аналоговый, подать напряжение, меньше -0.5 вольта, то «спасибо» он за такое уж точно не скажет (смотри таблицу Absolute Maximum Ratings в даташите на МК).
Пусть Uin — это то напряжение, которое надо измерить, adc_in — напряжение, которое подается на вход АЦП после некой преобразующей схемы, опора у нас будет 2.5 вольт. Тогда нам надо сделать такую схему, которая реализует следующее:
- При Uin = +10v -> adc_in=2.25v
- При Uin = -10v -> adc_in=0.25v
- При Uin = 0v -> adc_in=1.25v
Т.е. нам нужно вогнать диапазон -10..+10 вольт в 0.25..2.25, причем при напряжении на входе, равном нулю, на АЦП подается половина напряжения опоры.
По-началу, задача может казаться сложной, но на самом деле все реализуется на одном операционнике и пяти резисторах!
Давайте вспомним схему неинвертирующего сумматора на ОУ:
Рис. 4. Неинвертирующий сумматор на ОУ.
А теперь давайте посмотрим на схему, решающую нашу задачу:
Рис. 5. Схема из шести деталей))
По сути это самый обыкновенный сумматор с двумя входами с разными коэффициентами подмешивания для каждого из входов. На первый вход подается напряжение опоры, коэффициент суммирования у которого 0.5. Второй вход измерительный, его коэффициент в нашем случае 0.1. Вот и получается, что напряжение на выходе равно adc_in=(0.5*2.5) + (0.1*Uin):
- (0.5*2.5) + (0.1*10) = 2.25v выходе при входном напряжении Uin равном +10v;
- (0.5*2.5) + (0.1*0) = 1.25v при Uin=0v;
- (0.5*2.5) + (0.1*(-10)) = 0.25v при минимально возможном напряжении на входе Uin=-10 вольт.
Надеюсь, это понятно))
Update 24.05.2019: подробности см. тут:)) https://dimoon.ru/spravochnik/ou/shemy-na-ou-drajver-aczp.html
А работает все это вот так:
Рис. 6. Осциллограмма входного и выходного сигналов
На рис. 6 представлен результат симуляции нашей схемы в isis Proteus. Красный график — сигнал на входе, зеленый — на выходе. Протеус классная вещь все-таки))
Есть тут один момент, на который следует обратить внимание. Для корректной работы Rail-to-Rail операционника его напряжение питания должно быть больше или равно максимально возможному напряжению на его входах и выходе.
Давайте разбираться, какие напряжения у нас гуляют по схеме.
Выход ОУ фактически является сигналом adc_in, и тут должно быть напряжение от 0.25 до 2.25 вольт. Так, один диапазон установили. На отрицательный вход ОУ напряжение через делитель на R1, R2 подается с выхода ОУ, поэтому тут не может быть потенциал больше 2.25 вольт.
А как дела обстоят с положительным входом? Чтобы не впадать в математические расчеты, можно прямо в Proteus-e измерить напряжение на этом входе при изменении Uin в пределах -10..+10 вольт.
Рис. 7. Точка измерения напряжения U1_+
Результат радует:
Рис. 8. Результат измерения на положительном входе ОУ
Напряжение на положительном входе ОУ колеблется в диапазоне 0.25..2.05 вольт. Можно заключить, что для корректной работы схемы на рис. 5 требуется Rail-to-Rail ОУ с однополярным питанием от 2.25 и более вольт. Надо лишь обратить внимание на то, что не стоит его поднимать выше напряжения питания МК, чтоб в случае нештатного режима работы схемы исключить попадание на аналоговый вход микроконтроллера слишком большого потенциала.
При необходимости, можно перестроить входной диапазон напряжений до нужного значения, подобрав правильным образом номиналы резисторов в схеме. Более того, эта схема может работать не только как аттенюатор (ослабитель сигнала), но и как усилитель!!! Чем меньше величина резистора R3, тем меньше диапазон входных напряжений, и наоборот. Если R3 выбрать равным 1 ком (и R2 поставить тоже 1 ком, почему так, см. далее) то диапазон входных напряжений уже будет не ±10 вольт, а ±0.1 вольт, а на выходе сигнал будет меняться в тех же пределах, что и в предыдущем случае:
Рис. 9. Схема с перестроенным входным диапазоном. Красный — Uin, зеленый — adc_in
При перенастройки схемы нужно выполнять следующие правила относительно номиналов резисторов :
- R4=R5
- R1 = R4/2=R5/2
- R2=R3
При выполнении этих трех условий схема будет работать правильно в широком диапазоне (в пределах разумного, конечно)) ) значений резисторов.
Есть и готовые микросхемы, выполняющие данные функции, например, INA159. Вот тут на него есть обзор. Но готовые решения не всегда удовлетворяют всем требованиям, и нет возможности тонкой настройки схемы под себя))
Драйвер АЦП, про который я рассказал, хорошо зарекомендовал себя в одной довольно сложной и высокоточной конструкции, поэтому при необходимости буду его пихать везде, где только можно))
Так, на этом, пожалуй, закончу)) Получилось довольно много текста, и на мой взгляд некоторые места слишком занудные. Перечитаю пару раз, может что где поправлю. Всем пока)))
P.S. Кое-что поправил.
P.P.S. 24.05.2019: Уже не помню, каким из пальцев левой ноги я писал эту статью, но в комментах правильно подметили, что коэффициенты суммирования схемы на рис. 5 равны 0.5 и 0.1, а не 0.5 и 0.125. Поправил)))
На рисунке 2 показан делитель на 5, а не на 4.
Действительно, на 5, ошибся. Спасибо! Исправил значение R2
Помогите с заданием: Аналоговый вход некого измерительного прибора расчитан на сигнал диапозона 0-10В. Измерительный канал этого прибора имеет на входе идеальный 10-битный аналого-цифровой преобразователь. Определите величину одного дискрета (шага измерения) по этому измерительному каналу? ВАРИАНТЫ ОТВЕТОВ: а) 1В, б) 1/10В, в) 10/1023В, г) 10/1024В, д) 10/65535В
АЦП 10 бит, это значит, что значение на выходе может меняться от 0 до (2^10) — 1 = 1023, всего 1024 значения. Таким образом, на один отсчет будет приходиться 10/1024 вольт
Почему то у меня при расчете для схемы на рисунке 5 получаются коэффициенты суммирования 0,5 и 0,1 соответственно, а не 0,5 и 0, 125. Поэтому adc_in=(0.5*2.5) + (0.1*Uin). Брал формулы для расчета из 2-х разных источников. Подскажите как правильно посчитать эти коэффициенты.
Поддерживаю, не могу понять как считать их правильно.
Да, действительно 0,5 и 0,1, исправил)))
Почему на рисунке 8 указано,что мы измерили напряжение на АЦП,это же должно быть на ОУ?
Ошибся, там на ОУ надо было написать, исправил))
а «в приделах» и «мерим тут», можно как-то исправить?
по содержательной части вопросов нет, все разжевано просто и красиво!))
«Это я специально допустил ошибку, чтоб проверить вашу внимательность» (c) любой_препод.
Исправил)))
На первый вход подается напряжение опоры, коэффициент суммирования у которого 0.5. Второй вход измерительный, его коэффициент в нашем случае 0.125.
Как получить эти коэффициенты я пробовал разными способами посчитать но таких чисел я получить не могу. Объясните пожалуйста.
Насколько помню, весь «расчет» я делал методом подбора номиналов прямо в протеусе, т.к. было лень. Надо как-нибудь запилить статью с подробным выводом формул для разных схем на ОУ
Все же там 0.5 и 0.1, исправил))
Написал статью по этой теме: http://dimoon.ru/spravochnik/ou/shemy-na-ou-drajver-aczp.html