Статистическое измерение Линейности ADC популярно в физических системах из-за ее шумового допуска и относительной простоты реализации в физической среде. Этот пример покрывает проблемы, свойственные к статистическим измерениям линейности и некоторым возможным решениям для реализации этих измерений в Simulink®.
Основанное на гистограмме измерение линейности может быть повреждено в пять разделов:
Стимул
Устройство под тестом (DUT)
Предварительная обработка
Расчет гистограммы
Измерение линейности
Проблемы, свойственные к статистическому методу, происходят, в основном, в Стимуле и Предварительно обрабатывающих разделах. Сигнал стимула должен быть универсальным по входу ADC, чтобы дать плоскую гистограмму для неослабленного конвертера, в то время как предварительная обработка должна гарантировать, что точно один период стимула сгруппирован гистограммой за один раз.
В качестве альтернативы частота стимула может быть неоднородной, но гистограммой нужно управлять с помощью PDF неоднородного входа, чтобы удалить влияние неоднородности на результате.
s = warning('off', 'Simulink:blocks:DivideByZero'); model = 'histogramLinearityExample'; open_system(model); set_param([model '/Flash ADC'], 'EnableImp', 'off');
Пилообразная частота стимула автоматически адаптируется к различным комбинациям времени выполнения симуляции и количеству конвертера битов.
и заданы в Области значений, задан в параметре модели StopTime, задан Фс и задан подачами 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 в разделе Histogram сохраняет гистограмму отключенной, пока следующий буфер, первый, заполненный данными моделирования, не прибывает в гистограмму. Поэтому это препятствует тому, чтобы итоговая гистограмма зависела от начальных условий.
open_system(model); set_param([model '/Flash ADC'], 'EnableImp', 'off'); out=sim(model); plot(out.ADCHistogram,'-rd'); grid on; title('Histogram'); ylabel('Amplitude');
Пандус или пилообразный вход обеспечивают линейную развертку всех значений по динамическому диапазону ADC.
Однако из-за порогового размещения в ADCs, кривая передачи идеального ADC не сосредоточена в ее динамическом диапазоне; идеальную кривую передачи оставляют переключенной 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');
Чтобы измерить полную кривую передачи ADC с большим смещением и/или ошибками полного масштаба в Simulink®, используйте блок ADC DC Measurement или Испытательный стенд ADC. Настройка стимула, чтобы покрыть целую кривую передачи 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']);
INL впоследствии вычисляется из DNL.
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');