Этот пример показывает, как получить тактовые сигналы и анализировать переходы, импульсы и вычислительные метрики, включая время нарастания, время спада, скорость нарастания, перерегулирование, недорегулирование, ширину импульса и коэффициент заполнения. Этот пример использует Data Acquisition Toolbox в сочетании с Signal Processing Toolbox.
Чтобы настроить сбор, используйте Data Acquisition Toolbox. Используйте функции статистики и измерения в Signal Processing Toolbox, чтобы проанализировать сигнал данных.
Использование daq
создание DataAcquisition и addinput
добавить канал из NI-9205 National Instruments ® с идентификатором 'cDAQ1Mod1'.
dq = daq("ni"); addinput(dq,"cDAQ1Mod1","ai0","Voltage");
По умолчанию DataAcquisition настроен на выполнение с частотой 1000 сканирований в секунду.
Измените скорость скана на 250000 сканирований в секунду.
dq.Rate = 250000;
Использование read
для получения нескольких сканов в течение 2 мс.
[data, time] = read(dq, milliseconds(2), "OutputFormat", "Matrix");
Постройте график полученного тактового сигнала (обратите внимание, что он перегружен).
plot(time, data) xlabel('Time (s)') ylabel('Voltage (V)')
Использование statelevels
без выходного аргумента для визуализации уровней состояний в гистограмме.
statelevels(data)
ans = 0.0138 5.1848
Вычисленная гистограмма разделена на две области равных размеров между первым и последним интервалом. Режим каждой области гистограммы возвращается как расчетное значение уровня состояния в командном окне.
Используйте необязательные входные параметры, чтобы задать количество интервалов гистограммы, границы гистограммы и метод оценки уровня состояния.
Использование risetime
без выходного аргумента, чтобы визуализировать время нарастания положительных ребер.
risetime(data,time)
ans = 1.0e-04 * 0.5919 0.8344 0.7185 0.8970 0.6366
Уровни ссылки по умолчанию для вычисления времени нарастания и времени спада заданы на уровне 10% и 90% от амплитуды формы волны.
Измерьте время спада путем определения пользовательских ссылок и уровней состояний.
falltime(data,time,'PercentReferenceLevels',[20 80],'StateLevels',[0 5])
ans = 1.0e-04 * 0.4294 0.5727 0.5032 0.4762
Получите измерения программно путем вызова функций с одним или несколькими выходными аргументами. Для равномерно выбранных данных можно задать частоту дискретизации вместо временного вектора. Использование slewrate
для измерения наклона каждого положительного или отрицательного ребра.
sr = slewrate(data(1:100), dq.Rate)
sr = 7.0840e+04
Получите новый заниженный синхросигнал.
[data, time] = read(dq, milliseconds(4), "OutputFormat", "Matrix"); plot(time, data) xlabel('Time (s)') ylabel('Voltage (V)')
Заниженные тактовые сигналы показывают перерегулирование. Перерегулирование выражается в процентах от различия между уровнями состояния. Перерегулирование может произойти сразу после ребра, в начале области аберрации после перехода. Это называется «постшут» перерегулированием. Измерьте перерегулирование с помощью overshoot
.
overshoot(data(95:270),dq.Rate) legend('Location','NorthEast')
ans = 4.9451 2.5399
Перерегулирование может также происходить непосредственно перед ребром, в конце области аберрации перед переходом. Это называется «preshoot» перерегулирование.
Занижение может происходить в областях до аберрации и после аберрации и выражается в процентах от различия между уровнями состояния. Измерьте подрегулирование необязательными входными параметрами, задающими область для измерения аберраций.
undershoot(data(95:270),dq.Rate,'Region','Postshoot') legend('Location','NorthEast')
ans = 3.8499 4.9451
Использование pulsewidth
без выходного аргумента для визуализации подсвеченных ширин импульса.
pulsewidth(data, time, 'Polarity', 'Positive');
Это отображает импульсы положительной полярности. Выберите отрицательную полярность, чтобы увидеть ширины отрицательных полярных импульсов.
Использование dutycycle
вычислить отношение ширины импульса к периоду импульса для каждого импульса положительной полярности или отрицательной полярности. Коэффициенты заполнения выражаются в процентах от периода импульса.
d = dutycycle(data,time,'Polarity','negative')
d = 0.4979 0.5000 0.5000
Использование pulseperiod
получить периоды каждого цикла формы волны. Используйте эту информацию для вычисления других метрик, таких как средняя частота формы волны или общее наблюдаемое дрожание.
pp = pulseperiod(data, time); avgFreq = 1./mean(pp) totalJitter = std(pp)
avgFreq = 1.2500e+03 totalJitter = 1.9866e-06