Улучшение оцифровки с помощью передискретизации и усреднения Печать
Добавил(а) microsin   

Многие приложения требуют измерений с использованием аналого-цифрового преобразователя (analog-to-digital converter, ADC). Такие приложения предъявляют требования к оцифровке сигнала на основе динамического диапазона сигнала, на основе самого малого значения параметра, которое нужно измерить, и на основе соотношения сигнал/ШУМ, в которых ведется оцифровка (signal-to-noise ratio, SNR). По этой причине многие системы применяют специальное внешнее ADC с высокой разрешающей способностью. Однако есть техники, которые можно использовать для достижения измерений с повышенным разрешением и SNR. Этот апноут описывает техники передискретизации (oversampling) и усреднения (averaging), чтобы во время аналого-цифровых преобразований увеличить разрешающую способность (количество разрядов в оцифровке сигнала) и повысить коэффициент SNR. Передискретизация и усреднение могут повысить точность измерения без лишних затрат на аппаратуру, и избавят от сложности в применении дорогих внешних ADC. Кроме передискретизации и усреднения, рассмотрены также вопросы оптимального шума ADC, который желателен в применении этой техники. Примеры кода, где демонстрируются передискретизация и усреднение, показаны в приложениях A, B и C в конце этого документа.

Ключевые возможности передискретизации и усреднения:

• Передискретизация и усреднение может использоваться для повышения разрешающей способности измерения, что снимает проблемы применения внешних дорогих высокоточных ADC.
• Передискретизация и усреднение повышает SNR и разрешающую способность ценой увеличения нагрузки на CPU и снижения интенсивности выходного потока оцифрованных данных.
• Передискретизация и усреднение улучшат SNR для "белого" шума.
• Упрощается антиалиазинговый ФНЧ на входе АЦП (либо при той же сложности ФНЧ повышается его эффективность).

[Источники шума при аналого-цифровом преобразовании]

Шум в преобразованиях ADC может получаться из многих источников. Например, это может включать: температурный шум, импульсные помехи, изменения напряжения питания и опорного напряжения, фазовый шум из-за дрожания тактовой частоты оцифровки и шум ошибки квантования. Шум, который появляется из-за ошибки квантования, обычно называют шумом квантования (quantization noise). Мощность шума от этих источников может меняться. Для снижения шума могут применяться многие техники, такие как тщательная разводка печатной платы в местах разводки сигналов, установки блокировочных конденсаторов и разводки цепей опорного напряжения. Однако ADC всегда будет иметь шум квантования, так что даже самый лучший по SNR преобразователь данных будет тратить как минимум 1 бит на шум квантования, если не применять передискретизацию. В корректных условиях передискретизация и усреднение могут снизить шум и повысить SNR. Это увеличит эффективное количество бит в результатах измерений. Подобная система показана на рис. 1, и она может быть реализована как на встроенных в процессор ADC, так и на внешних ADC, подключенных к процессору снаружи как дополнительная микросхема. Программный код берет набор выборок сигнала и усредняет их (фильтрует) для получения результата.

AN118 oversampling and averaging fig1

[Повышение разрешающей способности в измерении ADC]

Многие приложения имеют дело с измерениями в широком динамическом диапазоне значений, при этом все еще требуя точности в измерении малых изменений входного параметра. Например, ADC может измерять температуру в широком диапазоне, и системе требуется отвечать на изменения температуры меньше 1 градуса, что повлечет измерения точности 16 бит. АЦП такой точности обычно не бывают встроенными в микроконтроллер. Вместо применения дорогого, внешнего 16-битного ADC можно задействовать передискретизацию и усреднение результатов встроенного 12-битного ADC (имеется на борту у многих процессоров Silicon Lab, Atmel и других производителей), и тогда можно измерять параметр температуры с точностью 16 бит.

Некоторые приложения будут использовать ADC для анализа сигнала, в котором есть высокочастотные составляющие. Такие системы также получать выгоду от передискретизации и усреднения. Требуемая частота оцифровки в соответствии с теоремой Найквиста (Котельникова):

fn = 2 * fm                   [Формула 1. Теорема Найквиста]

Здесь fm это частота самой высокочастотной компоненты в сигнале, которая нас еще интересует. Частота fn это минимально необходимая частота оцифровки этого сигнала.

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

[Как вычислить частоту передискретизации для повышения разрешения АЦП]

Повышение разрешающей способности АЦП заключается в повышении количества эффективных разрядов оцифровки (effective number of bits, ENOB). Чтобы повысить ENOB, в описываемой технике сигнал подвергается передискретизации, т. е. оцифровывается в ADC на частоте fos, которая выше, чем требуемая частота оцифровки сигнала fs. Требуемая частота выборки определяется тем, как частот система требует измерения параметра (выходная скорость выдачи выборок сигнала), или это может быть частота Найквиста fn.

Для каждого дополнительного бита разрешающий способности сигнал должен быть передескретизирован в 4 раза чаще:

fos = 4w * fs                 [Формула 2. Вычисление частоты передискретизации]

Здесь W это требуемое количество дополнительных бит, на которое нужно повысить разрядность выходных выборок сигнала, fs это оригинальная частота оцифровки (без передискретизации), а fos это частота оцифровки с применением передискретизации.

Примечание: вывод формулы 2 представлен в Приложении A.

Предположим, что в системе есть 12-битный АЦП для вывода значения температуры каждую секунду (частота fs = 1 Гц). Чтобы повысить разрешающую способность измерения до 16 бит, мы рассчитаем частоту передискретизации следующим образом:

fos = 44 * 1(Гц) = 256 Гц

Т. е. если мы повысим частоту выборок сенсора температуры до fs=256 Гц, то соберем достаточно выборок за требуемый период (1 сек), и сможем усреднить эти выборки, и в результате получить 16-битные выходные данные. Чтобы сделать это, мы накапливаем (складываем друг с другом 256 следующих друг за другом выборок), затем поделим сумму на 16 (или выполним сдвиг суммы вправо на 4 разряда). Такой процесс называется децимация (прореживание). Это даст 16-битные данные оцифровки. Как только мы вычислим результат обработки 256 выборок (для нашего примера), мы сохраним или обработаем этот результат, и начнем собирать данные (следующие 256 выборок) для следующего выходного слова.

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

Пример такой операции передискретизации и усреднения оцифровок приведен в Приложении C. В этом примере встроенный в кристалл микроконтроллера Silicon Labs датчик температуры оцифровывается встроенным 12-битным ADC, чтобы получить 16-битное измерение. Для дополнительной информации о том, как передискретизация влияет на шум в измерениях и повышает разрешающую способность, см. Приложение A.

[Вычисление требований к передискретизации для увеличения SNR]

Теоретический предел SNR в измерениях величин с помощью ADC базируется на шуме квантования, который вносится из-за ошибки квантования, свойственной процессу аналого-цифрового преобразования, когда нет никакой передискретизации и нет усреднения. Поскольку ошибка квантования зависит от количества бит разрешающей способности ADC (см. формулу 5), для самого лучшего случая SNR вычисляется как функция от эффективного количества бит данных преобразования по следующей формуле:

SNR(dB) = (6.02 * ENOB) + 1.76            [Формула 3. Зависимость SNR от ENOB]

Здесь ENOB это эффективное количество бит в измерении (Effective Number Of Bits).

Обратите внимание, что Формула 3 справедлива для максимального сигнала на входе (full-scale input). Т. е. динамический диапазон входного сигнала должен соответствовать опорному напряжению ADC. Если это не так, то реальный SNR будет меньше, чем будет получен результат SNR по формуле 3.

Если используется ADC на 12 разрядов без передискретизации, то самый лучший SNR (вычисленный по формуле 3) составит 74 dB. Если же нам нужен SNR лучше, то нам нужно вычислить требуемое количество эффективных разрядов (ENOB) с использованием формулы 3 для заданного SNR. Как только будем знать требуемое ENOB, мы сможет использовать формулу 2, чтобы вычислить требования к передискретизации.

Например, если в приложении требуется SNR 90 dB, то понадобится разрешающая способность как минимум 16 бит. Используя 12-битный ADC и формулу 2, мы вычислим, что частота выборок для передискретизации должна быть повышена в 256 раз.

[При каких условиях работают передискретизация и усреднение]

Эффективность передискретизации и усреднения зависят от характеристик доминантных источников шума. Ключевое требование состоит в том, чтобы имеющийся шум можно было бы смоделировать как белый шум. Пожалуйста обратитесь к Приложению B, где обсуждаются характеристики шума, которые выгодны для техник передискретизации. Ключевые моменты подробно рассмотрены в литературе [3, 4], кратко они заключаются в следующем:

• Шум должен аппроксимироваться к белому шуму с универсальной (равномерной) спектральной плотностью по мощности в полосе частот интересующего сигнала.
• Амплитуда шума должна быть достаточной, чтобы входной сигнал случайно менялся от выборки к выборке на величины, сравнимые с весовой дистанцией соседних кодов ADC (например, на величину 1 бита младшего разряда, LSB - см. формулу 5 в Приложении A).
• Входной сигнал можно представит как случайную переменную, у которой есть одинаковая вероятность величин, существующих в любых соседних значениях (отличающихся на 1 бит младшего разряда LSB) выходных кодах ADC.

Примечание: техники передискретизации и усреднения не компенсируют интегральную нелинейность ADC (Integral Non-Linearity, INL).

Шум, который имеет корреляцию, или который не может быть смоделирован как белый шум (такой шум, как например шум в системах с обратной связью) не даст выгоду при использовании передискретизации. Кроме того, если мощность шума квантования больше, чем натуральный белый шум (например температурный шум), то передискретизация и усреднение не будут эффективны. Это частый случай с ADC малой разрешающей способности. Большинство приложений, использующих 12-битные ADC (именно такие АЦП стоят, к примеру, в большинстве микроконтроллеров AVR и ARM), могут получить выигрыш от передискретизации и усреднения.

Дополнительную информацию по этой теме см. в Приложении B.

[Пример]

Пример кода, где применены техники передискретизации и усреднения, приведен в Приложении C. Этот код предназначен для встроенного в микроконтроллер Silicon Labs 12-битного ADC со скоростью выборок 100 ksps (тысяч выборок в секунду). В примере ADC выполняет 16-битные измерения, и результаты выводит через аппаратный UART.

По формуле 2 был вычислен коэффициент передискретизации 256. Предоставленный код (AN018_SW.c) складывает 256 следующих друг за другом выборок ADC в переменную аккумулятора. После того, как все 256 выборок сложены друг с другом, аккумулятор сдвигается вправо на 4 бита (соответствует делению на 32), и результат помещается в переменную. Эта операция дает полезные данные с разрядностью 16-бит. После того, как результат был вычислен, аккумулятор очищается для следующей такой же операции. Накопление выборок ADC выполняется в обработчике прерывания завершения преобразования ADC (подпрограмма ADC_isr).

Для дополнительной информации по конфигурированию и использованию встроенного в кристалл температурного сенсора см. апноут "AN003 - Using the On-Chip Temperature Sensor".

[Улучшение разрешающей способности]

Мы делаем передискретизацию и усреднение сенсора температуры для повышения разрешающей способности с 12 до 16 бит. Давайте оценим, насколько повысилась точность измерения температуры.

Полная шкала выхода встроенного в кристалл температурного сенсора составляет несколько меньше 1V. Если принять, что опорное напряжение (Vref) равно 2.4V, мы может вычислить ширину кода и разрешающую способность по температуре (минимальное измеряемое изменение температуры) для 12-битных и 16-битных измерений.

12-битное измерение температуры. Без передискретизации мы получаем 12-битный результат температуры. Встроенный в кристалл микроконтроллера сенсор температуры будет изменять выходное напряжение на 2.8 mV для каждого градуса Цельсия. Разрешающая способность по напряжению для Vref=2.4V и усилении PGA в 2 раза (по формуле 5 в Приложении A):

Δ = 2.4 / (212 * 2) = 293 (mkV/°C)

Здесь Δ (дельта) это код, который определяется по формуле 5. Множитель 2 в делителе учитывает усиление PGA в 2 раза.

Таким образом, температурная разрешающая способность при 12-битном измерении составит (количество градусов Цельсия на код ADC):

Tres12 = (293 mkV / code) * (°C / 2.4 mV) = 0.1046 °C/код

Tres12 это температурная разрешающая способность для 12-битного измерения. Получается, что для каждого выходного кода ADC, минимальное измерение температуры, которое можно зарегистрировать, составит 0.104 °C или больше одной десятой градуса. Возможно, что это окажется недостаточным, и нам нужно показывать температуру с точностью, близкой к одной сотой градуса. Повысить разрешающую способность можно на том же самом 12-битом ADC с применением передискретизации и усреднения.

16-битное измерение температуры. Повышение эффективного количества бит (ENOB) до 16 с помощью передискретизации и усреднения дает новую разрешающую способность, вычисляемую следующим образом:

Δ = 1.2 / 216 = 18.3 (mkV/°C)

Таким образом, можно измерить следующее минимальное изменение температуры:

Tres16 = (18.3 mkV / code) * (°C / 2.8 mV) = 0.0065 °C/код

Tres16 это температурная разрешающая способность для 16-битного измерения. Теперь, применяя передискретизацию и усреднение, с тем же самым 12-битным ADC мы можем регистрировать изменения температуры уже 0.007 °C. Это теперь позволяет измерять температуру с точностью лучше одной сотой доли градуса.

[Понижение выходного потока данных]

Под выходным потоком данных понимают количество выходных слов данных, полученных за единицу времени. Если ADC способен дать максимальную скорость выборок 100 ksps, то мы можем получить выходной поток данных 100 тысяч выборок в секунду без передискретизации и усреднения. Однако, если мы применим передискретизацию и усреднение (децимацию, прореживание), чтобы получить повышенную разрешающую способность, то выходной поток данных снизится в соответствии с коэффициентом передискретизации OSR (см. формулу 7). Передискретизация с коэффициентом 256, как было показано в предыдущем примере, даст нам выходной поток данных 100 ksps/256 = 390 выборок в секунду (390 Гц). Таким образом, разработчик выбирает компромисс между разрешающей способностью и полосой выходного потока данных на заданной частоте выборок. Еще один компромисс, который решает разработчик - снижение/повышение нагрузки на процессор, приходящийся на каждый период измерения, потому что для достижения дополнительной разрешающей способности требуются вычисления в обработке дополнительных выборок (суммирование и деление).

[Общие выводы]

Если шум ADC можно аппроксимировать как белый шум, то передискретизация и усреднение может улучшить соотношение сигнал/шум (SNR) и эффективную разрешающую способность измерения. Это верно как для измерений статического постоянного тока/напряжения (DC), так и для входных сигналов с высокочастотными компонентами. Формула 2 показывает, что каждый дополнительный бит разрешающей способности измерения может быть получен четырехкратным повышением частоты дискретизации (это называется передискретизацией) и последующим усреднением полученных 4 значений. Каждый дополнительный бит разрядности добавляет примерно 6 dB для SNR (формула 3) ценой снижения выходного потока данных и увеличение вычислительной нагрузки на процессор.

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

[Как передискретизация и усреднение улучшают качество оцифровки]

Передискретизация и усреднение делается, чтобы получить 2 вещи: улучшение SNR и повышение эффективной разрешающей способности (например, повышение количества эффективных бит в измерении ADC). Хотя эти понятия звучат и выглядят по-разному, по сути они отражают одно и то же. Например, если у нас есть 12-битный ADC, и хотим генерировать 16-битное разрешение в измерениях, то мы можем использовать передискретизацию и усреднение, чтобы получить тот же самый SNR 16-битного ADC. Это увеличит количество эффективных бит в данных измерения (effective number of bits, ENOB), что является другой мерой SNR. Понижая порог шума в рабочем диапазоне сигнала, передискретизация и усредняющий фильтр позволяет нам реализовать 16-битные выходные слова измерений.

Как передискретизация влияет на шум в рабочем диапазоне частот. Частота выборок fs позволит восстановить интересующие сигналы, частота которых меньше половины частоты выборок (теорема Найквиста/Котельникова). Таким образом, если частота выборок 100 кГц, то сигналы частотой ниже 50 кГц могут быть восстановлены и надежно проанализированы. Вместе с входным сигналом здесь будет присутствовать и сигнал шума (в белом шуме присутствуют составляющих всех частот спектра), так что он закроет собой или исказит полезный сигнал в измеряемом диапазоне частот (частоты, которые меньше половины от частоты оцифровки fs).

E(f) = erms * (2/fs)1/2                      [Формула 4. ESD шума, попадающего в рабочий диапазон частот]

Здесь erms это средняя мощность шума, fs частота выборок и E(f) это ESD (аббревиатура ESD означает энергетическую плотность спектра сигнала, Energy Spectral Density) рабочего диапазона частот.

Формула 4 показывает, как энергетическая плотность спектра (ESD) или нижний порог оцифрованного шума уменьшится в диапазоне частот сигнала при увеличении частоты выборки [4].

[Взаимосвязь между передискретизацией и повышением разрешающей способности]

Задаваясь фиксированной мощностью шума из-за ошибок квантования, мы можем вычислить, какая должна быть передискретизация для повышения эффективной разрешающей способности. Например, если нужно увеличить эффективное количество бит параметра, измеряемое 12-битным ADC, до 16-бит, то мы захотим установить закономерность, которая позволит вычислить параметры передискретизации. Чтобы сделать это, сначала определим характеристики шума.

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

Дистанция между соседними кодами ADC определяют ошибку квантования. Поскольку ADC будет округлять выходное значение до ближайшего уровня квантования, или кода ADC (здесь B кто количество бит кода ADC, и Vref это значение опорного напряжения):

Δ = Vref / 2N

Ошибка квантования (eq) равна:

eq ≤ Δ / 2

Предполагая, что шум аппроксимируется как белый шум, случайная переменная, представляющая шум, одинаково распределена с нулевым средним значением между кодами ADC. Таким образом, можно вычислить среднюю мощность шума [4]:

         Δ/2                       
erms2 =    (eq2/Δ)de = Δ2/12   
        -Δ/2            

[Формула 6. Мощность шума, генерируемая ошибкой квантования в ADC]

Соотношение требуемой по теореме Найквиста частоты выборки с частотой оцифровки (см. формулу 1) будет коэффициентом передискретизации (oversampling ratio, OSR):

OSR = fs / (2 * fm)        [Формула 7. Коэффициент передискретизации]

Здесь fs это частота выборок, и fm это самый высокочастотный интересующий нас компонент во входном сигнале.

Если шум белый, то мощность шума в рабочем диапазоне частот на выходе ФНЧ (см. рис. 1) равна:

      fm
n02 =   erms(f)2df = erms2 (2*fm/fs) = erms2/OSR
       0
[Формула 8. Мощность шума в рабочем диапазоне частот как функция OSR]

Формула 8 покажет нам, как можно снизить мощность входного шума путем повышения OSR. Передискретизация и усреднение не влияют на мощность сигнала  [2]. Таким образом, мы повышаем SNR, потому что передискретизация снижает мощность шума и не влияет на мощность сигнала.

По формулам 5, 6 и 8, мы можем вывести следующее выражение, связывающее мощность шума с коэффициентом передискретизации и разрешающей способностью [2]:

n02 = 1/(12 * OSR) * (Vref / 2N)2      [Формула 9. Мощность шума как функция от OSR и разрешающей способности]

Здесь OSR это коэффициент передискретизации, N количество бит ADC, и Vref опорное напряжение.

С другой стороны, учитывая фиксированную мощность шума, мы можем вычислить требуемое число битов. Решая формулу 9 для N, мы получаем формулу 10, которая показывает, как вычислить количество эффективных битов на заданном опорном напряжении, шуме в рабочей полосе частот и коэффициенте передискретизации OSR [2].

ENOB = -(1/2)log(OSR)2 -(1/2)log(12)2 -(1/2)log(n02)2 +log(Vref)2     [Формула 10. ENOB как функция от Vref, мощности шума в рабочей полосе частот и OSR]

Из формулы 10 мы видим следующее: каждое удвоение частоты выборки снижает шум в полосе частот сигнала на 3 dB, и повышает разрешающую способность на 1/2 бита [4].

В практическом смысле мы измеряем сигнал в ограниченном диапазоне частот (частоты меньше (1/2)*fs), и тогда делаем передискретизацию этого сигнала с коэффициентом OSR. Результирующие выборки усредняются (или прореживаются) для получения результирующих выходных данных. Для каждого дополнительного бита разрешающей способности (что соответствует снижению шума на 6 dB) мы делаем передискретизацию так, что частота выборок повышается в степени числа 4:

fos = 4w * fs                   [Формула 11. Частота передискретизации для добавления разрешающей способности измерения]

Формула 11 это формула 2, которая появилась в начале этого апноута. Если мы используем 12-битный ADC, встроенный в кристалл микроконтроллера, и хотим при этом получить точность 16-битного ADC, то нам нужны дополнительные 4 бита разрешающей способности. 4 в степени 4 (согласно формулы 11) дадут 256. Таким образом, нужно при оцифровке делать передискретизацию с частотой в 256 раз выше, чем частота, требуемая по теореме Найквиста. Если требуемый частотный диапазон сигнала ограничен 60 Гц (fm=60 Гц), то для передискретизации мы должны получать выборки с ADC на частоте 120 Гц * 256 = 30.7 кГц. Мы повысим эффективную разрешающую способность путем улучшения SNR в нашем рабочем диапазоне входных интересующих частот.

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

AN118 freq profiles input signal fig2

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

Обратите внимание, что когда происходит передискретизация, сниженный профиль шума перекрывает профиль входного сигнала. Таким образом, ФНЧ может быть более более селективным без влияния на входной сигнал, и лучше фильтровать рабочий диапазон сигнала. Мощность шума на выходе фильтра можно вычислить по формуле 8. Этот уровень шума снижается из-за передискретизации и усредняющего фильтра, что показано на рис. 3.

AN118 freq profiles oversampled signal fig3

Рис. 3. Профиль частоты передискретизованного сигнала и идеальный ФНЧ, срезающий шум.

Шум, фильтруемый в диапазоне между fm и fm/OSR. Без передискретизации ФНЧ не удалил бы этот шум. Частота следования выходных данных понижается (прореживается) с коэффициентом OSR (см. рис. 1) к оригинальной частоте Найквиста fn. Это даст входному сигналу частотный профиль, как будто бы он был оцифрован на частоте Найквиста, и профиль шума меньшего уровня (если он фильтруется) в соотношении erms/OSR (см. рис. 4).

AN118 output signal fig4

Рис. 4. Передискретизованный сигнал после фильтра и усреднения частоты выборок до частоты Найквиста показывает сниженный порог шума.

[Вычисление соотношения сигнал/шум (SNR)]

SNR определяется как отношение среднеквадратической мощности сигнала (rms signal power) к среднеквадратической мощности шума (rms noise power), выраженное в децибелах (dB). Независимо от того, как тщательно мы стараемся удалить источники шума из результатов ADC, все равно шум квантования будет присутствовать. Таким образом, идеальный SNR (идеальный - это когда все другие источники шума, кроме шума квантования, отсутствуют) вычисляется на основе шума квантования, когда не применяются передискретизация и усреднение. Формула 5 показывает наивысшую разрешающую способность ADC, низшую ошибку квантования и, таким образом, низший шум квантования. Чем больше разрядов в ADC, тем лучше может быть SNR. Как было показано в предыдущих секциях, передискретизация и усреднение уменьшают шум в рабочем диапазоне частот, улучшают SNR и повышают количество эффективных бит (ENOB). ENOB это другая характеристика SNR, и оба этих параметра вычисляются для определения спецификаций и требований к необходимой передискретизации.

Чтобы получить самый лучший случай SNR, динамический диапазон входного сигнала должен соответствовать опорному напряжению ADC (reference voltage, Vref). Если предположит, что входной сигнал является синусоидальным с размахом в полную шкалу АЦП, то среднеквадратическое значение (RMS) будет функцией от Vref, что может быть вычислено по формуле:

Vrms = Vref / (2*√2)                      [Формула 12. Среднеквадратическое значение (RMS) входного сигнала как синусоидальный сигнал с амплитудой на всю шкалу ADC]

Из вычисления мощности шума по формуле 9, мы обнаружим, что мощность шума RMS является функцией количества бит N (при отсутствии передискретизации):

Vrms = Vref / (2N*√12)                      [Формула 13. Значение RMS мощности шума]

SNR в децибелах (dB) вычисляется следующим образом:

NR = 20*log(Vrms/n0) = 20*log(2N√12 / 2√2)                     [Формула 14. SNR как функция от количества бит N]

При передискретизации мы можем подставить эффективное количество бит (ENOB) для N в формуле 14. Упрощая формулу 14, и подставляя ENOB для N, мы получим хорошо известный результат в децибелах:

SNR(dB) = (6.02 * ENOB) + 1.76      [Формула 15. Вычисление SNR как функции ENOB]

[Усреднение для повышения эффективной разрешающей способности измерений постоянного тока]

К настоящему времени мы рассмотрели измерение сигналов в некотором диапазоне интересующих частот, до частоты fm. Однако наша цель может заключаться в измерении относительно постоянного сигнала (уровня напряжения или силы тока) DC. Постоянным напряжением можно с определенной условностью считать сигнал на выходе датчика температуры, потому что его значение обычно меняется медленно. Если мы хотим измерять сигнал, который относительно статический, т. е. его доминантная частота близка к нулю Гц, мы все еще можем повысить эффективную разрешающую способность путем передискретизации и усреднения [3].

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

Передискретизация и усреднение как интерполяционный фильтр. Усреднение данных от измерений ADC эквивалентно цифровому ФНЧ с последующим снижением частоты выборок (см. рис. 1). Цифровая обработка, которая делает передискретизацию и ФНЧ входного параметра, часто называют интерполяцией. В этом смысле мы используем передискретизацию для интерполяции, к примеру, чисел между 12-битными кодами ADC. Чем большее количество выборок усредняется, тем больше получится селективность ФНЧ, и тем лучше будет интерполяция.

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

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

Требования к шуму для эффективной передискретизации. Передискретизация и усреднение может улучшить SNR и повысить эффективную разрешающую способность данных аналого-цифрового измерения. Однако это будет работать только если шум ADC можно аппроксимировать как белый шум [3, 4]. Если входной сигнал меняется случайно от выборки к выборке на величину амплитуды, сопоставимую с весом младшего разряда (1 LSB), и у входного сигнала одинаковая вероятность появления в любом месте между двумя соседними кодами, то шум может быть смоделирован как белый (т. е. случайный, с равномерным распределением спектра). Белый шум характеризуется наличием универсальной спектральной плотности мощности сигнала в интересующем диапазоне частот. Когда шум можно аппроксимировать как случайный, то передискретизация и усреднение могут улучшить SNR и повысить эффективную разрешающую способность для данных.

Если общий шум не стационарный (например, какой имеется в системах с некоторой корреляцией из-за обратной связи), то передискретизация и усреднение не будут эффективными. Кроме того, если шум квантования сравним с источниками белого шума (например, термальный шум или импульсные помехи малы по сравнению с шумом квантования), то передискретизация и усреднение могут быть не эффективны. Такая ситуация типична, когда используются ADC с малым разрешением (например, 8-битные ADC). В таком случае термальный шум не даст достаточной амплитуды, чтобы входной сигнал случайно менялся с равной вероятностью между кодами, потому что ширина кода Δ (см. формулу 5) слишком велика. Некоторые приложения специально инжектируют шум в сигнал (!) или делают внутреннюю аналогичную обработку (получая шум от генератора псевдослучайных чисел), чтобы преодолеть этот эффект. Это называется дизерингом (dithering).

Анализ с помощью гистограммы. Большинство приложений, которые измеряют сигнал с использованием 12-битного ADC, получат выигрыш от техник передискретизации и усреднения. Имеется практическое средство определения характеристик шума (подходят ли они для передискретизации и усреднения) - анализ выходных данных ADC по гистограмме (см. рис. 5 ниже)[3]. Эта гистограмма показывает, сколько выборок, полученных от ADC, соответствует каждому из значений кода ADC. Если входной сигнал это постоянное напряжение, то гистограмма будет аппроксимироваться к функции распределения вероятностей Гаусса (Probability Distribution Function, PDF). Если шум белый, то гистограмма будет выглядеть, как на рис. 5 [3]. Из-за входного напряжения позиция "bin" гистограммы для кода 1024 получит наибольшее количества выборок, в то время как соседние коды также получат выборки из-за наличия шума. Из-за того, что гистограмма аппроксимируется как Гауссова функция PDF (показано голубой пунктирной линией на рис. 5), то шум аппроксимируется как белый, и эта система может получить выгоду от техник передискретизации и усреднения.

AN118 histogram signal with white noise fig5

Рис. 5. Гистограмма, построенная для выборок ADC: постоянное входное напряжение с белым шумом.

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

Если шум имеет корреляцию (соответствует какой-то неслучайной функции), или функция передачи ADC нелинейна (например, из-за шума по напряжению питания, плохой INL и т. п.), то гистограмма не будет иметь колоколообразную форму Гауссовой функции PDF (будет выглядеть примерно так, как показано на рис. 6). В таком случае передискретизация и усреднение мало помогут.

Итак, если комбинированные источники шума в результирующих кодах ADC аппроксимируются к белому шуму, то гистограмма выборок ADC будет иметь вид колоколообразной кривой Гаусса (Gaussian PDF), и передискретизация и усреднение улучшат SNR и повысят эффективное количество бит в измерении сигнала.

AN118 histogram signal with poor noise fig6

Рис. 6. Гистограмма выборок ADC в условиях, не оптимальных для техник передискретизации и усреднения.

//-----------------------------------------------------------------------------
// AN018_SW.c
//-----------------------------------------------------------------------------
// Copyright 2001 Cygnal Integrated Products, Inc.
//
// AUTH: BW
//
// Эта программа выводит температуру кристалла микроконтроллера C8051Fxxx,
// используя встроенный датчик температуры, через UART, настроенный на 115.2 kbps.
// Программа предполагает, что между выводами XTAL1 и XTAL2 подключен кварц
// на 18.432 МГц.
//
// ADC сконфигурирован так, что может оцифровывать выходной сигнал от
// встроенного в кристалл микроконтроллера датчика температуры. Частота
// выборок ADC определяется константой SAMPLE_RATE, в которой задано
// значение в Гц. Максимальное значение для SAMPLE_RATE ограничено
// примерно 86 кГц из-за выбранной частоты кристалла 18.432 МГц
// (SAR clock = SYSCLK / 16 = 1.152 МГц. Одно преобразование ADC
// занимает 16 тактов SAR, что в результате дает частоту оцифровки 72 кГц).
//
// Обработчик прерывания окончания преобразования АЦП (ADC End of Conversion
// Interrupt Handler) считывает выборки из ADC и добавляет его к аккумулятору.
// Каждые 256 выборок ADC обновляется и сохраняется результат в глобальной
// переменной result. Техника оцифровки осуществляет сложение набора значений,
// и прореживание их (выдавая результат на каждой 256-й выборке). Это довольно
// просто реализовать, и отнимает немного ресурсов у процессора.
//
// Для каждой степени 4 Вы получите 1 добавочный бит к эффективному разрешению.
// При передискретизации с кратностью 256 получается 4 бита дополнительного
// повышения разрешающей способности (44 = 256). Для правильного масштабирования
// результата до 16 бит выполняется сдвиг накопленной суммы вправо на 4 бита.
//
// Target: C8051F00x или C8051F01x
// Tool chain: KEIL C51 6.03 / KEIL C51 EVAL version
//
//-----------------------------------------------------------------------------
// Подключаемые файлы
//-----------------------------------------------------------------------------
#include < stdio.h >
#include < c8051f000.h >
 
//-----------------------------------------------------------------------------
// Декларации SFR
//-----------------------------------------------------------------------------
// 16-битные декларации SFR для C8051F00x, C8051F01x.
//-----------------------------------------------------------------------------
sfr16 DP = 0x82;           // указатель на данные
sfr16 TMR3RL = 0x92;       // значение перезагрузки для Timer3
sfr16 TMR3 = 0x94;         // счетчик Timer3
sfr16 ADC0 = 0xbe;         // данные ADC0
sfr16 ADC0GT = 0xc4;       // ADC0 больше, чем окно
sfr16 ADC0LT = 0xc6;       // ADC0 меньше, чем окно
sfr16 RCAP2 = 0xca;        // захват/перезагрузка Timer2
sfr16 T2 = 0xcc;           // Timer2
sfr16 DAC0 = 0xd2;         // данные DAC0
sfr16 DAC1 = 0xd5;         // данные DAC1
 
//-----------------------------------------------------------------------------
// Глобальные константы
//-----------------------------------------------------------------------------
#define SYSCLK 18432000    // Частота SYSCLK в Гц
#define BAUDRATE 115200    // Скорость UART в bps
#define SAMPLE_RATE 100000 // Частота выборки в Hz
#define LED P1.6           // LED=1 означает включение светодиода
 
//-----------------------------------------------------------------------------
// Прототипы функций
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART_Init (void);
void ADC_Init (void);
void TIMER3_Init (int counts);
void ADC_ISR (void);
 
//-----------------------------------------------------------------------------
// Глобальные переменные
//-----------------------------------------------------------------------------
long result;   // Выходной результат от передискретизации и усреднения
               // 256 последовательных выборок от ADC для получения
               // 16-битного разрешения измерений
               
//-----------------------------------------------------------------------------
// Функция MAIN
//-----------------------------------------------------------------------------
void main (void)
{
   long temp_copy;
   int temp_int;     // целая часть температуры
   int temp_frac;    // дробная часть температуры (в тысячных долях градуса)
   WDTCN = 0xde;     // запрет сторожевого таймера (watchdog)
   WDTCN = 0xad;     //
   SYSCLK_Init ();   // инициализация генератора тактов
   PORT_Init ();     // инициализация crossbar и GPIO
   UART_Init ();     // инициализация UART
   TIMER3_Init (SYSCLK/SAMPLE_RATE); // инициализация Timer3 для переполнения
                                     // с частотой опроса ADC
   ADC_Init ();      // инициализация ADC
   ADCEN = 1;        // разрешение ADC
   result = 0L;      // инициализация переменной температуры
   EA = 1;           // разрешить глобальные прерывания
   while (1)
   {
      temp_copy = result;  // Получение последней выборки для преобразования
                           // данных ADC в температуру.
      temp_copy -= 0xa381; // Корректировка смещения к 0 градусов, 0V
      temp_copy *= 0x01a9; // 2.86 mV / °C
      temp_copy *= 100;    // Преобразование к сотым долям °C
      temp_copy = temp_copy >> 16;  // деление на 216
      temp_int = temp_copy / 100;   // Разделение целой и дробной частей
      temp_frac = temp_copy - (100 * temp_int);
      printf ("Temperature is %d.%d\n", (int)temp_int, (int)temp_frac);
   }
}
 
//-----------------------------------------------------------------------------
// Подпрограммы для инициализации
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
// Инициализирует системную тактовую частоту для использования кварца
// 18.432 МГц в качестве источника тактов.
void SYSCLK_Init (void)
{
   int i;            // счетчик задержки
   OSCXCN = 0x67;    // запуск генератора от внешнего кварца 18.432 МГц
   for (i=0; i < 256; i++);   // интервал XTLVLD blanking (>1 мс)
   while (!(OSCXCN & 0x80));  // ожидание установки режима генератора
   OSCICN = 0x88;             // выбор генератора от внешнего кварца в качестве
                              // источника частоты для SYSCLK и разрешение
                              // детектирования пропадания тактов
}
 
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
// Конфигурирует Crossbar и порты GPIO
void PORT_Init (void)
{
   XBR0 = 0x07;      // Разрешить I2C, SPI и UART
   XBR1 = 0x00;
   XBR2 = 0x40;      // Разрешить crossbar и слаботочные верхние нагрузочные
                     // резисторы (weak pull-up)
   PRT0CF |= 0xff;   // Разрешить все выходы на P0 как двухтактные (push-pull);
                     // позволить xbar конфигурировать выводы как входы, если
                     // это необходимо
   PRT1CF |= 0x40;   // Разрешить P1.6 (светодиод, LED) как push-pull выход
}
 
//-----------------------------------------------------------------------------
// UART_Init
//-----------------------------------------------------------------------------
// Конфигурирует UART с использованием Timer1 для генератора скорости,
// данные будут передаваться в формате 8-N-1.
void UART_Init (void)
{
   SCON = 0x50;      // SCON: mode 1, 8-bit UART, разрешить прием (RX)
   TMOD = 0x20;      // TMOD: timer 1, mode 2, 8-битная перезагрузка
   TH1 = -(SYSCLK/BAUDRATE/16);  // установка значения перезагрузки Timer1,
                                 // для нужной скорости UART
   TR1 = 1;          // запуск Timer1
   CKCON |= 0x10;    // Timer1 использует sysclk как источник тактов
   PCON |= 0x80;     // SMOD = 1
   TI = 1;           // индикация готовности передачи (TX ready)
}
 
//-----------------------------------------------------------------------------
// ADC_Init
//-----------------------------------------------------------------------------
// Конфигурирует АЦП для использования событий переполнения Timer3 для запуска
// преобразования и генерации прерывания по завершению преобразования,
// и использования выходных данных АЦП с результатом, выровненным вправо.
// Разрешает прерывание по завершению преобразования АЦП. Оставляет АЦП
// в запрещенном состоянии.
void ADC_Init (void)
{
   ADC0CN = 0x04; // ADC запрещен; normal tracking mode;
                  // преобразования ADC инициируются
                  // переполнением Timer3; данные ADC
                  // выровнены вправо
   REF0CN = 0x07; // разрешить встроенный сенсор температуры,
                  // встроенный источник опорного напряжения VREF
                  // и выходной буфер VREF
   AMX0SL = 0x0f; // выбрать сенсор температуры как выходное значение
                  // мультиплексора входов ADC
   ADC0CF = 0x61; // для ADC частота тактов преобразования = sysclk/8
   EIE2 |= 0x02;  // разрешить прерывания ADC
}
 
//-----------------------------------------------------------------------------
// TIMER3_Init
//-----------------------------------------------------------------------------
// Конфигуриует Timer3 для автоперезагрузки интервалом, указанным в параметре
// counts (без генерации прерывания), и для тактирования от SYSCLK.
void TIMER3_Init (int counts)
{
   TMR3CN = 0x02;    // остановка Timer3; очистка TF3;
                     // использование SYSCLK в качестве опорной частоты
   TMR3RL = -counts; // инициализация значения для перезагрузок
   TMR3 = 0xffff;    // установить немедленную перезагрузку
   EIE2 &= ~0x01;    // запрет прерываний Timer3
   TMR3CN |= 0x04;   // запуск Timer3
}
 
//-----------------------------------------------------------------------------
// Обработчики прерываний (ISR)
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// ADC_ISR
//-----------------------------------------------------------------------------
// Обработчик прерывания окончания преобразования АЦП (ADC end-of-conversion ISR).
// Здесь считывается выборка ADC, и она добавляется к текущему значению аккумулятора,
// и делается декремент локального счетчика децимации int_dec. Когда int_dec
// достигает нуля, мы вычисляем новое значение глобальной переменной result,
// где сохраняется накопленный результат измерений ADC.
void ADC_isr (void) interrupt 15
{
   static unsigned int_dec=256;  // Счетчик интегрирования/децимации.
                                 // Он будет сохранен, когда int_dec = 0.
   static long accumulator=0L;   // Здесь будут интегрироваться выборки ADC.
   ADCINT = 0;                   // Очистка флага завершения конверсии ADC
   accumulator += ADC0;          // Чтение значения ADC и добавление его
                                 // к аккумулятору.
   if (int_dec == 0)
   {
      // Если 0, то делаем децимацию (прореживание)
      int_dec = 256;             // сброс счетчика
      result = accumulator >> 4; // сдвиг вправо для операции деления
      accumulator = 0L;          // сброс аккумулятора
   }
}

[Словарик]

ADC Analog-to-Digital Converter, аналого-цифровой преобразователь, АЦП.

dB децибел, логарифмическая единица измерения уровня сигнала.

ENOB effective number of bits, количество эффективных (достоверных) бит результата измерения.

INL Integral NonLinearity, интегральная нелинейность.

ISR Inrerrupt Service Routine (обработчик прерывания).

LSB Least Significant Bit, самый младший значащий бит.

PDF Probability Distribution Function, функция распределения вероятностей.

PGA Programmable Gain Amplifier, усилитель с программируемым коэффициентом усиления.

RMS среднеквадратическое значение.

SFR Special Function Register, регистр специального назначения микроконтроллера.

SNR Signal-Noise Ratio, соотношение сигнал/шум.

Vref reference voltage, опорное напряжение АЦП.

[Ссылки]

1. AN118 Improving ADC Resolution by Oversampling and Averaging (an118.pdf) site:silabs.com.
2. A. Oppenheim and R. Schafer, Discrete-Time Signal Processing, New Jersey: Prentice Hall, 1999 ed.
3. J. Lis, Noise Histogram Analysis, Cirrus Logic Application Note AN37.
4. J.C. Candy and G.C. Temes, Oversampling Methods for A/D and D/A Conversion, IEEE Transactions on Circuits and Systems, June 1987 (Beginning discussion on the effects of oversampling on in-band noise).
5. Чоппинг в сигма-дельта АЦП.