Практическое использование АЦП в микроконтроллерах AVR-DA и AVR-DB от Microchip

4 февраля

универсальное применениеMicrochipстатьяинтегральные микросхемыADCMicrochipAVR-DAAVR-DB

Александр Белов (КОМПЭЛ)

В статье рассмотрена настройка обновленного модуля АЦП последовательного приближения новых серий микроконтроллеров AVR-DA и AVR-DB производства Microchip с использованием среды разработки MPLAB X и графического конфигуратора MPLAB Code Configurator.

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

АЦП последовательного приближения имеют в своем составе регистр последовательного приближения (РПП), компаратор и ЦАП. АЦП выполняет преобразование за N шагов, где N – разрядность АЦП. На каждой итерации определяется один разряд искомой величины.

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

Работа данного АЦП выполняется по следующему алгоритму:

  • На первой итерации в старший разряд регистра последовательного приближения записывается единица, и напряжение, соответствующее данному значению, формируется на ЦАП (половина опорного напряжения), происходит сравнение входного напряжения со сформированным. Если сформированное значение меньше входного, то единица в старшем разряде закрепляется, если нет – закрепляется 0. Таки образом, старший разряд уже найден.
  • Второй разряд находится аналогично: записываем во второй по старшинству разряд РПП единицу, совершаем аналоговое преобразование, сравниваем полученное напряжение со входным. Если входное напряжение больше – закрепляется единица, иначе – 0. И так далее.

В 2020 году компания Microchip выпустила новую линейку 8-битных микроконтроллеров. Новая линейка получила название «AVR», одноименное с архитектурой. На данный момент линейку пополнили две серии микроконтроллеров: AVR-DA и AVR-DB. Новые серии получили улучшенный АЦП последовательного приближения c поддержкой дифференциального режима работы.

Отличия от AЦП старой версии, применявшегося в сериях ATtiny-0, ATtiny-1 и ATmega-0 следующие:

  • поддержка дифференциального режима работы;
  • увеличение скорости преобразования до 130 ksps;
  • повышение разрешения до 12 бит;
  • увеличение аккумулятора до 128 выборок.

Как и в АЦП предыдущей версии, поддерживаются следующе режимы работы:

  • единичное преобразование;
  • непрерывное преобразование;
  • преобразование с накоплением;
  • сравнение с порогом;
  • запуск по событию;
  • измерение температуры (от встроенного датчика температуры).

Давайте рассмотрим настройку АЦП на разные режимы работы с использованием среды разработки MPLAB X от Microchip и графического конфигуратора MPLAB Code Configurator на примере микроконтроллера AVR128DA48.

Для примера настроим микроконтроллер следующим образом:

  • частота ядра – 4 МГц от встроенного осциллятора;
  • частота тактирования АЦП – 2 МГц;
  • Single-ended/позитивный канал АЦП – вход AIN0;
  • негативный канал АПЦ – вход AIN5;
  • опорное напряжение АЦП – 2,048 В.

Предполагается, что новый проект уже создан и открыт MPLAB Code Configurator.

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

Настройку микроконтроллера начнем с настройки системы тактирования. Нас интересуют три частоты:

  • CLK_MAIN – частота, задаваемая источником частоты. В качестве источника может выступать внутренний осциллятор высокой частоты, внутренний осциллятор низкой частоты, внешний кварцевый резонатор или внешний генератор тактовой частоты.
  • CLK_CPU и CLK_PER – соответственно, частота ядра и частота, на которой работает периферия. Эти частоты равны и получаются путем деления CLK_MAIN делителем частоты.

Настройка частоты производится во вкладке System Module (рисунок 1).

Рис. 1. Настройка системной частоты

Рис. 1. Настройка системной частоты

Main Clock отображает системную частоту (CLK_CPU/CLK_PER) при текущих настройках.

Clock Source – ниспадающий список, в котором можно выбрать один из четырех источников тактовой частоты:

  • внутренний осциллятор высокой частоты (1…24 МГц);
  • внутренний осциллятор низкой частоты (32,768 кГц);
  • внешний часовой кварц частотой 32,768 кГц;
  • внешний генератор тактовой частоты.

Internal Oscillator Frequency позволяет выбрать, какой внутренний осциллятор будем использовать:

  • внутренний осциллятор высокой частоты (1…24 МГц);
  • внутренний осциллятор низкой частоты (32,768 кГц).

Oscillator Frequency Options задает частоту встроенного осциллятора в диапазоне 1…24 МГц.

PLL Enable включает PLL для Timer D. Используется для повышения частоты тактирования таймера вплоть до 48 МГц.

Prescaler Enable включает делитель частоты.

Prescaler задает значение делителя частоты, если он включен. Варианты выбора – от двух до сорока восьми.

В Clock Output Enable при “1” сформированная частота подается на ножку микроконтроллера CLKOUT.

Оставляем все настройки по умолчанию.

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

Опорное напряжение для модулей АЦП, ЦАП и компараторов задается модулем Voltage Reference (VREF). Окно графического конфигуратора этого модуля показано на рисунке 2.

Рис. 2. Настройка модуля VREF

Рис. 2. Настройка модуля VREF

Как видно из рисунка 2, можно выбрать следующие варианты опорного напряжения для АЦП:

  • 1,024 В;
  • 2,048 В;
  • 4,096 В;
  • 2,5 В;
  • напряжение питания – VDD;
  • внешнее опорное напряжение –VREFA.

Чекбокс Enable Force ADC Voltage позволяет выбрать, будет ли данное опорное напряжение включено всегда или только когда оно необходимо потребителю.

Для примера выберем опорное напряжение 2,048 В.

Настройка АЦП

Основные настройки АЦП отображены на вкладке Easy Setup (рисунок 3).

Рис. 3. Настройка АЦП

Рис. 3. Настройка АЦП

API Prefix задает префикс функций в сгенерированной конфигуратором библиотеке.

Result Selection дает выбор между 10-битным и 12-битным преобразованием.

Differential Mode Conversion дает выбор между дифференциальным и single-ended-режимом работы.

Поскольку регистр результата 16-разрядный, а результат 12- или 10-разрядный, Left в Adjust Result необходимо выбрать выравнивание результата.

Enable ADC задает включение АЦП.

Sample Frequency отображает расчетную скорость преобразования для данных настроек. Тут необходимо дать пояснения относительно времени, которое необходимо на одно преобразование (рисунок 4).

Рис. 4. Временная диаграмма единичного преобразования

Рис. 4. Временная диаграмма единичного преобразования

Общее время преобразования складывается из следующих величин:

  • Два такта частоты CLK_PER необходимы для запуска работы АЦП.
  • Два такта частоты CLK_ADC необходимы для захвата измеряемого напряжения в УВХ. Два такта – это минимальное значение, которое может быть увеличено. Увеличение этого значения используется при измерении напряжения источника с высоким выходным сопротивлением – дает больше времени для подзарядки емкости в УВХ.
  • 13,5 тактов частоты CLK_ADC необходимы на выполнение преобразования при 12-битном преобразовании. В случае 10-битного преобразования это время уменьшается до 11,5 тактов.
  • Формирование результата занимает 2 такта частоты CLK_PER.

CLK_PER – это частота, на которой работает вся периферия микроконтроллера. Она равна частоте ядра (в нашем случае – 4 МГц).

CLK_ADC – частота, на которой работает модуль АЦП. Она получается путем деления частоты CLK_PER входным делителем АЦП, минимальный коэффициент деления которого 2 (по умолчанию), а максимальный – 256. Также на частоту CLK_ADC накладываются следующие ограничения: минимальное значение 125 кГц, максимальное – 2 МГц. В нашем случае она равна 2 МГц.

Таким образом, время одиночного преобразования вычисляется по формуле 1:

$$T_{преобр\_12\:бит}=\frac{(13.5+2)}{F_{CLK\_ADC}}+\frac{4}{F_{CLK\_PER}}\qquad{\mathrm{(}}{1}{\mathrm{)}}$$

В нашем случае время преобразования составляет: Tпреоб_12 бит = 8,75 мкс, что соответствует частоте 114 ksps.

Sample Accumulation Number задает количество выборок в очереди в режиме работы с накоплением.

Sample Length, как уже было сказано выше – минимальное время захвата измеряемого напряжения в УВХ – 2 такта частоты CLK_ADC. С помощью этой настройки можно задать дополнительное время на захват в тактах частоты CLK_ADC.

Детальная настройка АЦП

Для детальной настройки модуля АЦП используется вкладка Registers (рисунок 5).

Рис. 5. Регистры модуля АЦП

Рис. 5. Регистры модуля АЦП

На этой вкладке нас интересуют несколько регистров:

  • регистр MUXPOS задает канал для single-ended-преобразования или позитивный канал для дифференциального преобразования;
  • регистр MUXPNEG задает негативный канал дифференциального преобразования;
  • регистр CTRLA, а точнее его бит FREERUN, позволяет выбрать непрерывный режим работы.

Можно выбрать следующие значения для single-ended/позитивного и негативного каналов:

  • AIN0…AINx – внешние каналы (ножки микроконтроллера);
  • DAC0 – выход модуля ЦАП;
  • DACREF0…DACREF2 – напряжение со встроенных формирователей опорного напряжения компараторов;
  • Ground – напряжение Vss;
  • Temperature Sensor используется для измерения температуры чипа.

Настройка I/O

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

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

Для настройки входов/выходов микроконтроллера используется окно Pin Manager. Если привязать входные каналы АЦП к соответствующим контактам, то эти пины будут инициализированы как аналоговые входы – буферы будут выключены (рисунок 6).

Рис. 6. Настройка входов/выходов

Рис. 6. Настройка входов/выходов

Режим одиночного преобразования

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

Для получения результата достаточно вызвать одну функцию из библиотеки АЦП (листинг 1).

Листинг 1.



adc_result_t ADC0_GetConversion(adc_0_channel_t channel);

adc_result_t – это просто псевдоним типа uint16_t

adc_0_channel_t – это перечисляемый тип, перечисление уже содержит все варианты выбора канала для single-ended-преобразования.

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

Листинг 2.



void main()

{

uint16_t result;

result = ADC0_GetConversion(ADC_MUXPOS_AIN0_gc);

}

Режим непрерывного преобразования

Для перевода АЦП в режим непрерывного преобразования достаточно установить бит FREERUN регистра CTRLA во вкладке детальной настройки (рисунок 7).

Рис. 7. Включение непрерывного преобразования

Рис. 7. Включение непрерывного преобразования

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

Листинг 3.



void main()

{

uint16_t result;

ADC0_StartConversion(ADC_MUXPOS_AIN0_gc);

        while (1)

    {

     if (ADC0_IsConversionDone())

       {

        result = ADC0_GetConversionResult();

       }

    }

}

Режим дифференциального преобразования

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

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

Листинг 4.



diff_adc_result_t ADC0_GetDiffConversion(adc_0_channel_t channel, adc_0_muxneg_channel_t channel1);

Где:

  • diff_adc_result_t – это псевдоним типа int16_t;
  • adc_0_muxneg_channel_t – перечисляемый тип для выбора негативного канала.

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

Листинг 5.



void main()

{

int16_t result;

result = ADC0_GetDiffConversion (ADC_MUXPOS_AIN0_gc, ADC_MUXNEG_AIN5_gs);

}

Режим c накоплением

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

Режим полезен для фильтрации высокочастотных помех и подавления шума.

Для включения этого режима необходимо задать количество выборок в очереди в поле Sample Accumulation Number (рисунок 8).

Рис. 8. Включение режима работы с накоплением

Рис. 8. Включение режима работы с накоплением

Если помеха гармоническая, то для уменьшения погрешности измерения необходимо отодвинуть частоту семплирования как можно дальше от частоты этой помехи. Для этого используется битовое поле SAMPDLY[3:0] регистра CTRLD.

Поле SAMPDLY задает задержку между последовательными измерениями в очереди. Задержка измеряется в периодах частоты CLK_ADC (листинг 6).

Листинг 6.



#define ADC_SHIFT_DIV16 (4)

void main()

{

uint16_t result;

result = ADC0_GetConversion(ADC_MUXPOS_AIN0_gc);

result = result >> ADC_SHIFT_DIV16; // Делим на количество выборок или на 16
                                    // если количество выборок > 16

}

Сравнение с порогом

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

  • результат меньше нижнего порогового значения;
  • результат больше верхнего порогового значения;
  • результат внутри окна (между верхним и нижним пороговыми значениями);
  • результат снаружи окна.

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

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

16-битные регистры WINLT и WINHT задают нижнее и верхнее пороговое значение соответственно. Регистр CTRLE задает режим сравнения.

Настройка данного режима работы производится в секции Window Settings вкладки Easy Setup (рисунок 9).

Рис. 9. Настройка режима сравнения с порогом

Рис. 9. Настройка режима сравнения с порогом

Window Comparator Mode задает режим сравнения.

Чекбокс Enable IRQ on conversion complete включает прерывание по завершению преобразования.

Чекбокс Enable IRQ on conversion satisfying window criteria включает прерывание по результату сравнения полученного значения преобразования с порогом.

Window Comparator High Threshold задает верхний порог.

Window Comparator Low Threshold задает нижний порог.

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

Листинг 7.



void ADC0_RegisterWindowCallback(adc_irq_cb_t f);

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

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

Для включения возможности запуска преобразования по событию необходимо установить бит STARTEI регистра EVCTRL.

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

Рис. 10. Настройка системы событий

Рис. 10. Настройка системы событий

Измерения температуры контроллера

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

Угловой коэффициент прямой и ее смещение определяются при производстве микросхемы и записываются в специальную область памяти данных – SIGROW.

Константа TEMPSENSE0 содержит угловой коэффициент, а TEMPSENSE1 – смещение.

Для измерения температуры необходимо задать следующие настройки АЦП:

  • опорное напряжение АЦП – 2,048 В;
  • мультиплексор MUXPOS настроен на датчик температуры;
  • разрядность преобразования – 12 бит;
  • выравнивание результата – правое;
  • режим преобразования – single-ended.

Температура в Кельвинах вычисляется по формуле 2:

$$T=\frac{(Offset-ADC\:Result)\times Slope}{4096},\qquad{\mathrm{(}}{2}{\mathrm{)}}$$

где:

  • Offset – значение константы TEMPSENSE1;
  • Slope – значение константы TEMPSENSE0.

Пример функции получения температуры представлен в листинге 8.

Листинг 8.



int16_t ADC0_GetTemp(void)

{

uint32_t temp;

uint16_t adc_result;

adc_result = ADC0_GetConversion(ADC_MUXPOS_TEMPSENSE_gc);

temp = SIGROW.TEMPSENSE1 - adc_result;

temp *= SIGROW.TEMPSENSE0;

temp += 0x0800;      // Один градус равен 4096, чтобы округление до целого числа градусов
                     // было в ближайшую сторону, добавляем половину градуса (2048)

temp >>= 12;         // Получаем целое число градусов

return temp - 273;   // Переводим градусы Кельвина в градусы Цельсия

}

Подводим итог

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

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

Помимо рассмотренного в статье MPLAB Code Configurator, компания Microchip предлагает и другие средства разработки с возможностью графического конфигурирования – Atmel Start для микроконтроллеров с архитектурой AVR и MPLAB Xpress для контроллеров с ядром PIC. Данные среды разработки являются облачными и не требуют установки на компьютер.

•••

Наши информационные каналы

О компании Microchip

Microchip Technology Inc. - ведущий поставщик микроконтроллеров, схем смешанного сигнала, аналоговых полупроводников и решений на основе флэш-IP. Решения Microchip обеспечивают разработку с низким уровнем риска, снижают общую стоимость системы и сокращают время выхода на рынок для тысяч различных клиентских приложений по всему миру. Штаб-квартира в Чандлер, штат Аризона. Продукция Microchip обладает высокими качеством и уровнем технической поддержки. Продукция Microchip обладает высоким уровн ...читать далее

Товары
Наименование
AVR32DA28-I/SS (MCRCH)
AVR32DA32-I/RXB (MCRCH)
AVR32DA28-I/SO (MCRCH)
AVR32DA32-I/PT (MCRCH)
AVR64DA28-I/SO (MCRCH)
AVR64DA28-I/SS (MCRCH)
AVR64DA32-I/PT (MCRCH)
AVR64DA32-I/RXB (MCRCH)
AVR128DA28-I/SO (MCRCH)
AVR128DA28-I/SS (MCRCH)
AVR128DA32-I/RXB (MCRCH)
AVR128DA32-I/PT (MCRCH)
AVR32DB28-I/SP (MCRCH)
AVR32DB32-I/RXB (MCRCH)
AVR32DB48-I/PT (MCRCH)
AVR32DB48-I/6LX (MCRCH)
AVR64DB64-I/PT (MCRCH)
AVR64DB32-I/RXB (MCRCH)
AVR64DB48-I/PT (MCRCH)
AVR64DB28-I/SP (MCRCH)