Аналогово-цифровой преобразователь. AVR120: Снятие характеристик и калибровка АЦП микроконтроллеров AVR Atmega8 ацп ошибка в документации


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

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

Введение

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

Большим преимуществом флэш-памяти, встроенной в 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

Аналого-цифровые преобразователи (АЦП) являются устройствами, которые принимают входные аналоговые сигналы и генерируют соответствующие им цифровые сигналы, пригодные для обработки микропроцессорами и другими цифровыми устройствами. АЦП входит во многие современные модели МК 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 разрядам.

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

  • 10-разрядное разрешение
  • Интегральная нелинейность 0.5 мл. разр.
  • Абсолютная погрешность ±2 мл. разр.
  • Время преобразования 65 - 260 мкс.
  • Частота преобразования до 15 тыс. преобр. в сек. при максимальном разрешении
  • 8 мультиплексированных однополярных входов
  • 7 дифференциальных входных каналов
  • 2 дифференциальных входных канала с опциональным усилением на 10 и 200
  • Представление результата с левосторонним или правосторонним выравниванием в 16-разр. слове
  • Диапазон входного напряжения АЦП 0…VCC
  • Выборочный внутренний ИОН на 2.56 В
  • Режимы одиночного преобразования и автоматического перезапуска
  • Прерывание по завершении преобразования АЦП
  • Механизм подавления шумов в режиме сна

ATmega128 содержит 10-разр. АЦП последовательного приближения. АЦП связан с 8-канальным аналоговым мультиплексором, 8 однополярных входов которого связаны с линиями порта F. Общий входных сигналов должен иметь потенциал 0В (т.е. связан с GND). АЦП также поддерживает ввод 16 дифференциальных напряжений. Два дифференциальных входа (ADC1, ADC0 и ADC3, ADC2) содержат каскад со ступенчатым программируемым усилением: 0 дБ (1x), 20 дБ (10x), или 46 дБ (200x). Семь дифференциальных аналоговых каналов используют общий инвертирующий вход (ADC1), а все остальные входы АЦП выполняют функцию неинвертирующих входов. Если выбрано усиление 1x или 10x, то можно ожидать 8-разр. разрешение, а если 200x, то 7-разрядное.

АЦП содержит УВХ (устройство выборки-хранения), которое поддерживает на постоянном уровне напряжение на входе АЦП во время преобразования. Функциональная схема АЦП показана на рисунке 108.

АЦП имеет отдельный вывод питания AVCC (аналоговое питание). AVCC не должен отличаться более чем на ± 0.3В от VCC. См. параграф “ ”, где приведены рекомендации по подключению этого вывода.

В качестве внутреннего опорного напряжения может выступать напряжение от внутреннего ИОНа на 2.56В или напряжение AVCC. Если требуется использование внешнего ИОН, то он должен быть подключен к выводу AREF с подключением к этому выводу блокировочного конденсатора для улучшения шумовых характеристик.

Рисунок 108 - Функциональная схема аналогово-цифрового преобразователя

Принцип действия

АЦП преобразовывает входное аналоговое напряжение в 10-разр. код методом последовательных приближений. Минимальное значение соответствует уровню GND, а максимальное уровню AREF минус 1 мл. разр. К выводу AREF опционально может быть подключено напряжение AVCC или внутренний ИОН на 1.22В путем записи соответствующих значений в биты REFSn в регистр ADMUX. Несмотря на то, что ИОН на 2.56В находится внутри микроконтроллера, к его выходу может быть подключен блокировочный конденсатор для снижения чувствительности к шумам, т.к. он связан с выводом AREF.

Канал аналогового ввода и каскад дифференциального усиления выбираются путем записи бит MUX в регистр ADMUX. В качестве однополярного аналогового входа АЦП может быть выбран один из входов ADC0…ADC7, а также GND и выход фиксированного источника опорного напряжения 1,22 В. В режиме дифференциального ввода предусмотрена возможность выбора инвертирующих и неинвертирующих входов к дифференциальному усилителю.

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

Работа АЦП разрешается путем установки бита ADEN в ADCSRA. Выбор опорного источника и канала преобразования не возможно выполнить до установки ADEN. Если ADEN = 0, то АЦП не потребляет ток, поэтому, при переводе в экономичные режимы сна рекомендуется предварительно отключить АЦП.

АЦП генерирует 10-разрядный результат, который помещается в пару регистров данных АЦП ADCH и ADCL. По умолчанию результат преобразования размещается в младших 10-ти разрядах 16-разр. слова (выравнивание справа), но может быть опционально размещен в старших 10-ти разрядах (выравнивание слева) путем установки бита ADLAR в регистре ADMUX.

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

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

Запуск преобразования

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

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

Предделитель и временная диаграмма преобразования


Рисунок 109 – Предделитель АЦП

Если требуется максимальная разрешающая способность (10 разрядов), то частота на входе схемы последовательного приближения должна быть в диапазоне 50…200 кГц. Если достаточно разрешение менее 10 разрядов, но требуется более высокая частота преобразования, то частота на входе АЦП может быть установлена свыше 200 кГц.

Модуль АЦП содержит предделитель, который формирует производные частоты свыше 100 кГц по отношению к частоте синхронизации ЦПУ. Коэффициент деления устанавливается с помощью бит ADPS в регистре ADCSRA. Предделитель начинает счет с момента включения АЦП установкой бита ADEN в регистре ADCSRA. Предделитель работает пока бит ADEN = 1 и сброшен, когда ADEN=0.

Если инициируется однополярное преобразование установкой бита ADSC в регистре ADCSRA, то преобразование начинается со следующего нарастающего фронта тактового сигнала АЦП. Особенности временной диаграммы дифференциального преобразования представлены в “ ”.

Нормальное преобразование требует 13 тактов синхронизации АЦП. Первое преобразование после включения АЦП (установка ADEN в ADCSRA) требует 25 тактов синхронизации АЦП за счет необходимости инициализации аналоговой схемы.

После начала нормального преобразования на выборку-хранение затрачивается 1.5 такта синхронизации АЦП, а после начала первого преобразования – 13,5 тактов. По завершении преобразования результат помещается в регистры данных АЦП и устанавливается флаг ADIF. В режиме одиночного преобразования одновременно сбрасывается бит ADSC. Программно бит ADSC может быть снова установлен и новое преобразование будет инициировано первым нарастающим фронтом тактового сигнала АЦП.

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


Рисунок 110 – Временная диаграмма работы АЦП при первом преобразовании в режиме одиночного преобразования


Рисунок 111 – Временная диаграмма работы АЦП в режиме одиночного преобразования


Рисунок 112 – Временная диаграмма работы АЦП в режиме автоматического перезапуска

Таблица 95 – Время преобразования АЦП

Каналы дифференциального усиления

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

Дифференциальные преобразования синхронизированы по отношению к внутренней синхронизации CKАЦП2, частого которого равна половине частоты синхронизации АЦП. Данная синхронизация выполняется автоматически интерфейсом АЦП таким образом, чтобы выборка-хранение инициировалась определенным фронтом CKАЦП2. Если преобразование (все одиночные преобразования и первое преобразование в режиме автоматического перезапуска) инициировалось пользователем, когда CKАЦП2 находился в низком лог. состоянии, то его длительность будет эквивалента однополярному преобразованию (13 тактов синхронизации АЦП). Если преобразование инициируется пользователем, когда CKАЦП2 равен лог. 1 , оно будет длиться 14 тактов синхронизации АЦП вследствие работы механизма синхронизации. В режиме автоматического перезапуска новое преобразование инициируется сразу по завершении предыдущего, а т.к. в этот момент CKАЦП2 равен лог. 1, то все преобразования, которые были автоматически перезапущены (т.е. все, кроме первого), будут длиться 14 тактов синхронизации АЦП. Усилительный каскад оптимизирован под частотный диапазон до 4 кГц для любых коэффициентов усиления. Усиление сигналов более высоких частот будет нелинейным. Поэтому, если входной сигнал содержит частотные составляющие выше частотного диапазона усилительного каскада, то необходимо установить внешний фильтр низких частот. Обратите внимание, что частота синхронизации АЦП не связана с ограничением по частотному диапазону усилительного каскада. Например, период синхронизации АЦП может быть 6 мкс, при котором частота преобразования канала равна 12 тыс. преобр. в секунду, независимо от частотного диапазона этого канала.

Изменение канала или выбор опорного источника

Биты MUXn и REFS1:0 в регистре ADMUX поддерживают одноступенчатую буферизацию через временный регистр. Этим гарантируется, что новые настройки канала преобразования и опорного источника вступят в силу в безопасный момент для преобразования. До начала преобразования любые изменения канала и опорного источника вступаю в силу сразу после их модификации. Как только начинается процесс преобразования доступ к изменению канала и опорного источника блокируется, чем гарантируется достаточность времени на преобразование для АЦП. Непрерывность модификации возвращается на последнем такте АЦП перед завершением преобразования (перед установкой флага ADIF в регистре ADCSRA). Обратите внимание, что преобразование начинается следующим нарастающим фронтом тактового сигнала АЦП после записи ADSC. Таким образом, пользователю не рекомендуется записывать новое значение канала или опорного источника в ADMUX до 1-го такта синхронизации АЦП после записи ADSC.

Особые меры необходимо предпринять при изменении дифференциального канала. Как только осуществлен выбор дифференциального канала усилительному каскаду требуется 125 мкс для стабилизации нового значения. Следовательно, в течение первых после переключения дифференциального канала 125 мкс не должно стартовать преобразование. Если же в этот период преобразования все-таки выполнялись, то их результат необходимо игнорировать.

Такую же задержку на установление необходимо ввести при первом дифференциальном преобразовании после изменения опорного источника АЦП (за счет изменения бит REFS1:0 в ADMUX).

Если разрешена работа интерфейса JTAG, то функции каналов АЦП на выводах порта F 7…4 отменяется. См. табл. 42 и “Альтернативные функции порта F”.

Входные каналы АЦП

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

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

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

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

Источник опорного напряжения АЦП

Источник опорного напряжения (ИОН) для АЦП (VИОН) определяет диапазон преобразования АЦП. Если уровень однополярного сигнала свыше VИОН, то результатом преобразования будет 0x3FF. В качестве VИОН могут выступать AVCC, внутренний ИОН 2,56В или внешний ИОН, подключенный к выв. AREF. AVCC подключается к АЦП через пассивный ключ. Внутреннее опорное напряжение 2,56В генерируется внутренним эталонным источником VBG, буферизованного внутренним усилителем. В любом случае внешний вывод AREF связан непосредственно с АЦП и, поэтому, можно снизить влияние шумов на опорный источник за счет подключения конденсатора между выводом AREF и общим. Напряжение VИОН также может быть измерено на выводе AREF высокоомным вольтметром. Обратите внимание, что VИОН является высокоомным источником и, поэтому, внешне к нему может быть подключена только емкостная нагрузка.

Если пользователь использует внешний опорный источник, подключенный к выв. AREF, то не допускается использование другой опции опорного источника, т.к. это приведет к шунтированию внешнего опорного напряжения. Если к выв. AREF не приложено напряжение, то пользователь может выбрать AVCC и 2.56В качестве опорного источника. Результат первого преобразования после переключения опорного источника может характеризоваться плохой точностью и пользователю рекомендуется его игнорировать.

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

Подавитель шумов АЦП

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

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

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

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

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

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


Рисунок 113 – Схема аналогового входа

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

  1. Выполняйте путь аналоговых сигналов как можно более коротким. Следите, чтобы аналоговые сигналы проходили над плоскостью (слоем) с аналоговой землей (экраном) и далеко от проводников, передающих высокочастотные цифровые сигналы.
  2. Вывод AVCC необходимо связать с цифровым питанием VCC через LC-цепь в соответствии с рис. 114.
  3. Используйте функцию подавления шумов АЦП, внесенных работой ядра ЦПУ.
  4. Если какой-либо из выводов АЦП используется как цифровой выход, то чрезвычайно важно не допустить переключение состояния этого выхода в процессе преобразования.


Рисунок 114 – Подключение питания АЦП

Методы компенсации смещения

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

Определения погрешностей аналогово-цифрового преобразования

n-разрядный однополярный АЦП преобразовывает напряжение линейно между GND и VИОН с количеством шагами 2n (мл. разрядов). Минимальный код = 0, максимальный = 2n-1. Основные погрешности преобразования являются отклонением реальной функции преобразования от идеальной. К ним относятся:

Смещение – отклонение первого перехода (с 0x000 на 0x001) по сравнению с идеальным переходом (т.е. при 0.5 мл. разр.). Идеальное значение: 0 мл. разр.


Рисунок 115 – Погрешность смещения

После корректировки смещения погрешность усиления представляет собой отклонение последнего перехода (с 0x3FE на 0x3FF) от идеального перехода (т.е. отклонение при максимальном значении минус 1,5 мл. разр.). Идеальное значение: 0 мл. разр.


Рисунок 116 – Погрешность усиления

Интегральная нелинейность (ИНЛ) . После корректировки смещения и погрешности усиления ИНЛ представляет собой максимальное отклонение реальной функции преобразования от идеальной для любого кода. Идеальное значение ИНЛ = 0 мл. разр.


Рисунок 117 - Интегральная нелинейность (ИНЛ)

Дифференциальная нелинейность (ДНЛ) . Максимальное отклонение между шириной фактического кода (интервал между двумя смежными переходами) от ширины идеального кода (1 мл. разр.). Идеальное значение: 0 мл. разр.


Рисунок 118 - Дифференциальная нелинейность (ДНЛ)

Погрешность квантования . Возникает из-за преобразования входного напряжения в конечное число кодов. Погрешность квантования- интервал входного напряжения протяженностью 1 мл. разр. (шаг квантования по напряжению), который характеризуется одним и тем же кодом. Всегда равен ±0.5 мл. разр.

Абсолютная погрешность . Максимальное отклонение реальной (без подстройки) функции преобразования от реальной при любом коде. Является результатом действия нескольких эффектов: смещение, погрешность усиления, дифференциальная погрешность, нелинейность и погрешность квантования. Идеальное значение: ±0.5 мл. разр.

Результат преобразования АЦП

По завершении преобразования (ADIF = 1) результат может быть считан из пары регистров результата преобразования АЦП (ADCL, ADCH).

Для однополярного преобразования:

где V вх – уровень напряжения на подключенном к АЦП входу;

Vион –напряжение выбранного источника опорного напряжения (см. табл. 97 и табл. 98). Код 0x000 соответствует уровню аналоговой земли, а 0x3FF - уровню напряжения ИОН минус 1 шаг квантования по напряжению. При использовании дифференциального канала

V pos - напряжение на неинвертирующем (инвертирующем) входе; V neg - коэффициент усиления; V ref - напряжение выбранного ИОН.

Результат представляется в коде двоичного дополнения, начиная с 0x200 (-512d) до 0x1FF (+511d). Обратите внимание, что при необходимости быстро определить полярность результата достаточно опросить старший бит результата преобразования (ADC9 в ADCH). Если данный бит равен лог. 1, то результат отрицательный, если же лог. 0, то положительный. На рисунке 119 представлена функция преобразования АЦП в дифференциальном режиме.

В таблице 96 представлены результирующие выходные коды для дифференциальной пары каналов (ADCn - ADCm) с коэффициентом усиления Ку и опорным напряжением VИОН.


Рисунок 119 – Функция преобразования АЦП при измерении дифференциального сигнала

Таблица 96 – Связь между входным напряжением и выходными кодами

V АЦПn Считываемый код Соответствующее десятичное значение
V АЦПm + V ИОН /Ky 0x1FF 511
V АЦПm + 0.999 V ИОН / Ky 0x1FF 511
V АЦПn + 0.998 V ИОН / Ky 0x1FE 510
... ...
V АЦПm + 0.001 V ИОН / Ky 0x001 1
V АЦПm 0x000 0
V АЦПm - 0.001 V ИОН / Ky 0x3FF -1
... ...
V АЦПm - 0.999 V ИОН / Ky 0x201 -511
V АЦПm – V ИОН / Ky 0x200 -512

Пример: Пусть ADMUX = 0xED (пара входов ADC3 - ADC2, Ку=1, Vион=2.56В, результат с левосторонним выравниванием), напряжение на входе ADC3 = 300 мВ, а на входе ADC2 = 500 мВ, тогда:

КодАЦП = 512 * 10 * (300 - 500) / 2560 = -400 = 0x270

С учетом выбранного формата размещения результата (левосторонний) ADCL = 0x00, а ADCH = 0x9C. Если же выбран правосторонний формат (ADLAR=0), то ADCL = 0x70, ADCH = 0x02.

Регистр управления мультиплексором АЦП– ADMUX

Разряд 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 ADMUX
Чтение/запись Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп.
Исх. значение 0 0 0 0 0 0 0 0

Разряд 7:6 – REFS1:0: Биты выбора источника опорного напряжения

Данные биты определяют какое напряжение будет использоваться в качестве опорного для АЦП (см. табл. 97). Если изменить значения данных бит в процессе преобразования, то новые установки вступят в силу только по завершении текущего преобразования (т.е. когда установится бит ADIF в регистре ADCSRA). Внутренний ИОН можно не использовать, если к выводу AREF подключен внешний опорный источник.

Таблица 97 – Выбор опорного источника АЦП

Разряд 5 – ADLAR: Бит управления представлением результата преобразования

Бит ADLAR влияет на представление результата преобразования в паре регистров результата преобразования АЦП. Если ADLAR = 1, то результат преобразования будет иметь левосторонний формат, в противном случае - правосторонний. Действие бита ADLAR вступает в силу сразу после изменения, независимо от выполняющегося параллельно преобразования. Полное описание действия данного бита представлено в “Регистры данных АЦП – ADCL и ADCH”.

Разряд 4:0 – MUX4:0: Биты выбора аналогового канала и коэффициента усиления

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

Таблица 98 – Выбор входного канала и коэффициента усиления

MUX4..0 Однополярный вход Неинвертирующий дифференциальный вход Инвертирующий дифференциальный вход Коэффициент усиления, Ку
00000 ADC0 Нет
00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
01000 Нет ADC0 ADC0 10
01001 ADC1 ADC0 10
01010 ADC0 ADC0 200
01011 ADC1 ADC0 200
01100 ADC2 ADC2 10
01101 ADC3 ADC2 10
01110 ADC2 ADC2 200
01111 ADC3 ADC2 200
10000 ADC0 ADC1 1
10001 ADC1 ADC1 1
10010 ADC2 ADC1 1
10011 ADC3 ADC1 1
10100 ADC4 ADC1 1
10101 ADC5 ADC1 1
10110 ADC6 ADC1 1
10111 ADC7 ADC1 1
11000 ADC0 ADC2 1
11001 ADC1 ADC2 1
11010 ADC2 ADC2 1
11011 ADC3 ADC2 1
11100 ADC4 ADC2 1
11101 ADC5ADC21
Нет111110В(GND)
11110 1.23В (VBG)

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

Разряд 7 6 5 4 3 2 1 0
ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSRA
Чтение/запись Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп.
Исх. значение 0 0 0 0 0 0 0 0

Разряд 7 – ADEN: Разрешение работы АЦП

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

Разряд 6 – ADSC: Запуск преобразования АЦП

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

В процессе преобразования при опросе бита ADSC возвращается лог. 1, а по завершении преобразования – лог. 0. Запись лог. 0 в данный бит не предусмотрено и не оказывает никакого действия.

Разряд 5 – ADFR: Выбор режима автоматического перезапуска АЦП

Если в данный бит записать лог. 1, то АЦП перейдет в режим автоматического перезапуска. В этом режиме АЦП автоматически выполняет преобразования и модифицирует регистры результата преобразования через фиксированные промежутки времени. Запись лог. 0 в этот бит прекращает работу в данном режиме.

Разряд 4 – ADIF: Флаг прерывания АЦП

Данный флаг устанавливается после завершения преобразования АЦП и обновления регистров данных. Если установлены биты ADIE и I (регистр SREG), то происходит прерывание по завершении преобразования. Флаг ADIF сбрасывается аппаратно при переходе на соответствующий вектор прерывания. Альтернативно флаг ADIF сбрасывается путем записи лог. 1 в него. Обратите внимание, что при выполнении команды "чтение-модификация-запись" с регистром ADCSRA ожидаемое прерывание может быть отключено. Данное также распространяется на использование инструкций SBI и CBI.

Разряд 3 – ADIE: Разрешение прерывания АЦП

После записи лог. 1 в этот бит, при условии, что установлен бит I в регистре SREG, разрешается прерывание по завершении преобразования АЦП.

Разряды 2:0 – ADPS2:0: Биты управления предделителем АЦП

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

Таблица 99 – Управление предделителем АЦП

Регистры данных АЦП – ADCL и ADCH

ADLAR = 0:

Разряд 15 14 13 12 11 10 9 8
- - - - - - ADC9 ADC8 ADCH
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 ADCL
7 6 5 4 3 2 1 0
Чтение/запись Чт. Чт. Чт. Чт. Чт. Чт. Чт. Чт.
Чт. Чт. Чт. Чт. Чт. Чт. Чт. Чт.
Исх. значение 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

ADLAR = 1:

Разряд 15 14 13 12 11 10 9 8
ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH
ADC1 ADC0 - - - - - - ADCL
7 6 5 4 3 2 1 0
Чтение/запись Чт. Чт. Чт. Чт. Чт. Чт. Чт. Чт.
Чт. Чт. Чт. Чт. Чт. Чт. Чт. Чт.
Исх. значение 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

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

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

Левосторонний формат представления результата удобно использовать, если достаточно 8 разрядов. В этом случае 8-разрядный результат хранится в регистре ADCH и, следовательно, чтение регистра ADCL можно не выполнять. При правостороннем формате необходимо сначала считать ADCL, а затем ADCH.

ADC9:0: Результат преобразования АЦП

Данные биты представляют результат преобразования.

Урок 22

Часть 2

Изучаем АЦП

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

Дальнейшая задача — реализация АЦП в нашем проекта.

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

Для этого зайдём в файл adc.c и создадим функцию инициализацию нашего АЦП

#include "adc.h"

//—————————————-

void ADC_Init ( void )

{

}

Также создадим на данную функцию прототип в хедер-файле adc.h для видимости её из внешних модулей, а также заодно и посмотрим всё содержимое данного файла

#ifndef ADC_H_

#define ADC_H_

#include "main.h"

void ADC_Init ( void );

#endif /* ADC_H_ */

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

Начнем с управляющего регистра

void ADC_Init ( void )

ADCSRA |= (1<< ADEN )

|(1<< ADPS2 )|(1<< ADPS1 )|(1<< ADPS0 ); //Делитель 128 = 64 кГц

Это не две строки, а одна, так писать в студии можно и даже нужно, так как код становится понятнее. А одна, потому что нет символа конца строки — точки с запятой.

Здесь мы включили бит ADEN , тем самым включили вообще модуль АЦП, а также установили делитель на 128, тем самым, помня то, что частота тактирования у нас 8 МГц и разделив её значение на 128, мы получили работу АЦП на частоте 64 кГц, что вполне нормально и надёжно, до 200 граничных далеко. Как видим, ничего сложного в инициализации регистра нет.

Также ещё в данной функции нам необходимо выбрать канал, к которому мы будем подключать измеряемое напряжение. У нас судя по схеме канал 0, поэтому соответствующий MUX мы и включим. А соответствующий MUX — это все нули в данных битах, поэтому ничего-то и включать не надо. Но мы ещё помним, что в регистре ADMUX у нас помимо всего прочего есть и управляющие биты, а именно биты REFS1 и REFS0, с помощью которых мы установим в качестве источника опорного напряжения внутренний источник на 2,56 вольта, а ADLAR мы не используем

ADCSRA |= (1<< ADEN ) // Разрешение использования АЦП

|(1<< ADPS2 )|(1<< ADPS1 )|(1<< ADPS0 ); //Делитель 128 = 64 кГц

ADMUX |= (1<< REFS1 )|(1<< REFS0 ); //Внутренний Источник ОН 2,56в, вход ADC0

Ну вот, в принципе, и вся инициализация.

Вызовем эту функцию в главном модуле программы в функции main() где-нибудь вот тут

LCD_ini (); //Инициализируем дисплей

ADC_Init (); //Инициализируем АЦП

clearlcd (); //Очистим дисплей

Ну и также нам нужна будет в модуле adc.c ещё одна функция, которая будет инициализировать непосредственно начало процесса аналого-цифрового преобразования в нашем ADC

unsigned int ADC_convert ( void )

{

}

Само собой нужен будет в хедер-файле прототип на неё

void ADC_Init ( void );

unsigned int ADC_convert ( void );

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

Включим преобразование с помощью бита ADSC

unsigned int ADC_convert ( void )

ADCSRA |= (1<< ADSC ); //Начинаем преобразование

Теперь нам надо как-то отследить тот момент, когда данное преобразование закончится. А делается это достаточно легко с помощью мониторинга того же бита ADSC, который по окончании процесса преобразования сам сбрасывается в 0 (When the conversion is complete, it returns to zero). Отслеживается данный бит с помощью условного цикла

ADCSRA |= (1<< ADSC ); //Начинаем преобразование

while (( ADCSRA & (1<< ADSC )));

Ну и по окончании вернём результат в виде беззнаковой величины

while (( ADCSRA & (1<< ADSC ))); //проверим закончилось ли аналого-цифровое преобразование

return ( unsigned int ) ADC ;

Вернёмся теперь в нашу главную функцию main() и создадим там локальную переменную для хранения результата преобразования для дальнейшей с ним работы

int main ( void )

unsigned int adc_value ;

Вызовем функцию преобразования, которая нам положит в нашу переменную результат преобразования

while (1)

adc_value = ADC_convert (); //Вызовем преобразование

Setpos (0,0);

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

Setpos (0,0);

sendcharlcd ( adc_value /1000+0x30);

sendcharlcd (( adc_value %1000)/100+0x30); //Преобразуем число в код числа

sendcharlcd (( adc_value %100)/10+0x30); //Преобразуем число в код числа

sendcharlcd ( adc_value %10+0x30); //Преобразуем число в код числа

Delay_ms (500);

Здесь мы разбиваем по цифрам четырёхзначную величину.

Теперь мы соберём код, прошьём контроллер и посмотрим наши результаты, покрутив резистор на 10 килоом

Вот так вот оно всё и работает.

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

unsigned int adc_value ;

float n ;

Также забудем про существование функции sprintf и попробуем получить плавающий тип на дисплее программным путём. Для этого сначала преобразуем наш сырой результат в плавающий тип явным образом, то есть та же цифра будет, но только тип другой, не забыв, конечно, перед этим поставить курсор в нужное место на дисплее. Для этого существует понятие в языке СИ явного преобразования типов и разделим преобразованный результат на 400

sendcharlcd ( adc_value %10+0x30); //Преобразуем число в код числа

setpos (8,0);

n = ( float ) adc_value / 400;

Тут, конечно, возникает вопрос, а почему мы делим именно на 400. А вот почему.

Это ничто иное как 1024, разделённое на 2,56, то есть на наше опорное напряжение. Видимо, не зря разработчики контроллера выбрали именно такую величину опроного напряжения, чтобы всё делилось без остатка. Почему мы именно такое деление применяем. А потому что у нас есть формула в технической документации

Вот поэтому и мы и вычислили её самую последнюю часть. Осталось теперь лишь только перевернуть ещё наоборот, выразив отсюда входное напряжение, так как неизвестное у нас именно оно. И мы получим, что оно будет у нас равно ADC, делённому на 400, что мы, собственно и сделали выше в коде. Я думаю, всё предельно стало теперь всем понятно.

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

N = ( float ) adc_value / 400;

sendcharlcd (( unsigned char ) n +0x30); //Преобразуем число в код числа

sendcharlcd ("."); //Преобразуем число в код числа

sendcharlcd ((( unsigned char ) ( n *10))%10 +0x30); //Преобразуем число в код числа

sendcharlcd ((( unsigned char ) ( n *100))%10 +0x30); //Преобразуем число в код числа

Delay_ms (500);

Не пугайтесь, сейчас мы всё тут разрулим.

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

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

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

Вот и всё!

Собираем код, прошиваем контроллер и смотрим наши интересные результаты, крутя наш резистор

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

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

  • Частота преобразования - это сколько раз в секунду АЦП сможет измерить напряжение
  • Разрядность - количество дискретных значений напряжения, на который делится весь рабочий диапазон входных напряжений. АЦП в AVR десяти разрядные. То есть, максимальное напряжение на входе АЦП будет переводиться в 2 10 =1024
  • Диапазон входных напряжений - это минимальное и максимальное напряжение, которое можно подавать на входы АЦП. Для avr это диапазон от 0 до напряжения питания микроконтроллера
Для работы АЦП необходим источник опорного напряжения (ИОН). Это эталон, по отношению к которому он измеряет напряжение на входе. В AVR в качестве источника опорного напряжения может выступать напряжения питания МК, источник опорного напряжения, подключенный к ножке ARef и внутренний ИОН на 2,56 в. ИОН должен быть как можно стабильней, от этого зависит точность измерений. Чтобы пощупать все это, давайте сделаем простой вольтметр на 5в. Запускаем CVAVR, на вопрос запустить CodeWizardAVR кликаем "да" и переходим во вкладку ADC

Нам для нашего вольтметра нужно установить источник опорного напряжения на ножке AVCC (ножка питание АЦП ), частота преобразования 500 килогерц

Мы наши измерения с АЦП будем выводить на lcd-дисплей, для его инициализации переходим во вкладку LCD и устанавливаем все, как на скриншоте

Теперь все настройки выполнены, кликаем file->Generate. save and exit . Дописываем код, который сгенерировал CWAVR, и убираем в нём инициализации периферии МК, которые мы не используем, получается следующий код:

#include #include #include // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD #endasm #include #define ADC_VREF_TYPE 0x40 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void main(void) { char lcd_buffer; unsigned int u; // ADC initialization // ADC Clock frequency: 500,000 kHz // ADC Voltage Reference: AVCC pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x81; // LCD module initialization lcd_init(16); while (1) { /*так как АЦП у нас 10-битный, то максимальное число, которое вернет функция, read_adc() будет равно 1024, это число будет эквивалентом напряжения на входе adc0. Например, если read_adc() вернул 512, то это значит, что на вход adc0 мы подали половину опорного напряжения Чтобы вычислить реальное напряжение, нам нужно составить пропорцию опорное напряжение - 1024 искомое напряжение - adc У нас опорное напряжение = 5 Искомое напряжение = 5 * adc/1024, или Искомое напряжение = 0,005*adc для простоты переведём вольты в миливольты, домножив на 1000 Искомое напряжение = 0,005*adc*1000 */ u=read_adc(0) * 5;//вызываем функцию для измерения напряжения и передаем ей номер ножки, на которой нужно измерить напряжение lcd_clear(); //чистим дисплей перед выводом lcd_gotoxy(0,0); // перевод курсор в положение x=0 y=0 sprintf(lcd_buffer,"U = %i mv",u); // формируем строку для вывода lcd_puts(lcd_buffer); //выводим строку на дисплей delay_us(500); //делаем задержку 500 мл }; }

Программа готова, дело за схемой

Схема очень простая, на ней мы видим микроконтроллер atmega8 и lcd-дисплей знакосинтезирующий 16х2 (пример работы с lcd описан ). Наш простой вольтметр измеряет напряжения до 5 в. Как измерять напряжения больше 5 в Схема выполнена в Proteus, все необходимые файлы для этого урока находятся в архиве

Выбор редакции
Для частных клиентов ЗАО Банк ВТБ (Беларусь) предлагает удобный сервис удаленного управления собственными счетами. Чтобы воспользоваться...

Если Вы - продвинутый и активный пользователь Интернета и на 100% уверены, что знаете всё об обмане в Интернете, пожалуй, Вам не стоит...


Что подразумевает под собой понятие «нормальная скорость интернета», какая она должна быть для оптимальной работы и проведения досуга на...
Власти России заявляют о запуске четвертой линии энергомоста. По их информации, теперь суммарно из Краснодарского края в крымскую...
Ничего страшного, тайного и опасного в аббревиатуре PC не зашифровано. Такая надпись на чехле-накладке для Sony Xperia (или другом...
Современные компьютерные игры, очень требовательны к аппаратному обеспечению (железу) компьютера, ноутбука, планшета или мобильного...
Детективный триллер «Исчезнувшая» от известной американской писательницы Гиллиан Флинн, обладательницы большого числа литературных...
Способов запроса баланса множество. Перечисленные инструкции актуальны как для дебетовых, так и для кредитных карт. Достаточно простой...