Измерение линейности АЦП с помощью гистограммы

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

Модель

Основанное на гистограммах измерение линейности может быть разбито на пять секций:

  1. Стимул

  2. Тестируемое устройство (DUT)

  3. Предварительная обработка

  4. Расчет гистограммы

  5. Измерение линейности

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

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

s = warning('off', 'Simulink:blocks:DivideByZero');
model = 'histogramLinearityExample';
open_system(model);
set_param([model '/Flash ADC'], 'EnableImp', 'off');

Частота пилообразного стимула автоматически адаптируется к различным комбинациям времени выполнения симуляции и количества бит конвертера.

$$F_{sawtooth} = \max\left\{\frac{|V_{max} - V_{min}|}{T_{stop}},
\frac{F_{sample}}{2^{\left(2 N_{bits}\right)}}\right\}$$

$V_{max}$ и$V_{min}$ заданы в область значений,$T_{stop}$ заданы в параметре модели StopTime,$F_{sample}$ заданы Fs и$N_{bits}$ заданы Nbits. служит$F_{sample} / 2^{2 N_{bits}}$, чтобы предотвратить частоту 0 в случае не конечного времени симуляции. В противном случае период пилообразного материала занимает все время симуляции.

Буферизование

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

$$N = \frac{F_{sample}}{F_{sawtooth}}$$

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

model3 = 'histogramInitialCondition';
load_system(model3);
%open_system([model '/Histogram']);
out=sim(model3);
plot(out.ADCHistogram,'-rd');
grid on;
title('Histogram');
ylabel('Amplitude');

Получившаяся гистограмма повреждена массивным всплеском при 0 из-за распространения начального условия.

Блок MATLAB Function в разделе Histogram сохраняет гистограмму отключенной, пока следующий буфер, первый, заполненный данными моделирования, не придет к гистограмме. Поэтому это препятствует зависимости конечной гистограммы от начальных условий.

open_system(model);
set_param([model '/Flash ADC'], 'EnableImp', 'off');
out=sim(model);
plot(out.ADCHistogram,'-rd');
grid on;
title('Histogram');
ylabel('Amplitude');

Вход параметров

Наклонный или пилообразный вход обеспечивает линейное развертывание всех значений в динамической области значений АЦП.

Однако из-за расположения порога в АЦП идеальная передаточная кривая АЦП не центрируется в своей динамической области значений; идеальная передаточная кривая сдвинута влево на 0,5 LSB. Поэтому первый порог находится на уровне 0,5 LSB, а последний порог на 1,5 LSB ниже максимальной динамической области значений. Компенсируйте этот эффект добавлением смещения -0,5 LSB к стимулу.

Более серьезные проблемы возникают с конвертерами, которые имеют большие ошибки смещения и/или усиления. В частности, если ошибка смещения ниже -1 LSB или полная ошибка шкалы (сумма ошибки смещения и усиления) превышает 1 LSB, некоторые коды в нижней или верхней части передаточной кривой (соответственно) будут измеряться как отсутствующие, независимо от их фактической функциональности. Зная об этом, статистические методы измерения линейности должны применяться только после исправления ошибок смещения и усиления.

set_param([model '/Flash ADC'], 'EnableImp', 'on');
set_param([model '/Flash ADC'], 'OffsetError', '3');
set_param([model '/Flash ADC'], 'GainError', '2');
%open_system([model '/Histogram']);
out=sim(model);
plot(out.ADCHistogram,'-rd');
grid on;
title('Histogram');
ylabel('Amplitude');

Чтобы измерить полную кривую переноса АЦП с большими смещениями и/или полными масштабными ошибками в Simulink ®, используйте блок ADC DC Measurement или ADC Testbench. Строение стимула для покрытия всей кривой переноса АЦП не повлияет на результаты этих блоков так, как это будет влиять на гистограмму.

model2 = 'flashWithTestbench';
open_system(model2);
set_param([model2 '/Flash ADC'], 'EnableImp', 'off');
set_param([model2 '/Flash ADC'], 'OffsetError', '3');
set_param([model2 '/Flash ADC'], 'GainError', '2');
sim(model2);
msblks.ADC.adcDcMeasurementPlot([model2 '/ADC DC Measurement']);

Измерение линейности

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

set_param([model '/Flash ADC'], 'EnableImp', 'on');
set_param([model '/Flash ADC'], 'OffsetError', '0.25');
set_param([model '/Flash ADC'], 'GainError', '0.25');

set_param([model '/Differential Nonlinearity'],'Commented','off');
set_param([model '/Integral Nonlinearity'],'Commented','off');
set_param([model '/Histogram'],'Commented','off');

open_system([model '/Differential Nonlinearity']);
open_system([model '/Integral Nonlinearity']);
open_system([model '/Histogram']);
sim(model);

open_system([model '/Hist2DNL']);

INL впоследствии вычисляется из DNL.

open_system([model '/DNL2INL']);

INL конечной точки, вычисленный таким образом, эквивалентен INL конечной точки, вычисляемому блоком Измерения постоянного тока АЦП, хотя блок Измерения постоянного тока АЦП не сообщает полную шкалу DNL.

open_system(model2);
set_param([model2 '/Flash ADC'], 'EnableImp', 'on');
set_param([model2 '/Flash ADC'], 'OffsetError', '0.25');
set_param([model2 '/Flash ADC'], 'GainError', '0.25');
sim(model2);
msblks.ADC.adcDcMeasurementPlot([model2 '/ADC DC Measurement']);

warning(s.state, 'Simulink:blocks:DivideByZero');