Программирование ацп микроконтроллера avr. Общий принцип работы ацп. Управление входным мультиплексором в моделях Atmega8x

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

Определение

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

Характеристики АЦП

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

Типы АЦП

Принцип работы разнится у различных групп устройств. Мы рассмотрим следующие типы:

  1. С прямым преобразованием.
  2. С последовательным приближением.
  3. С параллельным преобразованием.
  4. Аналого-цифровой преобразователь с балансировкой заряда (дельта-сигма).
  5. Интегрирующие АЦП.

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

Прямые аналого-цифровые преобразователи

Они стали весьма популярными в 60-70-х годах прошлого столетия. В виде производятся с 80-х гг. Это весьма простые, даже примитивные устройства, которые не могут похвастаться значительными показателями. Их разрядность обычно составляет 6-8 бит, а скорость редко превышает 1 GSPS.

Принцип работы АЦП данного типа таков: на плюсовые входы компараторов одновременно поступает входной сигнал. На минусовые выводы подается напряжение определённой величины. А затем устройство определяет свой режим работы. Это делается благодаря опорному напряжению. Допустим, что у нас есть устройство, где 8 компараторов. При подаче ½ опорного напряжения будет включено только 4 из них. Приоритетным шифратором сформируется который и зафиксируется выходным регистром. Относительно достоинств и недостатков можно сказать, работы позволяет создавать быстродействующие устройства. Но для получения необходимой разрядности приходится сильно попотеть.

Общая формула количества компараторов выглядит таким образом: 2^N. Под N необходимо поставить количество разрядов. Рассматриваемый ранее пример можно использовать ещё раз: 2^3=8. Итого для получения третьего разряда необходимо 8 компараторов. Таков принцип работы АЦП, которые были созданы первыми. Не очень удобно, поэтому в последующем появились другие архитектуры.

Аналого-цифровые преобразователи последовательного приближения

Здесь используется алгоритм «взвешивания». Сокращенно устройства, работающие по такой методике, называют просто АЦП последовательного счета. Принцип работы таков: устройством измеряется величина входного сигнала, а потом она сравнивается с числами, которые генерируются по определённой методике:

  1. Устанавливается половина возможного опорного напряжения.
  2. Если сигнал преодолел предел величины из пункта №1, то сравнивается с числом, которое лежит посредине между оставшимся значением. Так, в нашем случае это будет ¾ опорного напряжения. Если опорный сигнал не дотягивает до этого показателя, то сравнение будет проводиться с другой частью интервала по такому же принципу. В данном примере это ¼ опорного напряжения.
  3. Шаг 2 необходимо повторить Н раз, что даст нам Н бит результата. Это благодаря проведению Н количества сравнений.

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

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

Они работают подобно последовательным устройствам. Формула расчета - (2^Н)-1. Для рассматриваемого ранее случая нам понадобится (2^3)-1 компараторов. Для работы используется определённый массив этих устройств, каждое из которых может сравнивать входное и индивидуальное опорное напряжение. Параллельные аналого-цифровые преобразователи являются довольно быстрыми приборами. Но принцип построения этих устройств таков, что для поддержки их работоспособности необходима значительная мощность. Поэтому использовать их при батарейном питании нецелесообразно.

Аналого-цифровой преобразователь с поразрядным уравновешиванием

Он действует по похожей схеме, что и предыдущее устройство. Поэтому чтобы объяснить функционирование АЦП поразрядного уравновешивания, принцип работы для начинающих будет рассмотрен буквально на пальцах. В основе данных устройств лежит явление дихотомии. Иными словами, проводится последовательное сравнение измеряемой величины с определённой частью максимального значения. Могут браться значения в ½, 1/8, 1/16 и так далее. Поэтому аналого-цифровой преобразователь может выполнить весь процесс за Н итераций (последовательных шагов). Причем Н равняется разрядности АЦП (посмотрите на ранее приведённые формулы). Таким образом, мы имеем значительный выигрыш во времени, если особенно важным является быстродействие техники. Несмотря на значительную скорость, эти устройства также характеризуются низкой статической погрешностью.

Аналого-цифровые преобразователи с балансировкой заряда (дельта-сигма)

Это самый интересный тип устройства, не в последнюю очередь благодаря своему принципу работы. Он заключается в том, что происходит сравнение входного напряжения с тем, что накопилось интегратором. На вход подаются импульсы с отрицательной или положительной полярностью (всё зависит от результата предыдущей операции). Таким образом, можно сказать, что подобный аналого-цифровой преобразователь является простой следящей системой. Но это только как пример для сравнения, чтобы вы могли понимать, АЦП. Принцип работы системный, но для результативного функционирования этого аналого-цифрового преобразователя мало. Конечным результатом является нескончаемый поток единиц и нулей, который идёт через цифровой ФНЧ. Из них формируется определённая битная последовательность. Различают АЦП-преобразователи первого и второго порядков.

Интегрирующие аналого-цифровые преобразователи

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

Теперь давайте сосредоточимся на его принципе работы. Он заключается в том, что входным сигналом заряжается конденсатор на протяжении фиксированного времени. Как правило, этот период составляет единицу частоты сети, которая питает устройство (50 Гц или 60 Гц). Также он может быть кратным. Таким образом, подавляются высокочастотные помехи. Одновременно нивелируется влияние нестабильного напряжения сетевого источника получения электроэнергии на точность полученного результата.

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

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

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

Выбираем АПЦ с необходимым нам принципом работы

Допустим, перед нами стоит определенная задача. Какое выбрать устройство, чтобы оно могло удовлетворить все наши запросы? Для начала давайте поговорим про разрешающую способность и точность. Очень часто их путают, хотя на практике они очень слабо зависят один от второго. Запомните, что 12-разрядный аналого-цифровой преобразователь может иметь меньшую точность, чем 8-разрядный. В этом случае разрешение - это мера того, какое количество сегментов может быть выделено с входного диапазона измеряемого сигнала. Так, 8-разрядные АЦП обладают 2 8 =256 такими единицами.

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

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

Пример

Давайте рассмотрим АЦП SC9711. Принцип работы данного устройства сложен ввиду его размера и возможностей. Кстати, говоря о последних, необходимо заметить, что они по-настоящему разнообразные. Так, к примеру, частота возможной работы колеблется от 10 Гц до 10 МГц. Иными словами, оно может делать 10 млн отсчетов в секунду! Да и само устройство не является чем-то цельным, а имеет модульную структуру построения. Но используется оно, как правило, в сложной технике, где необходимо работать с большим количеством сигналов.

Заключение

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

Многие AVR имеют на борту АЦП последовательного приближения.
АЦП это десятиразрядное, но при точности +/- 2 минимально значащих разрядов его можно смело считать восьмиразрядным:) Так как в младших двух разрядах всегда мусор какой то, не похожий на полезный сигнал. Тем не менее это неплохой инструмент для контроля напряжения, в восьмиразрядном режиме имеющий 256 отсчетов и выдающее частоту дискретизации до 15кГц (15 тысяч выборок в секунду).

Конфигурация источника
Сигнал в АЦП подается через мультиплексор, с одного из восьми (в лучшем случае, часто бывает меньше) входов. Выбор входа осуществляется регистром ADMUX , а точнее его битами MUX3…MUX0 . Записанное туда число определяет выбраный вход. Например, если MUX3..0 = 0100 , то подключен вывод ADC4 .

Кроме того, существует несколько служебных комбинаций битов MUX , использующихся для калибровки.
Например, 1110 подключает к АЦП внутренний источник опорного напряжения на 1.22 вольта . А если записать в MUX3..0 все единицы, то АЦП будет изнутри посажено на землю. Это полезно для выявления разных шумов и помех.

У старших AVR семейства Mega (8535, 16, 32, 128) есть возможность включить АЦП в режиме дифференциального входа . Это когда на два входа приходят разные напряжения. Одно вычитается из другого, да еще может умножаться на коэффициент усиления. Зачем это нужно? А, например, когда надо замерить перекос напряжения измерительного моста. У какого-нибудь тензомоста при входном напряжении в пять вольт выходные сигналы будут различаться между собой всего лишь 30мВ, вот и поймай его. А так подал на диф вход, подогнал нужный коэффициент усиления и красота!

Таблицу значений MUX3..0 для диф включения я не буду тут приводить, она находится легко в даташите, зовется она «Input Channel and Gain Selections «. Я поясню лишь один тонкий момент. В режиме выбора диф входа встречаются такие комбинации как: первый вход ADC0 и второй вход тоже ADC0 ну и коэффициент усиления еще. Как так? Ведь для диф входа нужно два разных входа! Вначале подумал опечатка, поднял даташит на другую АВРку — та же ботва. Потом повтыкал в текст ниже и понял — это для калибровки нуля. Т.е. перед началом съема диф данных нам нужно закоротить входы, чтобы понять, что же у нас ноль. Так вот, комбинация когда два входа подключены к одной ноге это и есть та самая калибровочная закоротка входов. Делаешь первое преобразование на такой фигне, получаешь смещение нуля . А потом вычитаешь его из всех полученных значений, что резко повышает точность.

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

Выбор опорного сигнала
Это максимальное напряжение, которое будет взято за максимум при измерениях. Опорное напряжение должно быть как можно стабильней, без помех и колебаний — от этого кардинальным образом зависит точность работы АЦП . Задается он в битах REFS1..0 регистра ADMUX .

  • По дефолту там стоит REFS1..0 = 00 — внешний ИОН , подключенный к входу AREF . Это может быть напряжение со специальной микросхемы опорного напряжения, или же со стабилитрона какого, если нужно замерять небольшое напряжение, заметно меньшее чем напряжение питания, скажем от 0 до 1 вольт, то чтобы было точнее, и чтобы оно не затерялось на фоне пятивольтового питания, то на AREF мы заводим опорное напряжение в 1 вольт.
  • REFS1..0 = 01 — тут просто берется напряжение питания. У всех почти Мег с АЦП есть вход AVCC — вот это напряжение питания для AЦП и порта на который это АЦП повешено. Подавать туда плюс питания желательно через LC фильтр, чтобы не было искажений.
  • REFS1..0 = 11 — внутренний источник опорного напряжения на 2.56 вольт . Честно говоря, качество этого источника мне сильно не понравилось. С ним показания АЦП плавают как говно в проруби. Но если невозможно обеспечить гладкую и стабильную подачу напряжения на AREF или AVCC то прокатит. Кстати, внутренний ИОН подключен к выводу AREF так что можно повесить туда кондер и попробовать его чуть чуть сгладить. Немного, но помогает.
Выбор режима запуска преобразования
В регистре SFIOR под АЦП отведено аж три бита. ADTS2..0 которые управляют режимами запуска АЦП .
  • По дефолту ADTS2..0 = 000 и это значит, что преобразование идет в непрерывном режиме. Ну или по ручному запуску.
  • ADTS2..0 = 001 — запуск АЦП от аналогового компаратора. Удобно блин. Например, чтобы не замерять постоянно входную величину, а запрограммировать компаратор на то, что как только у него вылезет что-либо выше порога, так тут же захватывать это дело на АЦП .
  • ADTS2..0 = 010 — запуск от внешнего прерывания INT0
  • ADTS2..0 = 011 — по совпадению таймера T0
  • ADTS2..0 = 100 — по переполнению таймера Т0
  • ADTS2..0 = 101 — по совпадению с таймера Т1
  • ADTS2..0 = 110 — По переполнению таймера Т1
  • ADTS2..0 = 111 — По событию «захват» таймера Т1
Скорость работы АЦП
Частота выборки АЦП задается в битах предделителя ADPS2…0 регистра ADCSR . Саму таблицу можно поглядеть в даташите на соответствующий МК, скажу лишь то, что самая оптимальная точность работы модуля АЦП находится в пределах 50…200кГц , поэтому предделитель стоит настраивать исходя из этих соображений. С повышением частоты точность падает.

Прерывания.
Естественно у АЦП есть прерывания. В данном случае это прерывание по окончанию преобразования. Его можно разрешить битом ADIE , а внаглую вручную палится оно по флагу ADIF (регистр ADCSRA ). Флаг ADIF автоматом снимается при уходе на вектор прерывания по АЦП .

Данные с АЦП сваливаются в регистровую пару ADCH:ADCL откуда их можно забрать. Причем тут есть один прикольный момент. Регистровая пара то у нас ведь 16ти разрядная, а АЦП имеет разрядность 10бит . В итоге, лишь один регистр занят полностью, а второй занимает лишь оставшиеся два бита. Так вот, выравнивание может быть как по правому краю — старшие два бита в ADCH , а младшие в ADCL , либо по левому — старшие биты в ADCH , а два младших бита в ADCL .

[x][x][x][x][x][x]: или : [x][x][x][x][x][x]


Зачем это сделано? А это выборка разрядности так оригинально организована. Как я уже говорил, в младших разрядах все равно мусор и шумы (по крайней мере я от них так и не смог избавиться, как ни старался) . Так вот. Делаем выравнивание по левому краю. И загребаем старшие разряды только из регистра ADCH , а на младший забиваем. Итого, у нас число отсчетов становится 256. За выравнивание отвечает бит ADLAR в регистре ADMUX 0 — выравнивание по правой границе, 1 — по левой.

Запуск преобразования в ручном или непрерывном режиме.
Для запуска преобразования нужно вначале разрешить работу ADC , установкой бита ADEN в регистре ADCSR и в том же регистре ткнуть в бит ADSC . Для запуска непрерывного преобразование (одно за другим) нужно также выставить бит ADFR (ADATE в некоторых AVR ).

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

А теперь приведу парочку примеров простой инициализации и работы с АЦП . Микроконтроллер ATMega16

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <Сигнал на вход идет с нулевого канала АЦП.

; Мой любимый макрос для записи в порты:)))) .MACRO outi LDI R16,@1 OUT @0,R16 .ENDM ; ADC Init - Инициализурем АЦП. Это можно сунуть куда - нибудь в начало кода OUTI ADCSRA,(1<Сигнал на вход идет с нулевого канала АЦП.

А что дальше делать? А ничего! Сидеть и ждать прерывания!
Когда оно придет процессор кинет на вектор и дальше уже можно либо переписать данные из ADCH:ADCL в другое место, либо какую простенькую обработку тут же, не отходя от кассы, замутить. Вроде усреднения.

Вариант два, с уходом в спячку. В принципе, все то же самое, только нужно выключить автоматический перезапуск конвертирования. Далее в регистре MCUCR в битах SM2..0 выбрать режим ADC Noise Reduction SM2..0 = 001 , а после, сразу же после запуска послать процессор в спячку командой SLEEP . Как только он уснет заработает АЦП, сделает преобразование и проснется на прерывании.

Выглядит это так:

; ADC Init - Инициализурем АЦП. Это можно сунуть куда - нибудь в начало кода OUTI ADMUX,0b01000101 ;А тут выбираем откуда брать будем сигнал;REFS -- 0b000101 первые два бита - напряжение с входа AVCC ;ADLAR --0b0100101следующий бит выравнивание по правому краю;MUX -- 0b010Сигнал на вход идет с 5й ноги. OUTI MCUCR,0b10010000 ; Выставил биты спящего режима в Noise Reduction ; А это уже тело главной программы Main Prog: OUTI ADCSRA,(1<

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

Аналого-цифровые преобразователи (АЦП) являются устройствами, которые принимают входные аналоговые сигналы и генерируют соответствующие им цифровые сигналы, пригодные для обработки микропроцессорами и другими цифровыми устройствами. АЦП входит во многие современные модели МК AVR , он многоканальный. Обычно число каналов равно 8, но в разных моделях оно может варьировать от 4 каналов в младших моделях семейства Tiny, 6 в ATmega8, до 16 каналов в ATmega2560.

Многоканальность означает, что на входе единственного модуля АЦП установлен аналоговый мультиплексор, который может подключать этот вход к различным выводам МК для осуществления измерений нескольких независимых аналоговых величин с разнесением по времени. Входы мультиплексора могут работать по отдельности (в несимметричном режиме для измерения напряжения относительно "земли") или (в некоторых моделях) объединяться в пары для измерения дифференциальных сигналов. Иногда АЦП дополнительно снабжается усилителем напряжения с фиксированными значениями коэффициента усиления 10 и 200.

Сам АЦП представляет собой преобразователь последовательного приближения с устройством выборки-хранения и фиксированным числом тактов преобразования, равным 13 (или 14 для дифференциального входа; первое преобразование после включения потребует 25 тактов для инициализации АЦП ). Тактовая частота формируется аналогично тому, как это делается для таймеров- с помощью специального предделителя тактовой частоты МК, который может иметь коэффициенты деления от 1 до 128. Но в отличие от таймеров, выбор тактовой частоты АЦП не совсем произволен, т. к. быстродействие аналоговых компонентов ограничено. Поэтому коэффициент деления следует выбирать таким, чтобы при заданном "кварце" тактовая частота АЦП укладывалась в рекомендованный диапазон 50-200 кГц (т. е. максимум около 15 тыс. измерений в секунду). Увеличение частоты выборки допустимо, если не требуется достижение наивысшей точности преобразования.

Разрешающая способность АЦП в МК AVR - 10 двоичных разрядов, чего для большинства типовых применений достаточно. Абсолютная погрешность преобразования зависит от ряда факторов и в идеальном случае не превышает ±2 младших разрядов, что соответствует общей точности измерения примерно 8 двоичных разрядов. Для достижения этого результата необходимо принимать специальные меры: не только "вгонять" тактовую частоту в рекомендованный диапазон, но и снижать по максимуму интенсивность цифровых шумов. Для этого рекомендуется, как минимум, не использовать оставшиеся выводы того же порта, к которому подключен АЦП, для обработки цифровых сигналов, правильно разводить платы, а как максимум - дополнительно к тому еще и включать специальный режим ADC Noise Reduction .

Регистры управления АЦП

ADCSR

Режим непрерывных измерений активизируется установкой бита ADFR (бит 5) этого же регистра. В ряде моделей Mega этот бит носит наименование ADATE , и управление режимом работы производится сложнее: там добавляются несколько режимов запуска через различные прерывания (в т. ч. прерывание от компаратора, при наступлении различных событий от таймера и т. п.), и выбирать их следует, задавая биты ADTS регистра SFIOR , а установка бита ADATE разрешает запуск АЦП по этим событиям.

Разряд Название Описание
5 ADFR(ADATE) Выбор режима работы АЦП

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

ADTS2 ADTS1 ADTS0 Источник стартового сигнала
0 0 0 Режим непрерывного преобразования
0 0 1 Прерывание от аналогового компаратора
0 1 0 Внешнее прерывание INT0
0 1 1 Прерывание по событию "Совпадение" таймера/счетчика Т0
1 0 0 Прерывание по переполнению таймера/счетчика Т0
1 0 1 Прерывание по событию "Совпадение" таймера/счетчика Т1
1 1 0 Прерывание по переполнению таймера/счетчика Т1
1 1 1 Прерывание по событию "Захват" таймера/счетчика Т1

Если выбран режим запуска не от внешнего источника, то преобразование запускается установкой бита ADSС (бит 6). При непрерывном режиме установка этого бита запустит первое преобразование, затем они будут автоматически повторяться. В режиме однократного преобразования, а также независимо от установленного режима при запуске через прерывания (в тех моделях, где это возможно) установка бита ADSС просто запускает одно преобразование. При наступлении прерывания, запускающего преобразование, бит ADSС устанавливается аппаратно. Отметим, что преобразование начинается по-фронту первого тактового импульса (тактового сигнала АЦП, а не самого контроллера!) после установки ADSС . По окончании любого преобразования (и в одиночном, и в непрерывном режиме) устанавливается бит ADIF (бит 4. флаг прерывания). Разрешение прерывания АЦП осуществляется установкой бита ADIE (бит 3) все того же регистра ADCSR/ADCSRA .

Для работы с АЦП необходимо еще установить его тактовую частоту. Это делается тремя младшими битами регистра ADCSR/ADCSRA под названием ADPS0..2. Коэффициент деления частоты тактового генератора МК устанавливается по степеням двойки, все нули в этих трех битах соответствуют коэффициенту 2, все единицы - 128. Оптимальная частота преобразования лежит в диапазоне 50-200 кГц, так что, например, для тактовой частоты МК, равной 4 МГц, коэффициент может иметь значение только 32 (состояние битов ADPS0..2 = 101, частота 125 кГц) или 64 (состояние битов ADPS0..2 = 110, частота 62,5 кГц). При тактовой частоте 16 МГц в допустимый диапазон укладывается только коэффициент 128.

ADPS2 ADPS1 ADPS0 Коэффициент деления
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

Ниже приведена таблица с описанием регистра ADMUX.



Выборка источника опорного напряжения производится битами REFS1..0 регистра ADMUX (старшие биты 7 и 6), причем их нулевое значение (по умолчанию) соответствует внешнему источнику. Напряжение этого внешнего источника может лежать в пределах от 2 В до напряжения питания аналоговой части AVcc (а оно, в свою очередь, не должно отличаться от питания цифровой части более чем на 0,3 В в большую или меньшую сторону). Можно выбрать в качестве опорного и питание самой аналоговой части, причем двояким способом: либо просто соединить выводы AREF и AVcc микросхемы, либо установить биты REFS1..0 в состояние 01 (тогда соединение осуществляется внутренними схемами, но заметим, что внешний опорный источник при этом должен быть отключен). Предусмотрен и встроенный источник (задается REFS1..0 в состоянии 11, при этом к выводу AREF рекомендуется подключать фильтрующий конденсатор), имеющий номинальное напряжение 2,56В с большим разбросом от 2,4 до 2,7 В.

REFS1 REFS0 Источник опорного напряжения
0 0 Внешний ИОН, подключенный к выводу AREF, внутренний ИОН отключен
0 1 Напряжение питания AVcc*
1 0 Зарезервировано
1 1 Внутренний ИОН напряжением 2,56V, подключенный к ввыводу AREF*
*Если к выводу AREF подключен источник напряжения, данные варианты использоваться не могут

Результат преобразования АЦП оказывается в регистрах ADCH:ADCL . Поскольку результат 10-разрядный, то по умолчанию старшие 6 битов в регистре ADCH оказываются равными нулю. Чтение этих регистров производится, начиная с младшего ADCL , после чего регистр ADCH блокируется, пока не будет прочитан. Следовательно, даже если момент между чтением регистров попал на фронт 14 (15) такта АЦП, когда данные в них должны меняться, значения прочитанной пары будут соответствовать друг другу, пусть и результат этого преобразования пропадет. В противоположном порядке читать эти регистры не рекомендуется. Но бит ADLAR (бит 5 регистра ADMUX ) предоставляет интересную возможность: если его установить в 1, то результат преобразования в регистрах ADCH:ADCL выравнивается влево: бит 9 результата окажется в старшем бите ADCH , а незначащими будут младшие 6 битов регистра ADCL . В этом случае, если хватает 8-разрядного разрешения результата, можно прочесть только значение ADCH .

class="eliadunit">

Выбор каналов и режимов их взаимодействия в АЦП производится битами MUX0..3 в регистре ADMUX . Их значения выбирают нужный канал в обычном (недифференциальном) режиме, когда измеряемое напряжение отсчитывается от "земли". Последние два значения этих битов для семейства Mega (11110 и 11111 в большинстве моделей или 1110 и 1111 для ATmega8) выбирают режимы, когда вход АЦП подсоединяется к опорному источнику компаратора (1,22 В) или к "земле" соответственно, что может использоваться для автокалибровки устройства.

Управление входным мультиплексором в моделях Atmega8x

MUX3-MUX0 Несимметричный вход
0000 ADC0
0001 ADC1
0010 ADC2
0011 ADC3
0100 ADC4*
0101 ADC5*
0110 ADC6**
0111 ADC7**
1000-1101 Зарезервировано
1110 1,22V
1111 0V(GND)

*8-ми разрядное преобразование

**Имеются только в корпусах TQFP-32 и MLF-32.

Остальные комбинации разрядов MUX предназначены для установки различных дифференциальных режимов - в тех моделях, где они присутствуют, в других случаях эти биты зарезервированы (как в моделях Atmega8, ATmega163 и др.). В дифференциальном режиме АЦП измеряет напряжение между двумя выбранными выводами (например, между ADC0 и ADC1 ), причем не все выводы могут быть в таком режиме задействованы. В том числе дифференциальные входы АЦП можно подключать к одному и тому же входу для коррекции нуля. Дело в том, что в ряде моделей на входе АЦП имеется встроенный усилитель, с коэффициентом 1х, 10х и 200х (коэффициент выбирается теми же битами MUX0..4 ), и такой режим используется для его калибровки - в дальнейшем значение выхода при соединенных входах можно просто вычесть.

После завершения преобразования (при установке в «1» флага ADIF регистра ADCSR ) его результат сохраняется в регистре данных АЦП . Поскольку АЦП имеет 10 разрядов, этот регистр физически размещен в двух регистрах ввода/вывода ADCH:ADCL , доступных только для чтения. По умолчанию результат преобразования выравнивается вправо (старшие 6 разрядов регистра ADCH - незначащие). Однако он может выравниваться и влево (младшие 6 разрядов регистра ADCL - незначащие). Для управления выравниванием результата преобразования служит разряд ADLAR регистра ADMUX . Если этот разряд установлен в «1», результат преобразования выравнивается по левой границе 16-разрядного слова, если сброшен в «0» - по правой границе.

Обращение к регистрам ADCH и ADCL для получения результата преобразования должно выполняться в определенной последовательности: сначала необходимо прочитать регистр ADCL , а затем ADCH . Это требование связано с тем, что после обращения к регистру ADCL процессор блокирует доступ к регистрам данных со стороны АЦП до тех пор, пока не будет прочитан регистр ADCH. Благодаря этому можно быть уверенным, что при чтении регистров в них будут находиться составляющие одного и того же результата. Соответственно, если очередное преобразование завершится до обращения к регистру ADCH , результат преобразования будет потерян. С другой стороны, если результат преобразования выравнивается влево и достаточно точности 8-разрядного значения, для получения результата можно прочитать только содержимое регистра ADCH .

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

Ка = 1024Uвх/Uref

Где Ка - значение выходного кода АЦП, Uвх и Uref - входное и опорное напряжения.

Дифференциальному измерению соответствует такая формула:

Ка = 512(Upos - Uneg)/Uref

Где Upos и Uneg - напряжения на положительном и отрицательном входах соответственно. Если напряжение на отрицательном входе больше, чем на положительном, то результат в дифференциальном режиме становится отрицательным и выражается в дополнительном коде от $200 (-512) до $3FF (-1). Реальная точность преобразования в дифференциальном режиме равна 8 разрядам.

Делаем светодиодный индикатор напряжения

Для практического изучения АЦП напишем программу светодиодного индикатора напряжения. Как и в прошлых примерах будем использовать микроконтроллер Atmega8. Восемь индикаторов подключаем к порту D контроллера, это будет линейная шкала уровня сигнала от 0 до 5V. Входом АЦП у нас будет вывод PC0(ADC0), к которому через переменный резистор сопротивлением 10кОм подается напряжение. Схема устройства представлена ниже:

К точности АЦП в этом устройстве предъявляются наименьшие требования. Источником опорного напряжения служит напряжение питания микроконтроллера - 5 Вольт, для этого вывод AREF соединяем с выводом Vcc микроконтроллера, также поступаем с выводами питания аналоговой части AVcc и AGND , подключаем их к плюсу и минусу соответственно, в программе битами REFS1 и REFS0 задаем источник ИОН .

Режим индикации работает следующим образом: после окончания преобразования, которое работает в непрерывном режиме, считываем биты ADCH и ADCL . Это значение потом сравниваем с предварительно расчитанными константами. Если значение ADC больше константы загорается один светодиод, если значение ADC больше второй константы загораются уже два светодиода и т.д.

Константы высчитываются так: так как АЦП 10-ти битный, число 1024 раскладываем на 8 равных частей, а по формуле уже вычисляем эти значения в Вольтах.

1020...5V(приблизительно)

Полный код программы показан ниже. Частота тактового генератора контроллера 8MHz.

/*** Использование АЦП. Светодиодная шкала ***/ #include #include int main (void) { DDRD = 0xFF; PORTD = 0x00; /*** Настройка АЦП ***/ ADCSRA |= (1 << ADEN) // Включение АЦП |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8 ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН |(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0 while(1) { unsigned int u; ADCSRA |= (1 << ADSC); // Начинаем преобразование while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования u = (ADCL|ADCH << 8); // Считываем ADC if (u > 128) // 0.625V PORTD = 0b00000001; else PORTD = 0b00000000; if (u > 256) // 1.25V PORTD = 0b00000011; if (u > 384) // 1.875V PORTD = 0b00000111; if (u > 512) // 2.5V PORTD = 0b00001111; if (u > 640) // 3.125V PORTD = 0b00011111; if (u > 768) // 3.75V PORTD = 0b00111111; if (u > 896) // 4.375V PORTD = 0b01111111; if (u > 1020) // 5V PORTD = 0b11111111; _delay_ms(30); } }

В следующем примере мы разберем принципы создания вольтметра 0-30V на микроконтроллере Atmega8.

Аналого-цифровые преобразователи (АЦП) являются устройствами, которые принимают входные аналоговые сигналы и генерируют соответствующие им цифровые сигналы, пригодные для обработки микропроцессорами и другими цифровыми устройствами.

АЦП входит во многие современные модели МК AVR, он многоканальный. Обычно число каналов равно 8, но в разных моделях оно может варьировать от 4 каналов в младших моделях семейства Tiny, 6 в ATmega8, до 16 каналов в ATmega2560. Многоканальность означает, что на входе единственного модуля АЦП установлен аналоговый мультиплексор, который может подключать этот вход к различным выводам МК для осуществления измерений нескольких независимых аналоговых величин с разнесением по времени. Входы мультиплексора могут работать по отдельности (в несимметричном режиме для измерения напряжения относительно "земли") или (в некоторых моделях) объединяться в пары для измерения дифференциальных сигналов. Иногда АЦП дополнительно снабжается усилителем напряжения с фиксированными значениями коэффициента усиления 10 и 200.

Сам АЦП представляет собой преобразователь последовательного приближения с устройством выборки-хранения и фиксированным числом тактов преобразования, равным 13 (или 14 для дифференциального входа; первое преобразование после включения потребует 25 тактов для инициализации АЦП). Тактовая частота формируется аналогично тому, как это делается для таймеров- с помощью специального предделителя тактовой частоты МК, который может иметь коэффициенты деления от 1 до 128. Но в отличие от таймеров, выбор тактовой частоты АЦП не совсем произволен, т. к. быстродействие аналоговых компонентов ограничено. Поэтому коэффициент деления следует выбирать таким, чтобы при заданном "кварце" тактовая частота АЦП укладывалась в рекомендованный диапазон 50-200 кГц (т. е. максимум около 15 тыс. измерений в секунду). Увеличение частоты выборки допустимо, если не требуется достижение наивысшей точности преобразования.

Разрешающая способность АЦП в МК AVR - 10 двоичных разрядов, чего для большинства типовых применений достаточно. Абсолютная погрешность преобразования зависит от ряда факторов и в идеальном случае не превышает ±2 младших разрядов, что соответствует общей точности измерения примерно 8 двоичных разрядов. Для достижения этого результата необходимо принимать специальные меры: не только "вгонять" тактовую частоту в рекомендованный диапазон, но и снижать по максимуму интенсивность цифровых шумов. Для этого рекомендуется, как минимум, не использовать оставшиеся выводы того же порта, к которому подключен АЦП, для обработки цифровых сигналов, правильно разводить платы, а как максимум - дополнительно к тому еще и включать специальный режим ADC Noise Reduction.

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

Регистры управления АЦП

Для разрешения работы АЦП необходимо записать лог. 1 в разряд ADEN регистра ADCSR, а для выключения - лог. 0. Если АЦП будет выключено во время цикла преобразования, то преобразование завершено не будет (в регистре данных АЦП останется результат предыдущего преобразования).

Режим непрерывных измерений активизируется установкой бита ADFR (бит 5) этого же регистра. В ряде моделей Mega этот бит носит наименование ADATE, и управление режимом работы производится сложнее: там добавляются несколько режимов запуска через различные прерывания (в т. ч. прерывание от компаратора, при наступлении различных событий от таймера и т. п.), и выбирать их следует, задавая биты ADTS регистра SFIOR, а установка бита ADATE разрешает запуск АЦП по этим событиям. Так как нулевые значения всех битов ADTS (по умолчанию) означают режим непрерывного преобразования, то в случае, когда вы их значения не трогали, функции битов ADATE и ADFR в других моделях будут совпадать.

Если выбран режим запуска не от внешнего источника, то преобразование запускается установкой бита ADTS (бит 6 того же регистра ADCSR/ADCSRA). При непрерывном режиме установка этого бита запустит первое преобразование, затем они будут автоматически повторяться. В режиме однократного преобразования, а также независимо от установленного режима при запуске через прерывания (в тех моделях, где это возможно) установка бита ADCS просто запускает одно преобразование. При наступлении прерывания, запускающего преобразование, бит ADCS устанавливается аппаратно. Отметим, что преобразование начинается по-фронту первого тактового импульса (тактового сигнала АЦП, а не самого контроллера!) после установки ADCS. По окончании любого преобразования (и в одиночном, и в непрерывном режиме) устанавливается бит ADIF (бит 4. флаг прерывания). Разрешение прерывания АЦП осуществляется установкой бита ADIE (бит 3) все того же регистра ADCSR/ADCSRA.

Для работы с АЦП необходимо еще установить его тактовую частоту. Это делается тремя младшими битами регистра ADCSR/ADCSRA под названием ADPS0..2. Коэффициент деления частоты тактового генератора МК устанавливается по степеням двойки, все нули в этих трех битах соответствуют коэффициенту 2, все единицы - 128. Оптимальная частота преобразования лежит в диапазоне 50-200 кГц, так что, например, для тактовой частоты МК, равной 4 МГц, коэффициент может иметь значение только 32 (состояние битов ADPS0..2 = 101, частота 125 кГц) или 64 (состояние битов ADPS0..2 = 110, частота 62,5 кГц). При тактовой частоте 16 МГц в допустимый диапазон укладывается только коэффициент 128.

Выборка источника опорного напряжения производится битами REFS1..0 регистра ADMUX (старшие биты 7 и 6), причем их нулевое значение (по умолчанию) соответствует внешнему источнику. Напряжение этого внешнего источника может лежать в пределах от 2 В до напряжения питания аналоговой части AVcc (а оно, в свою очередь, не должно отличаться от питания цифровой части более чем на 0,3 В в большую или меньшую сторону). Можно выбрать в качестве опорного и питание самой аналоговой части, причем двояким способом: либо просто соединить выводы AREF и AVcc микросхемы, либо установить биты REFS1..0 в состояние 01 (тогда соединение осуществляется внутренними схемами, но заметим, что внешний опорный источник при этом должен быть отключен). Предусмотрен и встроенный источник (задается REFS1..0 в состоянии 11, при этом к выводу AREF рекомендуется подключать фильтрующий конденсатор), имеющий номинальное напряжение 2,56В с большим разбросом от 2,4 до 2,7 В.

*****REFS*******

Результат преобразования АЦП оказывается в регистрах ADCH:ADCL. Поскольку результат 10-разрядный, то по умолчанию старшие 6 битов в регистре ADCH оказываются равными нулю. Чтение этих регистров производится, начиная с младшего ADCL, после чего регистр ADCH блокируется, пока не будет прочитан. Следовательно, даже если момент между чтением регистров попал на фронт 14 (15) такта АЦП, когда данные в них должны меняться, значения прочитанной пары будут соответствовать друг другу, пусть и результат этого преобразования пропадет. В противоположном порядке читать эти регистры не рекомендуется. Но бит ADLAR (бит 5 регистра ADMUX) предоставляет интересную возможность: если его установить в 1, то результат преобразования в регистрах ADCH:ADCL выравнивается влево: бит 9 результата окажется в старшем бите ADCH, а незначащими будут младшие 6 битов регистра ADCL. В этом случае, если хватает 8-разрядного разрешения результата, можно прочесть только значение ADCH.

Выбор каналов и режимов их взаимодействия в АЦП производится битами MUX0..3 в регистре ADMUX. Их значения выбирают нужный канал в обычном (недифференциальном) режиме, когда измеряемое напряжение отсчитывается от "земли". Последние два значения этих битов для семейства Mega (11110 и 11111 в большинстве моделей или 1110 и 1111 для ATmega8) выбирают режимы, когда вход АЦП подсоединяется к опорному источнику компаратора (1,22 В) или к "земле" соответственно, что может использоваться для автокалибровки устройства.

Остальные комбинации разрядов MUX предназначены для установки различных дифференциальных режимов - в тех моделях, где они присутствуют, в других случаях эти биты зарезервированы (как в моделях Atmega8, ATmegal63 и др.). В дифференциальном режиме АЦП измеряет напряжение между двумя выбранными выводами (например, между ADC0 и ADC1), причем не все выводы могут быть в таком режиме задействованы. В том числе дифференциальные входы АЦП можно подключать к одному и тому же входу для коррекции нуля. Дело в том, что в ряде моделей на входе АЦП имеется встроенный усилитель, с коэффициентом 1х, 10х и 200х (коэффициент выбирается теми же битами MUX0..4), и такой режим используется для его калибровки - в дальнейшем значение выхода при соединенных входах можно просто вычесть.

Для недифференциального режима АЦП, когда напряжение отсчитывается от "земли", результат преобразования определяется формулой: Ка = 1024Uвх/Uref, где Ка - значение выходного кода АЦП, Uвх и Uref - входное и опорное напряжения. Дифференциальному измерению соответствует такая формула: Ка = 512(Upos - Uneg)/Uref, где Upos и Uneg - напряжения на положительном и отрицательном входах соответственно. Если напряжение на отрицательном входе больше, чем на положительном, то результат в дифференциальном режиме становится отрицательным и выражается в дополнительном коде от $200 (-512) до $3FF (-1). Реальная точность преобразования в дифференциальном режиме равна 8 разрядам.

На прошлом уроке мы собрали свой первый программатор и прошили с его помощью МК. Ну что, поздравляю вас с первым реальным проектом. Мигание светодиодом это конечно хорошо, но давайте займемся чем-нибудь по интереснее. Сегодня я расскажу как работать с АЦП(аналогово-цифровой преобразователь). Ну поехали. Перед тем как браться за программирование, давайте вернемся в школу. Да, да именно в школу, на урок алгебры и вспомним что же такое график. Из своего детства я помню, что при построении графика по той или иной функции многие из класса выпадали в осадок. Да, да именно графики были не понятны как и векторы. Хотя что там не понять. А может просто преподаватель плохо объяснял. Ну я попробую удалить это белое пятно. Те кто могут с ходу нарисовать график Х = У могут не читать эту часть текста. Для тех кто не понимает как это делать, лучше внимательно прочесть. Давайте рассмотрим выражение Х = У . У нас есть неизвестная Х и неизвестная У . Если мы возьмем любое число и подставим скажем под Х , то соответственно У примет то же значение. Ну это само собой, ведь у нас знак равенства. А как теперь по этому уравнению построить график. А очень просто. Первое что нужно понять, так это то что любой график является прямой или кривой состоящие из множества точек. Что это значит. А значит это то, что если вы возьмете фломастер и попытаетесь нарисовать прямую, только не проведя по листу, а ставя точки одну за другой, то вы получите некую прямую или кривую. Вот она больше всего подходит к понятию график. Но просто нарисованная линия на листе это еще не все. Ведь нам надо строить линию точно по уравнению. А как это сделать? Вот тут нам поможет координатная ось. Что это такое. Вот что можно сделать при помощи простой деревянной линейки? Правильно, измерить длину. А в чем? Конечно в мм или см . Глупый вопрос скажите вы, но будете не правы. Та шкала на которую вы смотрите для определения длины и есть координатная ось. А в каких единицах она, это все равно. Ведь у англичан она в дюймах. Теперь давайте представим что наша линейка имеет значения в Х -ах. И равна она от 0 до скажем 20. Это означает что на всю длину линейки мы имеем 20 рисок от 0 до 20 соответственно. И назовем ее ось Х . Так же возьмем еще одну линейку на 20 рисок и назовем ее ось У . Теперь соединим эти линейки нулевыми рисками так чтобы линейка Х лежала горизонтально, а У вертикально. Рисунок 1. И так мы получили координатную сетку. Теперь давайте попробуем с помощью данной координатной сетки нарисовать наш график по уравнению Х = У . Подставим под Х число 2. Теперь проведем от риски 2 оси Х вверх линию. Так как у нас икс равен игрику, то проведем еще одну линию от риски 2, но уже от оси У . Теперь посмотрев на эти две линии, найдем место их пересечения. Таким образом мы нашли одну из множества точек нашего будущего графика. Давайте найдем еще одну точку. Скажем что Х равен 4. Значит и У равен 4. Чисто теоретически мы можем на этом закончить. Так как видно, то что, при любом значении Х , У принимает то же значение, и график будет выглядеть простой прямой. Но мы не верим. Давайте проверим. Давайте найдем еще три точки. К примеру 6, 8 и ну скажем 18. Найдя все точки давайте соединим их прямой. Вот что у меня получилось. Рисунок 2. Как видите, прямая оказалось прямой. И если внимательно присмотреться, то можно сделать вывод, что эта прямая наклонена от обеих осей на 45°. Это вытекает из равенства обеих неизвестных. А давайте по химичим. Ну к примеру удвоим значение X . Теперт наше равенство примет вид Y = 2X . Попробуем построить график. Возьмем к примеру значения Х равным 2, 4 и 9. Вот что у меня получилось. Рисунок 3. Отсюда вытекает замечание, чем больше коэффициент переменной, тем больше он удаляет от себе прямую. Ну это видно из построенного графика. Видите как прямая прижалась к оси У. Ну с прямыми вроде как разобрались. Давайте теперь построим что-нибудь кривое. Это не в смысле плохого здания. Берем классическое квадратное уравнение. Y = X² . (Квадратное, это не потому что выглядит как квадрат, а потому что имеет одну из неизвестных во второй степени.) Теперь давайте найдем четыре точки со значением Х равным 1, 2, 3 и 4. Не пугайтесь, график получится большой не смотря на такие маленькие иксы. Ведь они у нас в квадрате. Вот что у меня получилось. Рисунок 4. Ничего не напоминает? Конечно, ветвь параболы. Если мы возьмем еще иксы и с отрицательным значением, то получим полноценную параболу. Теперь давайте построим более сложную вещь. Синусойду. Уравнение имеет вид У = sinХ . Здесь надо помнить лишь одно, что значение икса есть угол, который меняется от 0° до 360°. То есть полный оборот. Значение может быть и больше, но это будет лишь следующий оборот, а за ним следующий и так далее. Теперь давайте подставим под Х значения 0°, 90°, 180°, 270° и 360°. Да, да, это полный оборот. Вот что у меня получилось. Рисунок 5.
Ну на этом с графиками мы закончим. Я надеюсь что все было понятно. Что такое отцифровка сигнала? Сразу отмечу, мы не будем разбирать теорему Котельникова, так как это займет очень много времени и появятся много вопросов. Будем разбирать все на пальцах. И так, отцифровка - это разбитие некого сигнала на множество маленьких прямых. Вспомним нашу параболу, она была построена из четырех прямых. Это маловато, оно и видно. Ветвь какая-то ломаная. А вот если взять не пять точек, а скажем сто, то понятно что ветвь будет выглядеть более менее плавная. А если взять тысячу точек? Хорошо, ну разбили мы наш сигнал на прямые и что? А тут нам понадобятся знания которые мы получили выше. Только мы пойдем от обратного. Если мы имеем график и одно из неизвестных, то мы можем смело найти второе неизвестное графическим путем. Для наглядности смотрим на рисунок ниже. Рисунок 6.
Что мы здесь видим. По оси Х отложено время в секундах, а по оси У напряжение в вольтах. Нам известна форма сигнала и время. Теперь мы договариваемся что через каждую секунду будем узнавать величину напряжения. Что собственно и видно из графика. Теперь собрав в последовательность наши напряжения, а именно: 0.3, 0.9, 1.9, 4, 6, 7.9, 8.9, 9.5, 10, 9.9, 9.6, 9.1, 8.1, 6. Мы можем в принципе заявить, что мы отцифровали сигнал. Ведь мы знаем несколько точек находящихся на кривой сигнала. Но вот если мы обратно попробуем собрать наш сигнал, то вот что получим. Рисунок 7.
Но как вы видите это не совсе то что мы хотели увидеть. А почему так получилось? А потому что мы очень редко снимали значение напряжения. Чтобы график был более плавным, нужно уменьшить период времени опроса. То есть смотреть не через 1 секунду, а через 1 сотую секунды. И тогда у нас будет не 13 точек, а 1300. Есть разница? Теперь давайте перейдем к аппаратной части. Как реализована данная схема в железе. АЦП не может запоминать напряжение. А как же тогда, спросите вы. А я скажу что достаточно просто. Вот смотрите. Берем конденсатор и подаем на него наш сигнал. Пока конденсатор заряжается, мы отсчитываем время, ну например 1 миллисекунду. По истечении времени прекращаем подавать сигнал. Теперь все наоборот, начинаем разряжать наш конденсатор, а в это время считаем от нуля до конца разряда конденсатора. Получившееся число и есть та точка которая попадает на график по истечении 1 миллисекунды. В МК эта процедура называется "выборка". Ну с теорией мы вроде закончили, переходим к практике. Нам понадобится МК Atmega8. Данный МК имеет 6 каналов 10-ти разрядных АЦП, два из которых 8-ми разрядные. Для того чтобы начать работать с АЦП, нам понадобиться лишь опорное напряжение. Для начала возьмем 5 вольт. Это означает что отцифровка сигнала возможна от 0 до 5 вольт. Так как канал 10-ти разрядный то получается 5/2 10 = 0.0048 В на единицу. Значит если у нас АЦП выдаст при выборке число 482, то напряжение будет равно 482*0.0048 = 2.3136 В. В принципе неплохая точность. По заявленным параметрам, МК делает 15000 выборок в секунду. Отсюда наш график можно разбить на 14999 прямых. Давайте для начала соберем схему чтоб было немного по понятнее. Рисунок 8.
Немного пояснений. На порт В МК подсоединен LCD 16х2. Сейчас я вдаваться в подробности как он работает не буду, это не в этом уроке. Просто подсоедините как на рисунке. Выводы AREF и AVCC присоединены к 5В. Это как раз есть то самое апорное напряжение. На порт С к нулевому разряду подсоединен контакт с вольтметром и переменным резистором для изменения входного напряжения. Наша задача такова. Мы должны вывести на экран величину напряжения ту которую показывает вольтметр. Приступаем к программированию. Запускаем новый проект. В настройках Chip выбираем Atmega8, 4,00000000 MHz. Во вкладке LCD выбираем PORTB. И сохраняем проект под названием, в моем случае, ADC. Вы можете его назвать как вам угодно. Первым делом мы добавляем две директивы препроцессора для работы с текстом и задержки. Для этого после директивы LCD добавим эти две строки. #include #include Первая из них нужна для создания задержек, а вторая для работы с текстом. Далее нам нужно создать массив для временного хранения форматированного текста. После надписи "// Declare your global variables here" пишем char string;. // Declare your global variables here char string; Теперь после открытия главной функции main, мы должны объявит две переменные. Одна для хранения значения после выборки, а другая для хранения выводимого значения. Для этого запишем так. void main(void) { // Declare your local variables here int data; // Переменная для хранения данных выборки. int так как регистр 10 разрядов. float V; // Переменная для выводимого значения. float так как у нас точность до 2 знаков. Теперь давайте займемся настройкой самого АЦП. Для этого после настройка компаратора сразу запишем две строчки. // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; ADMUX=0; // Первая строка, № порта. ADCSR=0x85; // Вторая строка настройка АЦП. Ну с номером порта все ясно, какой номер прописан с тем и работаем, а вот с настройкой тут давайте по подробнее. Для того чтоб начать работу с АЦП у МК есть такой регистр который называется ADCSR . Что в нем находится. 0-й бит ADPS0 Выбор частоты преобразования 1-й бит ADPS1 Выбор частоты преобразования 2-й бит ADPS2 Выбор частоты преобразования 3-й бит ADIE Разрешение прерывания 4-й бит ADIF Флаг прерывания 5-й бит ADFR Выбор работы АЦП. 1-непрерывный 0-по запуску ADSC 6-й бит ADSC Запуск преобразование 1-старт. После преобразования сбрасывается в ноль аппаратно. 7-й бит ADEN Разрешение работы АЦП 1-да 0-нет Теперь давайте его настроим. Чтобы включить АЦП нам надо выставить в 1 7-й разряд. Далее выставим 0 для старта преобразования. Мы его потом дергать будем. После выставим в 0 5-й разряд. Будем сами запускать преобразование. 3-й и 4-й разряды выставим в 0. Мы не будем работать с прерыванием. Теперь осталось подобрать частоту. Если почитать мануал на МК, то там сказано что для более стабильной работы АЦП его необходимо тактировать частотой в пределах 50 кГц - 200 кГц. Так как у нас кварц на 4000 кГц, то нам его надо поделить. Вот для этого мы и воспользуемся первыми тремя разрядами. Смотрим ниже на таблицу коэффициентов деления. Что нам выбрать. Берем нашу частоту кварца и делим на коэффициент. 4000 кГц делим на 8, получаем 500 кГц. Много. Давайте теперь на 16, получим 250 кГц, тоже многовато. Делим на 32 и получаем 125 кГц. Во то что надо. Мы уложились в заданные пределы. Смотрим в таблицу и видим что коэффициент 32 задается значением разрядов 101. Ну вроде все собрали. теперь давайте посмотрим на наш регистр. Вот его значения. 10000101 здесь собраны все ранее рассмотренные значения всех разрядов. Если перевести это число в HEX то получим 0х85. Теперь вам понятно почему я записал в регистр ADCSR значение 0х85. С настройками АЦП закончено. Теперь давайте выведем в первой строке наши намерения. Для этого после инициализации LCD запишем строчку. lcd_putsf("Work with ADC"); // LCD module initialization lcd_init(16); lcd_putsf("Work with ADC"); // Выводим запись Теперь при старте программы мы в первой строке увидим нашу надпись. Далее в бесконечном цикле пишем тело самой программы. while (1) { delay_ms(20); // Задаем задержку в 20 миллисекунд ADCSR |= 0x40; // Записываем 1 в ADSC data = ADCW; // Вычитываем значение V = (float) data*0.0048828; // Переводим в вольты sprintf(string, "Data: %1.2f", V); // форматируем lcd_gotoxy(0,1); // Выставляем курсор lcd_puts(string); // Выводим значение }; Как вы заметили вся программа состоит из семи строк. Давайте все по порядку. delay_ms(20); Эта функция которая создаст задержку на 20 миллисекунд. ADCSR |= 0x40; Здесь мы делаем по битное ИЛИ. Число 0х40 в бинаре выглядит так 0b01000000. Если мы проведем по битное ИЛИ с 0х85 (0b10000101), то у нас в 6-й разряд запишется 1. Помните, что надо сделать чтобы началось преобразование. Да, да, именно в 6-й разряд нужно записать 1. А после преобразование он сбросится в 0 аппаратно. data = ADCW; После преобразование МК записывает полученное значение в регистр ADCW. Вот мы от туда его и выдергиваем. V = (float) data*0.0048828; Здесь мы преобразуем полученное число в вольты. Так как у нас опорное напряжение 5В, а значение регистра 1024, то мы 5/1024=0.0048828 Это коэффициент напряжения. Ну или минимальная величина напряжения при минимальном значении регистра ADCW. То есть если в регистре будет значение 1, то велечина напряжения будет равна 0.0048828 В. Поэтому мы в строке, данные ADCW перемножаем с 0.0048828. Слово float в скобке нужно для того чтобы преобразовать переменную data из целочисленной в вещественную с плавающей точкой. sprintf(string, "Data: %1.2f", V); Здесь мы заносим значение напряжения в массив string с форматированием. Сначала мы впишем Data: . После ставится знак процента. Он говорит о том сколько знаков будет выведено. 1.2f говорит о том что мы хотим вывести один знак до запятой и 2 знака после, а буква f говорит что мы имеем дело со значением вещественным с плавающей точкой. lcd_gotoxy(0,1); Ну тут все ясно. Выставляем курсор в нулевую позицию во второй строке. lcd_puts(string); Выводим значение на экран. Перед тем как собрать проект нужно сделать небольшие настройки. Зайдите в настройки проекта "Project->Configure" и в открывшемся окне перейдите во вкладку "C Compiler" Далее в левом нижнем углу поменяйте значение (s)printf Features: с int, width на float, width, precision . Зачем это нужно я расскажу в статье по работе с ЖК дисплеями, а сейчас просто поменяйте. Вот и вся программа. Ниже на рисунке видно как это работает. Рисунок 9.

Отличительные особенности:

  • Рассмотрены характеристики аналогово-цифровых преобразователей
  • Измерение описанных характеристик АЦП
  • Влияние температуры, частоты и напряжения питания на результат преобразования
  • Компенсация погрешностей смещения и коэффициента передачи

Введение

В данных "Рекомендациях…" объясняется снятие характеристик различных АЦП, приведенных в документации, и как они влияют на результат измерений АЦП. Также описывается, как определить данные параметры в процессе тестирования приложения на стадии производства и как выполнить реально-временную компенсацию некоторых измеренных отклонений.

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

1. Сведения из теории

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

1.1. Основные характеристики АЦП

АЦП преобразовывает аналоговый входной сигнал в цифровое выходное значение, которое соответствует уровню входного сигнала относительно опорного источника. Для более лучшего понимания характеристик АЦП представим его в виде трех разновидностей: идеальный, совершенный и реальный АЦП. Идеальный АЦП может быть описан только теоретически, физически реализовать его невозможно. Он обладает бесконечной разрешающей способностью, при которой каждому произвольному входному значению соответствует уникальное выходное значение в пределах диапазона преобразования. Математически идеальный АЦП описывается в виде прямолинейной передаточной функции (см. рисунок 1).

Рисунок 1. Передаточная функция идеального АЦП

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


Рисунок 2. Передаточная функция 3-разрядного совершенного АЦП

Максимальная погрешность совершенного АЦП составляет ±1/2 интервала дискретизации. Иными словами, максимальная погрешность квантования всегда ±1/2 мл.разр., где мл. разр. - приращение входного напряжения, при котором изменяется значение младшего разряда выходного кода. Реальный АЦП характеризуется другими источниками погрешностей, которые будут рассмотрены далее.

1.2. Диапазоны преобразования

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

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


Рисунок 3. Упрощенная схема входного каскада АЦП

Для задания диапазона преобразования в схеме необходим источник опорного напряжения (Vион), который задает, какому уровню входного напряжения соответствует выходное значение. В соответствии с документацией напряжение Vион должно быть не менее 2,0В для стандартных микроконтроллеров и не менее 1,0В для микроконтроллеров с напряжением питания от 1,8В. Данное распространяется на оба режима преобразования: несимметричный и дифференциальный. Подробности необходимо выяснить в документации.

1.2.1. Несимметричный диапазон преобразования

В несимметричном режиме входной сигнал поступает непосредственно к схеме преобразования (см. рисунок 3а). 10-разрядный АЦП микроконтроллера AVR, таким образом, преобразовывает непрерывные входные напряжения в диапазоне от GND до Vион в дискретные выходные значения от 0 до 1023, соответственно.

1.2.2. Дифференциальный диапазон преобразования

В дифференциальном режиме преобразования два входных канала подключаются к дифференциальному усилителю с опциональным усилительным каскадом. Затем напряжение с выхода усилителя поступает к логике преобразования, как показано на рисунке 3б. В этом случае разности напряжений в диапазоне от -Vион до +Vион соответствуют выходные значения в диапазоне от -512 до +511. Выходное значение представляется в формате двоичного дополнения. Несмотря на возможность образования отрицательного напряжения на выходе дифференциального усилителя входные напряжения должны быть в диапазоне GND…AVCC.

Обратите внимание, что некоторые микроконтроллеры не могут измерить отрицательного приращения, как, например, ATtiny26.

1.3. Необходимость калибровки

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

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

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

Значение 20 мл. разр. на первый взгляд может показаться большим значением, но это не означает, что дифференциальный режим непрактичен в использовании. С помощью простого калибровочного алгоритма возможно достичь точность 1-2 мл.разр.

1.4. Абсолютная погрешность

Абсолютная погрешность - максимальное отклонение между идеальной прямолинейной и реальной передаточными функциями, в т.ч. внутри интервалов квантования. Минимальная абсолютная погрешность, таким образом, равна погрешности квантования 1/2 мл. разр.

Абсолютная погрешность или абсолютная точность - общая некомпенсированная погрешность, которая включает погрешность квантования, погрешность смещения, погрешность коэффициента передачи и нелинейность. Смещение, коэффициент передачи и нелинейность будут описаны далее.

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

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

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

1.5. Погрешность смещения

Погрешность смещения - отклонение фактической передаточной функции АЦП от прямолинейной передаточной функции идеального АЦП при нулевом входном напряжении.

Когда выходное значение изменяется от 0 к 1, но при этом входное напряжение не достигло уровня 1/2 мл.разр., то говорят, что имеет место погрешность смещения. Если ошибка смещения положительная, то выходное значение будет больше 0, когда входное напряжение приближается к 1/2 мл.разр. снизу. Если ошибка смещения отрицательная, то входное значение будет больше 1/2 мл.разр. при первом изменении выходного кода. Другими словами, если фактическая передаточная функция становится ниже идеальной линии, то погрешность смещения отрицательная и наоборот. Отрицательные и положительные смещения показаны на рисунке 4.


Рисунок 4. Примеры положительного (а) и отрицательного (б) смещений

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

1.5.1. Погрешность смещения в несимметричных каналах

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

На рисунке 5а первый переход возникает при уровне 1 мл.разр. При изменении выходного кода с 2 к 3 у совершенного АЦП эквивалентное входное напряжение будет равно 2 1/2 мл. разр. Разница равна +1 1/2 мл. разр. и является погрешностью смещения. Данная разница показана на рисунке размерной линией. Такие же рассуждения применимы и к рисунку 5б. Первое изменение возникает при 2 мл.разр. У совершенного АЦП переход от 0 к 1 возникает при входном напряжении 1/2 мл.разр. Таким образом, погрешность смещения равна разнице: - 1 1/2 мл. разр.


Рисунок 5. Положительная (а) и отрицательная (б) погрешности смещения в режиме несимметричного преобразования

Процедура измерения может быть формализована в виде блок-схемы (см. рисунок 6).


Рисунок 6. Блок-схема измерения несимметричных погрешностей смещения

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

1.5.2. Погрешность смещения в дифференциальных каналах

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

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

1.6. Передаточная погрешность

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

При реально-временной компенсации часто используется целочисленная арифметика, т.к. вычисления с плавающей точкой выполняются гораздо дольше. Таким образом, для достижения наилучшей точности измерения отклонения наклона оно должно быть выполнено как можно далее от нулевого значения. Чем выше значения, тем лучше точность измерения. Это более подробно описано далее. Пример передаточной функции 3-разрядного АЦП с передаточной погрешностью показан на рисунке 7. Приведенное далее описание распространяется на оба режима преобразования: несимметричный и дифференциальный.


Рисунок 7. Примеры положительной (а) и отрицательной (б) передаточных погрешностей

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

На рисунке 7а выходное значение достигло предела еще до достижения максимума входным напряжением. Вертикальная размерная линия показывает середину последнего выходного интервала дискретизации. Идеальное выходное значение для данного входного напряжения равно 5,5, таким образом, масштабирующий коэффициент равен 5,5/7. На рисунке 7б выходное значение достигло только 6 при достижении входным напряжением максимума. В итоге присутствует отрицательное отклонение от фактической передаточной функции. Для этого случая идеальное выходное значение посередине последнего интервала преобразования равно 7,5, а масштабирующий коэффициент 7,5/6. Процедура измерения представлена на рисунке 8.


Рисунок 8. Блок-схема измерения передаточных погрешностей

1.7. Нелинейность

После компенсации погрешности смещения и передаточной погрешности фактическая передаточная функция должна совпадать с передаточной функцией совершенного АЦП. Однако ввиду нелинейности АЦП фактическая кривая может слегка отклоняться от совершенной кривой, даже если обе кривые совпадают в районе 0 и в точке измерения передаточной погрешности. Имеется два способа измерения нелинейности; оба метода описаны ниже. На рисунке 9 показаны примеры для обоих методов измерения.


Рисунок 9. Пример нелинейной кривой преобразования АЦП

1.7.1. Дифференциальная нелинейность

Дифференциальная нелинейность (ДНЛ) - максимальное и минимальное отклонения фактической ширины интервала от ширины интервала совершенного АЦП (1 мл. разр.) для всех интервалов дискретизации. Нелинейность приводит к варьированию размеров интервалов дискретизации. Все интервалы должны иметь ширину 1 мл. разр., но некоторые уже или шире.

Для измерения ДНЛ на вход подается пилообразное напряжение и записываются все изменения выходных значений. Ширина интервала определяется как расстояние между двумя переходами и большинство отрицательных и положительных отклонений от 1 мл.разр. используются для определения максимальной и минимальной ДНЛ.

Интегральная нелинейность

Интегральная нелинейность (ИНЛ) - максимальное отклонение по вертикали между фактической и совершенной кривыми преобразования АЦП.

ИНЛ можно интерпретировать как сумму ДНЛ. Например, несколько последовательных отрицательных ДНЛ поднимают фактическую кривую над совершенной, как показано на рисунке 9а. Отрицательные ИНЛ сигнализируют о снижении фактической кривой ниже совершенной. Максимальная и минимальная ИНЛ измеряются с помощью того же пилообразного входного напряжения, что и при измерении ДНЛ. Для этого записываются отклонения посередине каждого интервала преобразования, а затем определяются максимальное и минимальное значения, соответствующие максимальной и минимальной ИНЛ.

Измерения и компенсация

Очень важно, что бы измерение ИНЛ и ДНЛ выполнялось после компенсации погрешности смещения и передаточной погрешности. В противном случае в результат измерения будут входить указанные погрешности и, следовательно, полученные значения ДНЛ и ИНЛ не будут соответствовать действительности.

Нелинейность не может быть компенсирована с помощью простых вычислений. Для этого необходима либо полиноминальная аппроксимация, либо таблицы преобразования. Однако типичные значения ИНЛ и ДНЛ для 10-разрядных АЦП микроконтроллеров AVR составляют 1/2 мл. разр. и редко влияют на жизнеспособность приложений.

1.8. Влияние температуры, частоты и напряжения питания

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

Точность работы АЦП также связана с его синхронизацией. Рекомендованная максимальная частота синхронизации АЦП ограничивается характеристиками внутреннего ЦАП в схеме преобразования. Для достижения оптимальных характеристик частота синхронизации АЦП не должна превышать 200 кГц. Однако частоты до 1 МГц не приводят к существенному ухудшению разрешающей способности.

Характеристики работы АЦП с частотами синхронизации выше 1МГц не определялись.

1.9. Частотный диапазон и входное сопротивление

В несимметричном режиме работы АЦП частотный диапазон ограничивается частотой синхронизации АЦП. Одно преобразование длиться 13 тактов, поэтому, при максимальной тактовой частоте 1 МГц достигается частота преобразования 77 тысяч преобразований в секунду. Таким образом, в соответствии с теоремой Котельникова частотный диапазон для несимметричного режима преобразования ограничивается частотой 38,5 кГц.

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

Входное сопротивление по отношению к VCC и GND составляет 100 МОм (типичное значение). Совместно с внутренним сопротивлением источника сигнала образуется делитель напряжения. Таким образом, для получения корректного результата преобразования необходимо, чтобы внутреннее сопротивление источника сигнала было намного меньше входного сопротивления АЦП.

2. Реализация

На рисунке 10 показан пример установки для выполнения калибровки.


Рисунок 10. Установка для калибровки в производственных условиях

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

Обратите внимание, что в данном случае требуется, чтобы бит EESAVE был запрограммирован. В этом случае выполнение операции стирания всей памяти, которая предшествует программированию флэш-памяти, не затрагивает содержимое ЭСППЗУ. В противном случае, параметры АЦП должны быть временно запомнены программатором перед стиранием памяти микроконтроллера.

2.1. Арифметика с фиксированной точкой для коррекции погрешности смещения и передаточной погрешности

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

Поскольку коэффициент компенсации передаточной погрешности никогда не превысит значения 2, то можно отмасштабировать с коэффициентом 2 14 , чтобы точно вписаться в 16-разрядное слово. Иными словами, масштабирующий коэффициент может быть представлен двумя байтами как число с фиксированной точкой и знаком 1:14.

Ниже приведено выражение для одновременной компенсации передаточной погрешности и погрешности смещения.

Фактическое_значение = (Код_АЦП - Смещение) · Км, (1)

где Км- масштабирующий коэффициент передаточной погрешности.

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

2 14 · Фактическое_значение = 2 14 · Код_АЦП · Км + 2 14 · 0,5 - 2 14 · Смещение · Км (2)

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

Введя две отмасштабированные константы factor и correction, которые используются в программе, получаем итоговые выражения:

factor = 2 14 · Км,

correction = 2 14 · (0,5 - Смещение · Км), (3)

2 16 · Фактическое_значение = 2 2 · (Код_АЦП · factor + correction).

С помощью данного метода калибровочная программа вычисляет константы factor и correction, а затем сохраняет их в ЭСППЗУ. Время выполнения программы компенсации составляют одно целочисленное умножение, одно сложение и два сдвига влево. При использовании компилятора Си компании IAR C с максимальной оптимизацией быстродействия на эти действия потребуется 42 такта ЦПУ.

2.1.1. Калибровка

Разработка тестового блока не рассматривается в рамках данных "Рекомендаций…". Однако блок-схема калибровки с помощью микроконтроллера AVR приведена. В ней подразумевается использование в тестовом блоке внешнего ЦАП и работа по собственному калибровочному алгоритму.

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

Программа должна быть реализована, как показано на рисунке 11.

Рисунок 11. Блок-схема калибровочной программы

Данная часть программного обеспечения записывается в AVR до начала калибровки, а по ее завершении заменяется программным кодом фактического приложения. Еще раз необходимо обратить внимание, что программирование конфигурационного бита EESAVE позволит заблокировать действие команды стирания всей памяти относительно ЭСППЗУ во время перепрограммирования флэш-памяти и, таким образом, калибровочные данные будут незатронутыми.

2.1.2. Компенсация

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

Рисунок 12. Блок-схема программы компенсации погрешности смещения и передаточной погрешности

Вычисления на рисунке 12 могут быть реализованы с помощью следующей Си-функции или альтернативно с помощью макроса:

Signed int adc_compensate(signed int adcvalue, signed int factor, signed long correction) { return (((((signed long)adcvalue*factor)+correction)<<2)>>16); }

Константы хранятся в ЭСППЗУ и перед началом работы должны быть скопированы в ОЗУ для ускорения доступа к ним.

Использованная литература:

  1. Robert Gordon - A Calculated Look at Fixed-Point Arithmetic (Прагматичный взгляд на арифметику с фиксированной точкой)
    http://www.embedded.com/98/9804fe2.htm
  2. Рекомендации по применению AVR210: Использование аппаратного умножающего устройства микроконтроллеров AVR