Статистическое измерение линейности АЦП популярно в физических системах благодаря его помехоустойчивости и относительной простоте реализации в физической среде. В этом примере рассматриваются проблемы, присущие статистическим измерениям линейности, и некоторые возможные решения для реализации этих измерений в Simulink ®.
Измерение линейности на основе гистограммы может быть разбито на пять секций:
Стимул
Тестируемое устройство (DUT)
Предварительная обработка
Вычисление гистограммы
Измерение линейности
Проблемы, присущие статистическому методу, возникают главным образом в разделах Стимул и Предварительная обработка. Сигнал стимула должен быть однородным по входу АЦП, чтобы получить плоскую гистограмму для невосприимчивого преобразователя, в то время как предварительная обработка должна гарантировать, что только один период стимула будет привязан гистограммой одновременно.
Альтернативно, частота стимула может быть неравномерной, но гистограммой необходимо манипулировать с использованием PDF неоднородного ввода, чтобы устранить влияние неоднородности на результат.
s = warning('off', 'Simulink:blocks:DivideByZero'); model = 'histogramLinearityExample'; open_system(model); set_param([model '/Flash ADC'], 'EnableImp', 'off');

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

и
определяются в поле Диапазон (Range),
определяются в параметре модели StopTime,
определяются Fs и
определяются Nbits. служит
для предотвращения частоты 0 в случае не конечного времени моделирования. В противном случае период пиловочника занимает все время моделирования.
В этой модели выборки буферизуются отдельно от вычисления гистограммы по двум причинам. Во-первых, важно, чтобы гистограмма обновлялась на целое число, кратное периоду стимула. Это гарантирует правильную форму гистограммы. Во-вторых, число выборок за период пилообразного стимула зависит от его частоты и частоты сигнала начала преобразования, которая является частотой выборки. Следовательно, число выборок для буферизации представляет собой частоту выборок, деленную на частоту пилообразных выборок.

Буферный блок вызывает собственную проблему, обеспечивая однородность гистограммы. Начальный выход буфера передается на гистограмму в начале моделирования, фактически буфер, полный нулей, все определяется начальным условием.
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 в разделе «Гистограмма» сохраняет гистограмму отключенной до тех пор, пока на гистограмму не поступит следующий буфер, первый из которого заполнен данными моделирования. Следовательно, это предотвращает зависимость конечной гистограммы от начальных условий.
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 не повлияет на результаты этих блоков так, как это повлияет на гистограмму.
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']);

Затем из DNL вычисляется INL.
open_system([model '/DNL2INL']);

Конечная точка INL, вычисленная таким образом, эквивалентна конечной точке INL, вычисленной блоком ADC DC Measurement, хотя блок ADC DC Measurement не сообщает о полном масштабе 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');