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