Работа с АЦП. Аппаратные средства повышения точности

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

АЦП = (Vin * 2n)/Vref
Где, n — разрядность АЦП.
Поэтому желательно использовать специальную микросхему — Источник Опорного Напряжения, например, ADR420 или REF195. Стоить они могут недешево — сотни рублей, но зачастую оно стоит того. Прецизионная аналоговая электроника в принципе не дешевая. По началу я тоже пугался ценам в 500-600 рублей за какой то там усилитель. А сейчас ничего, привык :) Впрочем, в фанатизм впадать не стоит. На худой конец, если используется AVR, точность которой 2МЗР (младший значащий разряд, если забыл) на десяти битах, то можно не заморачиваться с дорогущими ИОН и городить что попроще, например на LM336Z-5.0, включаемых подобно стабилитрону, только куда более точному.

Если совсем лень искать спец деталь, а точность нужна в пределах показометра, то достаточно просто завести на Vref напряжение питания через дроссель в 10..100uH и повесить кондер емкостью 0.1uF на землю, как можно ближе к выводам. На картинке я нарисовал подачу Vref пунктиром, т.к. в данном случае я привожу пример для AVR, а там AREF можно подключить изнутри кристалла, программно.

Разумеется нужно отфильтровать и питание контроллера, поставив блокирующие емкости из керамики в 0.1uF между Vcc и GND, как можно ближе к выводам МК, чтобы помехи, возникающие при переключении логических уровней внутри МК, подавлялись.

Еще надо сделать аналоговую землю, которая будет проходить/окружать всю аналоговую часть, также желательно, чтобы аналоговая земля проходила под микроконтроллером в районе её аналогового порта. Аналоговая земля должна быть как можно более сплошной и не содержать в себе замкнутых контуров. С землей цифровой ее следует соединять в одной точке и как можно дальше от точных цепей.

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

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


Частота среза это такая частота, с которой начинается подавление сигнала. Можно еще и дроссель поставить, последовательно входу.

О фильтрах я еще напишу, а тем кто загорелся фильтровать все подряд я припас две серьезные книжки по фильтрам:

58 thoughts on “Работа с АЦП. Аппаратные средства повышения точности”

  1. Для простых применений я бы рекомендовал опору TL431. 3х-выводный, стоит недорого (брал по 20-30тенге — 0,15-0,25$), нпряжение от 1,2 до 30в, точность для 10бит, да еще при 2 неточных разрядах, за глаза. Нормально работает начиная от долей миллиампера.

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

    может всё таки фильтр низких частот?

    кстати, в sprintLayoyte есть фишка «вычерчивание общей шины». можно ли её использовать для аналоговой земли? и если да, то как (т.к. она вычерчивает автоматически даже попытку соединить её линией с другими элементами ))) ?

      1. Да, люди действительно оговариваются. ФНЧ — есть фильтр нижних частот, а не низких. Даже в Хоровиц&Хилл эта оговорка. В названии «нижних частот» действительно есть смысл, допустим у тебя частота среза сотни мегагерц, язык не поворачивается назвать эти частоты низкими.

        P.S. В плане терминов очень преуспели американцы. Low-pass и никаких гвоздей, тут уж точно не перепутаешь.

        1. сколько себя помню, в инсте их называли равнозначно фильтры низких/нижних и высоких/верхних частот. и вопросов не возникало )
          хотя, например, режет ухо когда называют симметричная матрица, а не симметрическая )

      2. А можно подробнее для… ну в общем, на пальцах объяснить вот это:
        == Еще надо сделать аналоговую землю, которая будет проходить/окружать всю аналоговую часть, также желательно, чтобы аналоговая земля проходила под микроконтроллером в районе её аналогового порта. Аналоговая земля должна быть как можно более сплошной и не содержать в себе замкнутых контуров. С землей цифровой ее следует соединять в одной точке и как можно дальше от точных цепей. ==

        AGND — это шина по перимерту платы, проходящая под ATMega8 а районе выводов AVCC и AREF? Соединять её в том числе с выводом №8 (циф. земля) подальше от микросхемы? Тогда вывод №22 — это аналог. земля?

    1. А вот как хошь так и соединяй. Я обычно просто маркером в нужном месте эту горе заливку соединяю с нужной точкой. И потом травлю.

        1. И действительно не понимаете :)
          В спринте для соединения с заливкой следует проложить отдельную дорожку на заливку и поставить ей нулевую дистанцию (расстояние от заливки до дорожки).
          Дистанция меняется на нижней панели, рядом со значком ground plane.

          1. Вау!!! А я думал, чего это расстояние от дорожек до заливок не меняеются, глюк из версии в версию, а это не бага, это фича. Вручную каждую дорожку можно задавать дистанцию. Круто.

            Гы, попутно нашел как можно писать дырчатый текст.

  3. Да, блин обложили nwanomaly__ со всех сторон. Один со своими «нижними частотами» другой со спринтом. Окружили демоны :)

  4. Можно ли использовать внешний MUX для ацп мк? Например, HC4051.

    В моей корявой макетке импульсного источника есть и RC фильтр ацп и усреднение (по 64-м выборкам). Но всё это ложится, если не учитывать наводки (от самой себя). А думал прокатит))
    Читаю вот это «Уилльямс Т. ЭМС для разработчиков продукции» и тихо подвисаю. Риторический вопрос: какая разница между радиолюбителем и человеком с радиотехническим образованием?

  5. Вопросик. Надо мерять напряжение в диапазоне от 0 до 0.1В. В качестве ИОН — TL431B(0.5%). Что лучше: 1)использовать усиление сигнала 20Х (опция в тайни) и установить ИОН в 2В; или 2) ничего не усилять и поставить ИОН в 0.1В (через делитель на резисторах)??

    1. Усилитель только для дифференциального режима (сравнение напряжения двух каналов АЦП). Если хочешь получить на таких напряжениях что то отличное от «вроде есть, вроде нет» то Тебе надо поставить сюда инструментальный усилитель, внешняя микросхема. Например AD627A или подобный. И на нем резистором задать коэффициент усиления, а выход сожрать обычным АЦП.

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

      1. Да, я так и подразумевал, что будет использоваться дифференциальный режим. Но чем не подходит внутренный усилитель в мк? (AD627ARZ ~10USD :( )

        А вообще вопрос меня интересовал об усиление сигнала vs низкое напржение ИОН.

        1. Не знаю как там у него с точностью.

          Впрочем, стоит попробовать. Но однозначно лучше усиление чем низкий ион.

  6. Вопрос по ИОН.
    Буду использовать TL431. Там с помощью резистивного делителя задаётся значение опорного напряжения. Подбирая значения этих резисторов близкие к расчётным, получаются цепочки из 3-х 4-х номиналов для каждого. Что, если их заменить подстроечными?

    Собственно вопрос: насколько подстроечный резистор держит выставленное значение, и смысл применять его тут в ИОН?

    1. От подстроечника зависит. От его точности.
      В принципе, можно заменить. Вопрос только какая тебе нужна точность?

      Еще подстроечник может чуток плавать от температуры или от механических вибраций.

  7. Вопросик. Поставил на выход AREF атмеги8 ADJ пин микрухи LM336-2.5, запрограммировал контроллер на посылку данных из АЦП на ком порт, включаю устройство принимаются только значения 1023. Что я неправильно сделал? (Напряжение между землей и ADJ замерял 0.98В(хотя должно вроде быть 2.5В). Если поставить чтобы опорное напряжение бралось из AVCC то данные идут нормально)

    1. Щас увидел что не ADJ пин нужно поцеплять, то всеже на выходе AREF стоит напряжение 0.98В, почему же АЦП не работает в режиме внешнего опорного напряжения?

  8. просьба не пинать….
    какой МК посоветуете?
    нужно чтобы были и ЦАП, и АЦП.

    задача такова — сделать генератор синусоиды 20-20кГц с довольно большой точностью.
    ЦАП как выход хочу заюзать, а АЦП на считывание ввода поставить.

    1. 20кгц довольно большая частота, ее же генерить надо. А ЦАП я видел только на ARM Cortex M3 (LPC1343, LPC1751, STM32F103C8 вот в каком то из них)

        1. Выше 8ми бит делать особо нет смысла — там низкая точность и тепловые колебания резисторов угробят всю точность.

              1. то есть плавать?

                вот если взять, скажем, мегу16.
                задать частоту на 8 МГц.
                по заданию макс — 20 кГц.
                то есть по 400 тактов на полное колебание.

                а если оформить изначально какую-то виборку значений. и при загрузке значений на определенную частоту — сделать выборку значений и гонять их в цикле???

                1. В смысле что младшие три значения не будут тем, Что ты запускаешь. Т.е. на дискрете 10бит и 5ти вольтах у тебя ЦАП должен выдавать 1024 ступеньки напряжений. 5/1024 = 0.0049 это вес одной ступеньки. Т.е.

                  1 = 0.0049В
                  2 = 0.0097В и так далее. Это как бы математически

                  1024 = 5В

                  Но изза теплового и точностного разброса резисторов 1 не будет равно 0.0049, он будет чем то сильно приблизительным. И только со значенияя старше 8ми будет что то более менее похоже на правду. Т.е. младшие разряды не будут точными, а значит смысла их делать нет.

                  1. блин, таки я валенок…

                    хорошо, если юзать один порт — тогда получается приблизительно по 0.02вольта…
                    ладно, с этим посмотрим. а вот как организовать алгоритм — вот тут я подвисаю.

                    чего посоветовать можеш?

              2. а может ну его на асме? я еще не силен в нем.
                могЁт на сях написать софтину?
                но после этого баги ловить — замаюсь…

                и таки скажите шо мине делать?

  9. «Если совсем лень искать спец деталь, а точность нужна в пределах показометра, то достаточно просто завести на Vref напряжение питания через дроссель в 100uH и повесить кондер емкостью 0.1uF на землю»

    Уважаемый DI HALT, скажите, пожалуйста, а как определяется значение индуктивности дросселя, которое здесь необходимо? В вашей статье приведено 100uH, в даташитах на контроллеры в схемах питания АЦП указана индуктивность в 10uH. В каких пределах можно ее менять?

    1. Хм. Всегда думал что в даташите 120мкГн дроссель на АЦП. Видимо когда то прочитал что то не то :)

      Вообще дроссель чем больше тем глаже броски тока. И тем стабильней будет питание АЦП. Тут действуют методом разумной достаточности. Т.е. от 10мкгн уже ставить выше нет смысла.

  10. поставил LM336Z-5.0 для питания АЦП ADS1100. Но на выходе LM336Z-5.0 почему то 1,5В.
    В чем может быть проблема?
    Спасибо!

  11. «…Аналоговая земля должна быть соединена с землей цифровой в одной точке…»
    А как сделать вольтметр, у которых они не соединены? Ведь возьмем самый обычный тестер, — у него два вывода и для использования его совсем не нужно какой-либо из них цеплять именно на землю измеряемого сигнала!

    1. У вольтметра на щуп идет аналоговая земля скорей всего. А цифровая земля (от процессора) отдельно, внутри она. И где то они соединены в одной точке.

      1. Как это? Вот только что своим тестером замерил напряжение на участке электрической цепи: один щуп приложил к точке с потенциалом 4.0 В, другой щуп — к точке 3.2 В. Тестер мне выдал значение — 0.8 В. Земли данной электрической схемы (аналоговой земли) я не касался в принципе!

        1. Причем тут земля твоей аналоговой цепи и вольтметр? У вольтметра своя земля. И за ее потенциал он берет потенциал своего черного щупа.

          1. Не подскажешь как это реализуется (устройство за потенциал земли берет не 0 своего питания, а потенциал другой точки, «черного щупа»)?

            1. Так у него же есть свое питание, а АЦП пофигу что замерять. Он меряет потенциал относительно нуля своего питания, которое выведено на черный щуп. И куда его воткнули не имеет значение.

              Кури ТОЭ и потенциальные диаграммы. А также падения напряжения при протекании тока через сопротивления.

  12. ТОЭ я обкурен, — дым из ушей валит). А все равно не пойму: для того чтобы измерить разность потенциалов двух точек с помощью АЦП по идее необходимо три щупа: 1-ый щуп соединить землю вольтметра с аналоговой землей, 2-ой — приложить к точке №1, 3-ий — приложить к точке №2. Потенциал для каждой точки измеряется относительно земли. Разность потенциалов и есть напряжение между двумя точками.
    Как тестер обходится двумя щупами и как это реализовать?

    1. Хреново курил, не пробрало. Пыхни еще раз.

      Повторяю еще раз. У тестера СВОЕ СОБСТВЕННОЕ ПИТАНИЕ. Своя батарейка. И его земля не привязана к земле измеряемой схемы. Он за землю принимает ту точку куда мы ткнули черным щупом. Куда мы ее ткнули относительно земли измеряемой схемы совершенно не важно — т.к. ему главное замерить потенциал относительно своей земли.

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

      1. Курнул мимоходом даташит на МК и осенило: чтобы тестер принял за землю черный щуп, нужно аналоговую землю прицепить на AGND, т.е. agnd не цеплять к gnd микроконтроллера. До этого я agnd и gnd соединял между собой, от того и получался кавардак. Спасибо за совет пыхнуть)))

  13. Здравствуй, DI HALT! Вопрос: питание 5 Вольт через дроссель 100 мкГн. Может стоит поставить защитный диод? И если нет, насколько это критично?

  14. Добрый день.
    Собираю первое устройство на микроконтроллере и возникла проблема, на текущий момент самому справиться не получается.
    Все собрано на макетке breadboard, разделение земель на аналоговую и цифровую пока нет.
    Использую atmega8 (внутренне тактирование 4MHz ), питание на VCC подается с «кроны» через LM7805 (кондеры в обвязке есть), кондер между VCC и GND — 100nF (около ножек), кондер между AVCC и AGND тоже 100nF (тоже рядом с ножками).
    AVCC заведено с VCC через дроссель 10uH и кондер 100nF на землю (как по даташиту).
    Опорное напряжение на AREF заведено с LM7805, потом через TL431(из резисторов обвязки — только токоограничивающий 100R, в итоге опора выдает 2.5V), потом какой то мелкий диод (диод использую для снижения напряжения), в итоге на AREF получается 2,22V. В схеме присутствует LED индикатор WEH001202ALPP5N00000, на всякий случай на его питание тоже поставил кондер 100nF.

    ADC последовательно переключает каналы (в режиме одиночного преобразования), используется усреднение по 64 замерам. На текущий момент датчик (сигнал с датчика усиляется на LM358 и на выходе имеем 100mV) подключен только к каналу 0, все остальные выводы ADC висят в воздухе (в дальнейшем предполагается именно такое использование — т.к. возможно подключение от одного до шести датчиков).
    В таком режиме работы напряжение на AREF скачет с 2,22V до 2,02V (замерено китайским мультиметром, более продвинутых приборов нет) — соответственно результат измерения отличается от расчетного (при расчете закладываю AREF=2,22V), и тут интересно то, что результат измерения по времени стабилен и меняется всего на 2mV (от 96mV до 98mV, при расчетном значении — 92mV).
    Также запускал ADC без переключения каналов. Вход настраивал на внутреннюю землю. При этом ADC выдавал значение 0 или 1, что при данном напряжении на AREF соответствует 0-2mV. Вот тут тоже не понятно — это погрешности измерений или земля прыгает на 2mV.

    И вот тут самое интересное — если земля прыгает на 2mV, то возможно это будет устранено при разделении цифровой и аналоговой земель. Тогда имеем — ADC выдает 96mV вместо расчетных 92mV. И если посчитать AREF как среднее между 2,22V и 2,02V, т.е. 2,12V, то при входных 100mV с датчика ADC должно выдать 96mV — что в принципе я и получаю. Возможно это какая то «магия чисел», и я получаю вообще белиберду.

    У меня вопрос — какова причина скачков напряжения на TL431? Интересует именно причина, т.к. в дальнейшем вместо TL431 будет использоваться опорник REF191GS, возможно и с ним будут такие дела.
    И как эти скачки возможно устранить? (По даташиту на TL431 на его выход можно повесить небольшой кондер в районе 10nF, иначе можно попасть в зону нестабильности. Кондер пока не вешал).

    1. Скачки на AREF практически получилось снизить, на текущий момент напряжение скачет на 10mV. Что практически устранило неточности обработки сигнала. При входных 100(+-0,1)mV, после обработки данных с ADC (т.е. усреднение), получаются стабильные по времени 98mV. Куда делись 2mV пока остается загадкой.

      Причиной оказался диод, проблему решил резистор 50K подключенный с катода диода на землю. Суть процесса мне осталась непонятной, на радиокоте прочитал, что падение на диоде зависит от протекающего по нему тока (хотя с этим не все были согласны). Резистор, подключенный параллельно ADC обеспечивает необходимый ток через диод (на момент пока нагрузка не подключена). Хотя по логике вещей должно все происходить с точностью до наоборот — разность потенциалов на диоде должна задавать ток (естественно с учетом «преодоления» барьера n-p перехода). С этой точки зрения получается что резистор «подсаживает» катод на землю, тем самым полностью его открывает — и падение напряжения на диоде становится постоянной величиной. Без резистора получатся, что диод полностью открывается только в момент потребления тока на AREF (как я представляю — в момент начала преобразования на ADC, когда на DAC устанавливается напряжение, равное половине напряжения на AREF). Вот в этот момент обеспечивается необходимая разность потенциалов на аноде и катоде и диод открывается полностью, что и приводит к скачкам напряжения. Это мои «фантазии», т.к. я в этом разбираюсь чуть меньше, чем ничего, и если все происходит по другой причине, то поправьте.

      В дальнейшем вместо диода с резистором поставил делитель напряжения из многооборотистого подстроечного резистора на 100K. Скачки на AREF снова вернулись, размах стал еще больше первоначальных 200mV. Проблему снизила постановка подстроечника на 1К. В этом случае в голову приходят мысли, что для ADC не хватает тока, т.к. по даташиту он равен где-то 250-350 uA. Это опять мои «фантазии», и если тут есть компетентные специалисты, то поправьте.

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

  15. А как интересно обрабатывается очередь прерываний в этой проге? смотрите — после запуска программы понятно,что сразу программа уйдет на ADC_OK .но потом когда мы по УАРТу отправим байт ‘r’ и в прерывании RXC_OK эхом активируем передачу TXC_OK ,то по идее проц должен бы зациклиться на прерывании TXC_OK , у него то вектор выше чем у ADC_OK. а тем не менее ацп все равно продолжает выдавать свои новые значения. вот хотелось бы узнать в чем тут собака зарыта….

    1. «А как интересно обрабатывается очередь прерываний в этой проге?»

      Как я понял — когда по УАРТу «отправлен» байт «R», то начинается его передача. Байт передается побитно, и довольно на медленной скорости, во время передачи байта возможны другие прерывания (команда RETI на выходе из процедуры UART_RX как раз и разрешает прерывания). Как только все 8 битов переданы, только тогда аппаратно «вызывается» прерывание на передачу следующего байта. Вот во время передачи каждого байта по УАРТу и вызывается ADC_OK по прерыванию в непрерывном режиме (естественно после первичного запуска АЦП в процедуре UART_RX, вот в этом месте: OUTI ADCSRA,(1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADFR)|(3<<ADPS0)).

    1. спасибо за ответ. кажись понял — по UART_TX только запихивается байт в регистор передатчика. и флаг TXC тут же снимается . и пока передается этот байт .то тем временем успевает попользоваться прерывание ADC_OK .

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

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha