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

Урок 22

Часть 1

Изучаем АЦП

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

В контроллере Atmega8 АЦП имеет следующие характеристики

  • Разрешение 10 бит,
  • Время преобразования одного показания от 13 до 250 микросекунд в зависимости от битности измерения, а также от тактовой частоты генератора, тактирующего контроллер,
  • Поддержка запуска по прерываниям,

Есть ещё масса различных характеристик, с которыми мы, возможно, познакомимся в дальнейшем.

Как вообще работает цифровое преобразование?

Берётся опорное напряжение и сравнивается с измеряемым. Соответственно, опорное напряжение всегда должно быть больше измеряемого. Если это не так, то нужно будет применять делители напряжения.

Изобразим схематично процесс измерения

Отрезок — это диапазон измерений. Он находится между нулём и опорным напряжением. А стрелка — это измеряемое напряжение.

Данный отрезок делится пополам, и АЦП оценивает, в какой половине находится приложенное напряжение

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

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

Затем та четвертинка опять делится пополам и АЦП опять оценивает,где находится отрезок

И АЦП так и продолжает такой процесс до тех пор, пока не кончатся ячейки для битов. То есть если мы используем 10-битный режим, то. соответственно, и будет 10 подобных измерений и заполнятся 10 бит величины. Чем больше бит, тем точнее результат, но уже потребуется на это больше времени и более серьёзный и точный АЦП. Имея данный результат, нам несложно будет посчитать величину измеренного напряжения. Мы знаем. что если у нас АЦП 10-битный, то данный результат у нас лежит в промежутке от 0 до 1024, получаемтся всего у нас 1023 отрезка. И мы затем наш результат делим на 1023 и умножаем на величину опорного напряжения.

Посмотрим блок-схему АЦП в контроллере Atmega8

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

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

Работать будем сначала в протеусе. Также мы видим, что у нас подключен дисплей самым обычным образом.

Также мы всё подключим и на живом контроллере

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

А вот и таблица вариантов опроных напряжений для АЦП

Перечислим данные варианты сверху вних по таблице. 1 вариант — это внутреннее опорное напряжение, равное напряжению питания, 2 вариант — опорное напряжение подаётся на вход AREF извне, 3 вариант — внутреннее 2,56 вольт с использованием внешнего конденсатора, которы у нас уже припаян к отладочной плате к определённым ножкам контроллера.

Также в АЦП есть делитель частоты на величину от 2 до 128. Делитель этот для того, чтобы мы добивались частоты работы АЦП не больше 200 кГц, иначе точность измерений будет очень малой и мы просто растеряем самые младшие биты. Если у нас возникнет требование имено к скорости измерений и нам уже точность будет на так важна, то мы сможем использовать и более высокие частоты измерений.

Теперь немного поближе познакомимся с регистрами АЦП.

Регистр ADCSRA — управляющий и статусный регистр

Теперь побитно.

ADEN — данный бит включает АЦП.

ADSC — при установке в 1 заставляет АЦП начинать преобразование.

ADFR — используется в режиме с использованием прерываний. При установке в 1 включает круговой режим, при котором измерения автоматически следуют одно за другим.

ADIF — бит, также используемый только в режиме прерываний. Это флаг прерываний, который устанавливается в определённых условиях.

ADIE — бит, включающий режим прерываний.

ADPS2-ADPS0 — биты, от комбинации которых зависит величина делителя

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

Но, помимо непосредственно битов управления каналами у данного регистра есть ещё некоторые управляющие биты

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

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

MUX3-MUX0 — биты, включающие определённый канал мультиплексора

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

Ну и, наконец, регистровая пара ADCH и ADCL , состоящая из старшего и младшего байта в которую и заносится измеряемый результат. А как именно он туда укладывается, этот результат, зависит от состояния бита ADLAR, рассмотренного выше в регистре ADMUX

То есть, если бит ADLAR не выставлен, то младшие 8 бит результата находятся в младшем байте регистровой пары, а 2 старших бита — в младших битах старшего байта. Если же бит ADLAR у нас выставлен, то 8 самых старших бит результата находятся в сатршем байте, а 2 младших в 2 старших битах младшего байта регистровой пары. Второй вариант нам интересен при исользовании 8-битного режима. В данном случае мы читаем только старший байт.

Проект был создан полностью из проекта Test09 и был назван MyADCLCD .

Также для выноса кода для реализации периферии АЦП были созданы стандартным образом два файла adc.h и adc.c . Соответственно файл adc.h был подключен и в файле main.h и в adc.c.

В файл MyADCLCD.c код был также полностью скопирован из главного файла проекта Test09, всё лишнее было удалено. Код в данном файле после данной операции принял следующий вид

#include "main.h"

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

void port_ini ( void )

PORTD =0x00;


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

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

  • Частота преобразования - это сколько раз в секунду АЦП сможет измерить напряжение
  • Разрядность - количество дискретных значений напряжения, на который делится весь рабочий диапазон входных напряжений. АЦП в 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, все необходимые файлы для этого урока находятся в архиве

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

Определение

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

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

Основными можно назвать разрядность и частоту преобразования. Первую выражают в битах, а вторую - в отсчетах на секунду. Современные аналого-цифровые преобразователи могут обладать разрядностью 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, является возможность замены калибровочного кода кодом приложения сразу после снятия характеристик. Таким образом, выполнение калибровки не приводит к увеличению размера памяти программ конечного устройства.

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 имеют на борту АЦП последовательного приближения.
АЦП это десятиразрядное, но при точности +/- 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 .

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то