Аналого-цифровой преобразователь (АЦП)

Все сигналы, с которыми мы работали до настоящего момента — являлись цифровыми, т.е. описывались абстрактным понятием логического уровня. Реальный мир немного сложнее; сигнал может принимать не только 0 В и 3,3 В, но и промежуточные значения. Так многие датчики имеют не цифровой, а аналоговый выход. Встаёт вопрос — «Как такой сигнал обрабатывать?». Микроконтроллер не может работать с такими сигналами на прямую, его нужно преобразовать в цифровой вид при помощи аналого-цифрового преобразователя (англ. Analog to Digital Converter), или просто АЦП (ADC).

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

Существуют разные топологии таких преобразователей и каждая имеет свои достоинства и недостатки. Основными характеристиками АЦП являются: разрядность/разрешение; отношение сигнал-шум (англ. signal/noise ratio, SNR); скорость выборки (англ. sampling rate, отсюда транслитерация семплирование).

Разрядность

Аналоговый сигнал представляется в виде последовательности 0 и 1. Чем длиннее последовательность, тем больше приближен результат конвертации к реальному значению. Говоря о разрядности часто употребляют словосочетание «разрешающая способность» (англ. resolution). Это не одно и тоже, но эти величины связаны. Допустим напряжение некоторого сигнала меняется от 0 В до 5 В, а длина последовательности 8 бит (разрядность АЦП). Тогда 0 В в бинарном виде можно представить так (число 0):

Соответственно 5 В (число 28 - 1 = 255):

Реальное напряжение линейно проецируется на бинарное представление. Т.е. шаг квантования можно найти по формуле:

ВольтДеление

РазрядностьУровней квантованияВольт/Деление, = 3,3 В
82560,012890625
1010240,00322265625
1240960,0008056640625
16655360,00005035400390625
24167772160,0000001966953277587890625

Если на входе 2,55 В (АЦП запитано так же от 5 В), тогда в бинарном виде мы получим:

Как видите погрешность преобразования () равна 0,00859375 В. Такая разница называется ошибкой квантования (англ. quantization error).

Отношение сигнал-шум

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

Подробно на этом останавливаться не будем.

Быстродействие

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

adc comparation

АЦП последовательного приближения

В нашем МК используется АЦП последовательного приближения; рассмотрим данную топологию.

sar

Принцип её действия основан дихотомии, последовательного деления на два и последующего сравнения. Для работы требуется три основных элемента: компаратор, регистр последовательного приближения и цифро-аналоговый преобразователь2. ЦАП формирует напряжение, которое далее сравнивается на компараторе. На первом шаге в регистр записывается половина от максимального значения, т.е. ЦАП формирует напряжение равное ½ шкалы (для 5 В это 2,5 В). Если напряжение окажется выше чем сравниваемое (на выходе компаратора 1), то на втором шаге ЦАП понизит напряжение на ¼ (от максимального значения) и снова сравнит. Так будет продолжаться, пока все разряды не будут проверены. По такому же принципу работает алгоритм бинарного поиска. Легко догадаться: выше разрядность, меньше скорость.

Сама топология может быть реализована по-разному. Конкретно в stm32 используются ёмкости.

adc approx

Описание работы других топологий можно найти в статье на Хабре: «Аналого-цифровое преобразование для начинающих».

АЦП в STM32F1 и режимы работы

Модулей АЦП в микроконтроллере может быть несколько. Соответственно работать они могут независимо друг от друга (англ. Independent mode) и совместно (англ. dual mode). Каждый модуль в свою очередь имеет несколько каналов, которые делятся на регулярные (англ. regular) и инжекторные (англ. injected). Но они чуть позже. Сами каналы могут быть выведены к ножкам МК (внешние), а могут быть подсоединены к внутренним цепям (внутренние), например к датчику температуры МК3 или источнику опорного напряжения.

Микроконтроллер STM32 позволяет настраивать скорость преобразования, например 1.5, 7.5, 13.5, 28.5, 41.5, 55.5, 71.5, 239.5 такта АЦП. Ниже приведены макросы из стандартной библиотеки.

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

Все режимы работы АЦП описаны в документе AN3116.

Незасисимые режимы работы

Так как каналов несколько, то работать с ними можно как по одному, так и группами. Следовательно, можно выделить одноканальный (англ. single channel) и многоканальный (англ. multichannel). Производить измерения можно однократно (англ. single conversion) или непрерывно (англ. continuous). В общей сложности 4 комбинации.

По завершению преобразования происходит событие4 и в соответствующий бит регистра статуса (SR) записывается 1. Бит сбрасывается в 0 либо при чтении результата конвертации, либо его можно сбросить вручную. По событию можно настроить прерывание, что бы у обработчике как-то обрабатывать данные (например просто сохранять их в оперативную память), однако это не самый эффективный способ. Если приходится собирать много данных, то лучше вместо прерываний подключить модуль прямого доступа к памяти (DMA), который разгрузит процессор и самостоятельно будет копировать данные из регистра DR в какую-нибудь переменную или массив.

Как и с прерываниями, некоторые параметры системы могут быть важнее других. Для этого существует ещё один режим работы.

adc inj

Сканирование деругялрных и инжектированных каналов, изображение из AN3116

Так же один из каналов может быть настроен как аналоговый сторожевой (англ. analog watchdog), его задача следить за состоянием напряжения на линии. Если напряжение падает ниже порогового, сработает прерывание по событию AWD, если оно настроено. Это полезно в тех случаях, когда устройство работает от батарейки и перед выключением нужно сохранить\отправить какие-нибудь данные.

Совместный режим работы

В микроконтроллерах может быть более одного модуля АЦП. В некоторых МК от ST может быть до трёх штук. Первые два могут работать совместно, а третий только независимо. В совместном режиме (или парном, dual mode) модуль ADC1 принимает роль ведущего (англ. master), а ADC2 ведомого (англ. slave). Данная возможность полезна, когда нужно ускорить считывание показаний.

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

 

adc reg

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

adc dual fast

Парный, быстрый режим с захлёстом, изображение из AN3116

adc dual slow

Парный, медленный режим с захлёстом, изображение из AN3116

adc dual alternative

Парный, попеременный режим по тригеру, изображение из AN3116

adc dual combined

Парный, совместный, одновременный режим, изображение из AN3116

adc dual inj sim

Парный, совместный режим с инжекцией, изображение из AN3116

Регистры модуля ADC

Завершая изучение модуля ADC нужно поговорить о его регистрах. Ниже представлены все регистры Reference Manual для stm32f103c8 с кратким описанием нужных в этом курсе бит. Тем не менее, обязательно откройте документацию и изучите каждый регистр самостоятельно; в других МК они могут отличаться (название и поведение).

Шаблон работы с модулем примерно следующий:

  1. включить тактирование АЦП (RCC);
  2. настраиваем ножки на вход, аналоговый режим;
  3. настраиваем регистры нужного модуля АЦП на нужный режим работы;
  4. включаем АЦП;
  5. настраиваем каналы;
  6. запускаем и дожидаемся конца калибровки.

Регистр статуса SR

SR

Регистры настроек CR1 и CR2

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

cr1

Второй регистр настроек CR2.

cr2

Регистры скорости выборки

Регистры ADC_SMPR1 и ADC_SMPR2 задают индивидуальную скорость преобразования для каждого отдельного канала, каждому из которых отводится три бита. Доступны следующие скорости: 1.5 (000), 7.5, 13.5, 28.5, 41.5, 55.5, 71.5, 239.5 (111) тайта АЦП.

Остальные регистры

С помощью группы регистров SQR1, SQR2 и SQR3 можно настроить последовательность и количество (L) регулярных каналов преобразования. Инжекторным каналам соответствуют регистры JSQR1, JSQR2 и JSQR3.

sqr1

С помощтю регистров HTR и LTR задаются верхние и нижние пороги для сторожевого канала.

И последние два регистра DR и JDR предназначены для сохранения результатов преобразований регулярных и инжекторных каналов соответственно7.


Назад | Оглавление | Дальше


1 Изучите документ «AN2834. How to get the best ADC accuracy in STM32Fx Series and STM32L1 Series devices».
2 Противоположностью АЦП является ЦАП, Цифро-Аналоговый Преобразователь (англ. Digital to Analog Converter, DAC). Его внутреннее устройство мы рассматривать не будем, т.к. это выходит за рамки курса (к тому же ЦАП отсутствует в нашем микроконтроллере как периферия).
3 Данные с внутреннего датчика не годятся для измерения абсолютных значений, но полезен для оценки динамики изменения температуры, скажем, в корпусе.
4 EOC (сокр. End Of Conversion) для регулярных каналов или JEOC (сокр. End Of Conversion Injected) для инжекторных каналов.
5 Преобразование возможно только за 1.5 такта.
6 Следует использовать модуль DMA, чтобы не потерять данные.
7 На все каналы отводится только один регистр.