Embedded HandbookПриложения
Все разделы › V. Отладка и качество
STM32F103 · уровень средний · 27 мин чтения
Открыть в интерактивном справочнике

36н. Осциллограф и генератор в работе: практикум на DHO900 и DG900 Pro

Разделы 36г–36м разобрали приборы по отдельности: осциллограф — ручка за ручкой, генератор — изнутри. Здесь они работают вместе, на столе рядом с платой. Двенадцать задач, у каждой одинаковый порядок: зачем, что с чем соединить, что выставить на генераторе, что на осциллографе, что должно получиться в числах и на чём обычно ошибаются. Числа «что должно получиться» посчитаны заранее моделью, поэтому расхождение на столе — повод искать ошибку в схеме или в прошивке, а не в приборе.

Приборы — те, что у автора: осциллограф RIGOL DHO900 и двухканальный генератор RIGOL DG902 Pro из серии DG900 Pro. Названия пунктов меню даны по-английски, как на экранах. Генератор серии DG900 Pro — это генератор DDS с памятью точек (как он устроен — 36к): выходы CH1 и CH2 на передней панели, на задней — по разъёму [AUX IN/OUT] на каждый канал (выход синхронизации Sync, вход внешнего запуска или модуляции), вход и выход опорной частоты 10 МГц, USB и LAN. Свой частотомер с отдельным входом Counter на передней панели тоже есть.

Опоры. Генератор: DG900 Pro User Guide (Books/Manual_RIGOL_DG900_Pro.pdf, дальше — «руководство DG»), DG900 Pro Quick Guide (Books/DG900 Pro Series Quick Guide.pdf, «краткое DG») и русское краткое руководство (Books/rigol_dg900_pro_manual1.pdf, «русское DG»); даташита и руководства по программированию DG900 Pro у нас нет. Осциллограф: DHO900 Datasheet (Books/dho900-datasheet.pdf, «даташит»), DHO900 User Guide (Books/DHO900_UserGuide_EN.pdf, «руководство DHO»), DHO800/DHO900 Programming Guide (Books/DHO800900_ProgrammingGuide_EN.pdf, «программирование»). Все страницы — по PDF-файлам. Числа задач — прогон _verify/prac36n/ в контейнере stm-lab:1: model36n.py (Python 3.11, numpy 1.24), фронт через кабель — ngspice-39 (ring36n.cir), листинг 36н.13 — против подставных приборов (stub36n.py).

Как это называется в документации

Оригинал Перевод
Imped: HighZ, Load на какую нагрузку генератор пересчитывает число на экране
Ampl/HighL, Offset/LowL размах и смещение или верхний и нижний уровни
Sweep: Linear, Log, Step; Mark качание частоты; метка — частота, на которой Sync падает
Burst: NCycle, Gated; Cycles, Idle Level пачка из N периодов или по воротам; число периодов, уровень между пачками
Sync, Trig Out, [AUX IN/OUT] выход синхронизации, выход запуска, разъём на задней панели
Align Phase, Coupling, Track выровнять фазы каналов, связать параметры, повторять канал
Mod: AM, FM, SUM; Depth, Freq Dev модуляция; глубина, девиация частоты; SUM — сложение с другим сигналом
Delay(r-r), Phase(r-r) задержка и фаза между фронтами двух каналов (DHO900)
feed-through termination проходная нагрузка 50 Ом на разъём осциллографа

36н.1 Стенд: что общего у всех задач

Выход генератора — не источник питания. Его 50 Ом — это сопротивление, которое стоит внутри последовательно с выходом (руководство DG с. 23, 97), а не защита. Выход не замыкают, на него не подают чужое напряжение и не питают от него схему: для питания — лабораторный источник (36а.8). Защищён ли выход от замыкания и от напряжения снаружи, в документах не сказано — считайте, что нет.

Сколько он может выдать. При нагрузке HighZ — до 20 Vpp на частотах до 50 МГц, постоянное напряжение (Arb → DC) — от −10 до +10 В (руководство DG с. 38, 52; русское DG с. 18). То есть ЭДС до ±10 В: втрое выше питания вывода STM32. Поэтому вход платы в задачах ниже защищён резистором по 62.3: минимум (10 − 4,0) В / 5 мА = 1,2 кОм, ставим 1,5 кОм — с 50 Ом генератора ток через встроенный диод не больше 3,87 мА. Вывод, толерантный к 5 В, так не защищается — см. 62.3.

Включился — проверь, что на выходе. У DG900 Pro по умолчанию Load Last = Last: после включения он восстанавливает то, что стояло при выключении (руководство DG с. 108). Вчерашние 20 Vpp сегодня окажутся на плате вместе с первым нажатием кнопки выхода. Правило стола: сначала выход генератора — на осциллограф без платы, потом на плату.

Земли. Генератор питается от адаптера USB PD 15 В, 3 А, а на задней панели у него есть отдельная клемма заземления корпуса (руководство DG с. 25; краткое DG с. 12, 14). Соединён ли экран выходных BNC с защитной землёй через адаптер, в документах не сказано. У DHO900 земля щупов — это земля розетки (36а.5, 36з.1). Перед работой прозвоните экран BNC генератора и землю осциллографа; если связи нет, соедините их проводом у платы, а не через плату.

Кабели. BNC–BNC 50 Ом — от генератора; щуп 1:10 — к выводам платы (36а.2). У DHO900 входа 50 Ом нет — только 1 МОм ±1 % и 15 пФ ±3 пФ (даташит с. 10; 36г.6), поэтому, где нужна согласованная нагрузка, на вход ставят проходную нагрузку 50 Ом. И запуск: внешнего входа запуска у DHO900 нет, источник — CH1–CH4 или D0–D15 (даташит с. 13; 36д.6), так что сигнал Sync генератора занимает один канал.

Порядок задачи. Цель → подключение → генератор → осциллограф → что должно получиться → типичная ошибка. Меню генератора: форма сигнала — Wave Type, режим — Output Mode (Cont, Mod, Sweep, Burst), параметры канала (Sync, Imped, Invert) — вкладка Channel (руководство DG с. 26, 93–97).


36н.2 Задача 1: почему на экране вдвое больше

Цель. Понять, что число на экране генератора — пересчёт, а не измерение, и выставить нагрузку так, чтобы оно совпадало с тем, что видит осциллограф. Физика — в 36к.3, здесь — меню и высокая частота.

Подключение. CH1 генератора кабелем BNC прямо на CH1 осциллографа; второй опыт — с проходной нагрузкой 50 Ом на входе осциллографа.

Генератор. Sine, Freq 1 kHz, Ampl 1 Vpp, Offset 0. Вкладка Channel → Imped: сначала Load (50 Ом), потом HighZ. Внутри выхода всегда 50 Ом последовательно, а настройка Imped меняет только пересчёт: при переходе с 50 Ом на HighZ число 5 Vpp на экране становится 10 Vpp, а сигнал на разъёме остаётся прежним (руководство DG с. 97). Load можно задать числом от 1 Ом до 10 кОм — тогда экран покажет напряжение на такой нагрузке: при ЭДС 1 В и Load 1 kΩ — 0,9524 В. dBm доступны только с Load: при HighZ мощность не определена (руководство DG с. 39–40).

Осциллограф. CH1, DC, 200 mV/div; Measure → Vpp; запуск Edge по CH1.

Что должно получиться (модель — делитель 50 Ом и нагрузка с 15 пФ; при выходе ровно 50 Ом длина кабеля на размах не влияет):

частота Load 50 Ом, «1 Vpp», вход 1 МОм то же, с нагрузкой 50 Ом
1 кГц 1,9999 В 1,0000 В
10 МГц 1,9977 В 0,9997 В
70 МГц 1,8992 В 0,9867 В

На 70 МГц — верхней частоте синуса DG902 Pro (руководство DG с. 38) — 15 пФ входа осциллографа уже 151,6 Ом, и «удвоение» неполное. К этому добавляется спад полосы самого осциллографа (36а.3). С HighZ на генераторе и входом 1 МОм экран генератора и осциллограф совпадают. Заводская настройка DG900 Pro — HighZ (руководство DG с. 116), а не 50 Ом, как у многих генераторов: со своего прибора на плату с высокоомным входом удвоения не будет.

Типичная ошибка. Поставить проходную нагрузку 50 Ом, а на генераторе оставить HighZ: осциллограф покажет вдвое меньше выставленного. Правило: Imped на генераторе равен тому, что реально стоит на конце кабеля.


36н.3 Задача 2: АЧХ RC-цепи качанием частоты

Цель. Снять АЧХ фильтра без диаграммы Боде: генератор качает частоту, осциллограф рисует огибающую выхода, метка генератора показывает, где какая частота. Диаграмма Боде DHO900 есть только у DHO914S и DHO924S (36к.6, 36е.24); этот способ работает на любом.

Подключение. RC: 4,7 кОм последовательно, 10 нФ на землю — срез 3386,3 Гц. Выход генератора CH1 — на вход цепи и на CH1 осциллографа (тройник BNC), выход цепи — щупом 1:10 на CH2. Задний [CH1 AUX IN/OUT] генератора — на CH3 осциллографа: это Sync.

Генератор. Sine, Ampl 1 Vpp, Imped HighZ. Output Mode → Sweep: Sweep Type Log, Start 100 Hz, Stop 100 kHz, Sweep Time 10 s, Source Internal. Вкладка Channel: Sync On, Mark On, Mark Freq 3386.3 Hz. В качании Sync поднимается в начале развёртки и падает на частоте метки (руководство DG с. 74, 94–95). Логарифмическое качание — равные доли времени на каждую декаду; закон F = P^T дан в руководстве DG (с. 70).

Осциллограф. 1 s/div — 10 с на экран. Roll (Horizontal → Roll) — OFF: тогда при 200 ms/div и медленнее прибор пишет медленную развёртку с запуском (руководство DHO с. 74), а в Roll запуска нет вовсе. Запуск — Edge, CH3, подъём, Normal. Режим сбора — Peak: на 1 s/div точка памяти далеко реже периода сигнала, и без пикового детектора огибающая развалится в алиасинг (36г.15, 36г.16). Курсоры Manual (36е.2): один — на спаде CH3, второй — на уровне 0,707 от начального размаха CH2.

Что должно получиться. Декада занимает 3,333 с. Спад Sync — через 5,099 с после начала развёртки, и в этот момент размах CH2 — 0,707 от начального (−3,01 дБ). На 100 Гц потеря −0,004 дБ, на 100 кГц — −29,41 дБ, то есть 3,38 % размаха. Постоянная времени цепи — 47 мкс: на декаду в 3,3 с фильтр успевает с запасом (как это ломается при быстром качании — 36к.7).

Типичная ошибка. Sweep Type Linear: вся полоса до среза, от 100 до 3386 Гц, проходит за 3,29 % времени — неполную треть деления на экране. Для АЧХ — только Log. Вторая ошибка — смотреть в Normal: при медленной развёртке огибающая рвётся и «звенит» ложными биениями.


36н.4 Задача 3: проверка АЦП синусом

Цель. Подать на вывод АЦП известный синус и сверить, что прошивка видит: размах в кодах, середину, частоту. И увидеть своими глазами наложение частот, когда частота сигнала выше половины частоты выборки.

Подключение. Генератор CH1 → резистор 1,5 кОм (36н.1) → PA0 (вход АЦП) платы F103; щуп CH1 осциллографа — на PA0. Прошивка запускает АЦП таймером 10 000 раз в секунду (14.5, 14.6) и на каждое преобразование переключает вывод-метку (36а.7) — его на CH2.

Генератор. Sine, Freq 1 kHz, Imped HighZ, Ampl 3 Vpp, Offset 1.65 V — или, что то же, HighL 3.15 V и LowL 0.15 V (High Level = Offset + Ampl/2, руководство DG с. 39). Сигнал от 0,15 до 3,15 В: внутри 0…3,3 В с запасом с обеих сторон.

Осциллограф. CH1, DC, 500 mV/div, смещение так, чтобы 0 В был на нижней линии сетки; CH2 — 2 V/div; запуск Edge по CH1; Measure → Vmax, Vmin, Frequency.

Что должно получиться. Коды 12-битного АЦП при 3,3 В опоры: минимум 186, максимум 3909, середина около 2048. Частота в спектре записанных отсчётов — по модели (1000 отсчётов, 10 кГц выборки):

частота генератора частота в отсчётах
1000 Гц 1000 Гц
9000 Гц 1000 Гц
11000 Гц 1000 Гц
5100 Гц 4900 Гц
10010 Гц 11 Гц

9 и 11 кГц прошивка не отличит от 1 кГц: это алиасинг (36г.15), только теперь в своём АЦП. На экране же видно, что на самом деле: CH1 — 9 кГц, а метки CH2 ложатся на синус в такт медленной волне. На 10010 Гц коды меняются раз в десятые доли секунды — «синус с частотой 10 Гц», которого нет. Лечится не прошивкой, а фильтром перед АЦП (50а.4).

Типичная ошибка. Offset 0: при 3 Vpp отрицательная полуволна уходит до −1,5 В, ток идёт через нижний диод вывода и портит отсчёты других каналов АЦП (62.2). Вторая — Imped Load при высокоомном выводе: всё вдвое, до 6 В (36к.3).


36н.5 Задача 4: задержка реакции прошивки и редкий хвост

Цель. Измерить, через сколько после фронта на входе EXTI прошивка отвечает фронтом на выходе, и поймать редкие длинные задержки. Как мерить Delay и статистику — 36е.12 и 36е.14; здесь — почему частоту генератора нельзя ставить круглой.

Подключение. Генератор CH1 → 1,5 кОм → PA1 (EXTI1) и CH1 осциллографа; вывод, который обработчик EXTI переключает первой строкой, — на CH2. Как настроить EXTI — 7.5, 7.6.

Генератор. Pulse, Freq 1013 Hz, Width 10 us, HighL 3.3 V, LowL 0 V, Imped HighZ; фронты Leading/Trailing — 3 ns по умолчанию (руководство DG с. 46).

Осциллограф. CH1 и CH2 по 2 V/div; запуск Edge, CH1, подъём, Normal; 200 ns/div, точка запуска у левого края. Measure → Delay(r-r) между CH1 и CH2 со статистикой (руководство DHO с. 153); Display → Persistence Time → Infinite (руководство DHO с. 247; 36г.18).

Что должно получиться. Основное облако — обычная задержка входа в прерывание (36е.12) и узкая полоса дрожания. Хвост — когда фронт пришёл во время другого прерывания. Модель: SysTick раз в 1 мс занимает процессор на 2 мкс (условно), прерывание EXTI ждёт его окончания. Доля таких фронтов — 0,2 %. Теперь — частота генератора:

частота генератора что видно за 10 с
1013 Гц в среднем 20,4 задетых фронта (расчёт 20,3), не меньше 20
1000 Гц, кварцы расходятся на 20 ppm (условно) в 79,2 % попыток — ни одного

При «круглых» 1000 Гц фронт стоит почти в одной фазе с SysTick и сдвигается по нему на 20 нс за период: окно 2 мкс он проходит пачкой из 100 фронтов подряд раз в 50 с. Десять секунд наблюдения в четырёх случаях из пяти не покажут хвост вовсе. Некратная частота (1013 Гц) пробегает все фазы за доли секунды.

Типичная ошибка. Частота генератора, кратная частоте задач прошивки (1 кГц и SysTick 1 мс, 100 Гц и цикл 10 мс): «худший случай» прячется. Вторая — Persistence Time Min: редкий хвост мелькнёт на одном кадре из пятисот.


36н.6 Задача 5: захват таймера — частота и заполнение

Цель. Генератор задаёт частоту и заполнение, прошивка меряет их захватом таймера (13.6), осциллограф подтверждает. Проверяется и сама прошивка, и понимание того, где кончается точность каждого.

Подключение. Генератор CH1 → 1,5 кОм → PA6 (TIM3_CH1) платы F103 и CH1 осциллографа.

Генератор. Pulse, Freq 1234.5 Hz, Duty 25 %, HighL 3.3 V, LowL 0 V, Imped HighZ. У Pulse ширина и заполнение связаны: меняется одно — меняется другое; ширина — от 9 нс, шаг заполнения 0,01 % (руководство DG с. 46).

Осциллограф. CH1, 1 V/div, 200 us/div; Measure → Frequency, +Duty со статистикой; или частотомер Counter (36е.16).

Что должно получиться. Период — 810,04 тика по 1 мкс (PSC = 71): прошивка читает 810 в 95,5 % периодов и 811 в 4,5 % — то есть 1234,57 или 1233,05 Гц. Ширина 202,51 мкс читается как 202 или 203 — заполнение 24,94 или 25,06 %. На такте 72 МГц (PSC = 0) период — 58323,21 тика, точнее в 72 раза. Развёртка DHO900 — ±25 ppm (даташит с. 11), на 1234,5 Гц это ±0,031 Гц: осциллограф здесь — эталон. Точность частоты самого DG900 Pro в наших документах не названа — без даташита верить шкале генератора нельзя.

Типичная ошибка. Переполнение счётчика: 16 бит при тике 1 мкс захватывают период только выше 15,26 Гц, при тике 1/72 МГц — выше 1098,6 Гц; 1 кГц на PSC = 0 даёт мусор. И кварц платы: если он ушёл на +30 ppm (условно), на PSC = 0 это 1,75 тика на период — прошивка «ошибётся» ровно на столько, и виноват не генератор.


36н.7 Задача 6: пачка импульсов и счёт в прошивке

Цель. Генератор выдаёт ровно N периодов, прошивка их считает, осциллограф запускается по Sync и показывает пачку целиком. Так ловят потерянные и лишние фронты (36к.7).

Подключение. Генератор CH1 → 1,5 кОм → вход счёта платы и CH1 осциллографа. [CH1 AUX IN/OUT] на задней панели генератора → CH3 осциллографа.

Генератор. Square, Freq 100 kHz, HighL 3.3 V, LowL 0 V, Imped HighZ. Output Mode → Burst: NCycle, Cycles 1000, Source Internal, Burst Period 100 ms, Idle Level — Bottom. Вкладка Channel → Sync On. Sync в пачке поднимается в начале и падает после N периодов (руководство DG с. 95). Число периодов — от 1 до 1 M; если период пачки мал для N, генератор сам его увеличит (руководство DG с. 77, 79).

Осциллограф. CH1 2 V/div, CH3 2 V/div; запуск Edge, CH3, подъём, Normal; 2 ms/div — 20 мс на экран, Memory Depth 1M — 50 Мвыб/с, 500 выборок на период. Measure → Rising Edge Count на CH1 и +Width на CH3 (даташит с. 16).

Что должно получиться. +Width Sync — 10 мс, заполнение Sync — 10 %; Rising Edge Count — 1000. Наименьший период пачки по формуле руководства (⌈N·T / 6,4 нс⌉ · 6,4 нс + 4 мкс) — 10,004 мс. Прошивка: счёт по прерыванию EXTI против счёта таймером от внешнего входа. Модель: обработчик с входом и выходом — 1,5 мкс (условно), один запрос может ждать:

частота в пачке насчитало прерывание
100 кГц 1000
500 кГц 1000
1 МГц 668
2 МГц 335

Выше частоты, которую успевает обработчик, лишние фронты теряются молча. Таймер, тактируемый входом (13.3), считает их аппаратно.

Типичная ошибка. Включить внешний запуск пачки или Trig Out и ждать Sync: тогда разъём [AUX IN/OUT] занят, Sync нет (руководство DG с. 95–96). Вторая — искать на осциллографе вход EXT: у DHO900 его нет, Sync идёт на канал.


36н.8 Задача 7: ШИМ-ЦАП — генератор вместо датчика

Цель. Прошивка читает АЦП и выдаёт ШИМ с заполнением, пропорциональным коду; RC-фильтр делает из ШИМ напряжение. Генератор изображает медленный датчик, осциллограф показывает две вещи: что выход повторяет вход и сколько остаётся пульсаций после фильтра.

Подключение. Генератор CH1 → 1,5 кОм → PA0 (АЦП) и CH1 осциллографа. ШИМ — TIM2 с ARR = 999 на 72 МГц, частота 72 кГц (13.5); фильтр 10 кОм и 100 нФ, срез 159,15 Гц; выход фильтра — щупом на CH2, сам вывод ШИМ — на CH3 для запуска.

Генератор. Ramp, Freq 100 mHz, Symmetry 100 %, HighL 3.0 V, LowL 0.3 V, Imped HighZ (Symmetry — руководство DG с. 44). Пила на 10 с изображает датчик от 0,3 до 3,0 В.

Осциллограф. Два вида. XY (36г.13): X — CH1, Y — CH2, по 500 mV/div: должна выйти прямая под 45°. Пульсации: CH2 — AC, 5 mV/div, BW Limit 20M (руководство DHO с. 57); запуск Edge по CH3; 10 us/div.

Что должно получиться. Ступенька выхода — 3,30 мВ (1000 шагов ШИМ на 3,3 В). Отставание фильтра от пилы — 0,27 мВ: незаметно. Пульсации (размах, модель RC на меандре 3,3 В):

заполнение пульсации
10 % 4,12 мВ
50 % 11,46 мВ
90 % 4,12 мВ

Наибольшие — на середине (прикидка V·D(1 − D)·T/τ даёт те же 11,46 мВ). При 5 mV/div и 12 битах шаг кода осциллографа — 9,77 мкВ, пульсация видна во всех подробностях; при 1 V/div в DC — шаг 1,953 мВ, и 11,46 мВ — это 5,9 кода: грубая ступенчатая полоса.

Типичная ошибка. Мерить пульсации в DC на крупной шкале и длинным земляным проводом щупа: фронты ШИМ наводят на нём выбросы, которых в схеме нет (36а.2). Пружинка на землю у самой точки.


36н.9 Задача 8: звон на фронтах и согласование 50 Ом

Цель. Увидеть, что делает кабель без нагрузки и с нагрузкой 50 Ом, и понять, почему счётчик на плате иногда считает фронт дважды. Отражения по теории — 160.3, 160.4; выброс от источника с малым сопротивлением — 36к.5.

Подключение. Генератор CH1 → тройник BNC: одно плечо — щупом на CH1 осциллографа (это «ближний конец», здесь же может стоять плата), другое — кабель 2 м на CH2 осциллографа («дальний конец»). Второй опыт — с проходной нагрузкой 50 Ом на CH2.

Генератор. Pulse, Freq 1 MHz, Width 200 ns, HighL 3.3 V, LowL 0 V, Imped HighZ, Leading 3 ns.

Осциллограф. CH1 и CH2 по 1 V/div, 10 ns/div, запуск Edge по CH1, BW Limit — FULL.

Что должно получиться (ngspice: ЭДС 0 → 3,3 В, выход 50 Ом, кабель 50 Ом и 10 нс):

Два графика фронта генератора через кабель 2 м. Слева, дальний конец без нагрузки на входе осциллографа 1 МОм и 15 пФ: у генератора напряжение поднимается до полки 1,65 В и стоит на ней около 20 нс, пока волна не вернётся от открытого конца, затем доходит до 3,30 В; на дальнем конце фронт приходит через 10 нс и сразу до 3,30 В. Справа, с проходной нагрузкой 50 Ом на конце: у генератора 1,65 В с провалом до 1,49 В от отражения на 15 пФ, на дальнем конце 1,65 В — половина ЭДС

точка без нагрузки с нагрузкой 50 Ом
дальний конец, итог 3,30 В, без выброса 1,65 В
дальний конец, фронт 10…90 % 3,37 нс —
ближний конец полка 1,65 В на 20,7 нс, потом 3,30 В 1,65 В, провал до 1,49 В

Дальний конец чист: отражение от открытого конца возвращается и гаснет в 50 Ом генератора. А у генератора — ступенька: полка ровно на половине, 1,65 В, ровно столько, сколько волна идёт туда и обратно. Половина 3,3 В — как раз около порога входа КМОП: плата, подключённая у генератора через тройник, видит медленно ползущий через порог фронт, и счётчик без гистерезиса может насчитать два. С нагрузкой 50 Ом ступеньки нет, но амплитуда — половина: Imped на генераторе переводят в Load 50 Ом и выставляют HighL 3.3 V снова (36н.2).

Свой фронт 3 нс на экране DHO914/DHO924 (≤2,8 нс по даташиту, с. 9) растянется примерно до 4,10 нс, на моделях 250 МГц (≤1,4 нс) — до 3,31 нс (сложение по 36а.3).

Типичная ошибка. Нагрузку 50 Ом поставить у генератора, а не на дальнем конце: это не согласование, а делитель, отражение остаётся. И не путать полку на ближнем конце с «плохим генератором».


36н.10 Задача 9: два канала со сдвигом фазы

Цель. Проверить, как осциллограф меряет фазу и задержку, и заодно измерить его собственный перекос каналов и кабелей.

Подключение. CH1 генератора → CH1 осциллографа, CH2 → CH2; кабели одинаковой длины.

Генератор. Оба канала Sine, Freq 1 MHz, Ampl 1 Vpp, Imped HighZ; у CH2 Phase 90° (от −360 до 360°, шаг 0,01° — руководство DG с. 40). Затем нажать Align Phase: без него фазы каналов не привязаны друг к другу, и осциллограф показывает случайный сдвиг (руководство DG с. 101). Чтобы менять частоту обоих сразу — Coupling → Freq Cpl, Ratio 1; сдвиг держит Phase Cpl, Offset 90° (руководство DG с. 98–99).

Осциллограф. CH1 и CH2 по 200 mV/div, 200 ns/div, запуск Edge по CH1; Measure → Phase(r-r) и Delay(r-r), источник A — CH1, B — CH2 (руководство DHO с. 153–154).

Что должно получиться. Сдвиг 90° на 1 МГц — задержка 250 нс. Знак: у DHO900 задержка отрицательна, если фронт A позже фронта B (руководство DHO с. 153); какой знак фазы у DG900 Pro считается «опережением», руководство DG не говорит — проверьте на своём столе. Второй опыт: обоим каналам одна фаза, частота 10 МГц. Разница каналов DHO900 — типично до 2 нс (даташит с. 11), на 10 МГц это 7,2°; лишние 20 см кабеля (5 нс/м, как в 36к.5) — ещё 3,6°. Шаг фазы генератора 0,01° на 10 МГц — 2,78 пс: генератор задаёт точнее, чем осциллограф различает. Перекос убирают подстройкой задержки канала, до ±100 нс (даташит с. 11).

Типичная ошибка. Поменять частоту и не нажать Align Phase снова. Вторая — мерить на 1 кГц: 2 нс там — 0,0007°, перекос не виден, и кажется, что его нет.


36н.11 Задача 10: модуляция и её спектр на БПФ

Цель. Посмотреть на AM и FM в спектре и заодно проверить БПФ осциллографа на сигнале с известными составляющими (как читать БПФ — 36е.21, 36е.22). DG900 Pro умеет AM, FM, PM, ASK, FSK, PSK, PWM и SUM, внутренним сигналом или внешним через [AUX IN/OUT] (руководство DG с. 56).

Подключение. Генератор CH1 → CH1 осциллографа.

Генератор. Sine, Freq 100 kHz, Ampl 1 Vpp, Imped HighZ. Output Mode → Mod. AM: Source Internal, Shape Sine, AM Freq 1 kHz, Depth 100 %, потом 50 % (частота модуляции от 2 мГц до 1 МГц, глубина от 0 до 120 % — руководство DG с. 58). FM: FM Freq 1 kHz, Freq Dev сначала 1 kHz, потом 2.405 kHz (руководство DG с. 60).

Осциллограф. CH1, 200 mV/div, 2 ms/div — окно 20 мс, разрешение БПФ 50 Гц (36е.21). Math → FFT, источник CH1, окно Hanning (по умолчанию, даташит с. 17), центр 100 кГц, полоса около 10 кГц.

Что должно получиться (модель — БПФ с Hanning, дБ к несущей или к немодулированному синусу того же Ampl):

сигнал несущая 1-я боковая 2-я боковая
AM, Depth 100 % −6,02 дБ к синусу −6,02 дБн —
AM, Depth 50 % −6,02 дБ к синусу −12,04 дБн —
FM, β = 1 −2,32 дБ −7,13 дБ −18,79 дБ
FM, β = 2,405 −80,86 дБ — пропала −5,69 дБ −7,29 дБ

FM-строки — функции Бесселя: J0(1) = 0,7652, J1(1) = 0,4401; J0(2,405) ≈ 0 — несущая исчезает, J1(2,405) = 0,5191. Это классическая проверка девиации: крутите Freq Dev, пока несущая в БПФ не пропадёт, — девиация будет 2,405 × частоту модуляции. Полоса по Карсону для второго случая — 6,81 кГц.

Почему несущая AM на 6 дБ ниже. По руководству DG при глубине 0 % амплитуда — половина заданной, при 100 % — вся (с. 58): Ampl — это вершина огибающей, а несущая — её середина. Модель с таким толкованием дала −6,02 дБ к синусу того же Ampl при любой глубине.

Типичная ошибка. Окно 2 мс (200 us/div): разрешение 500 Гц, и боковые на ±1 кГц сливаются с несущей. Окно — не короче нескольких периодов модуляции.


36н.12 Задача 11: шум и усреднение

Цель. Вытащить слабый периодический сигнал из шума усреднением Average и понять, почему оно иногда «съедает» сам сигнал. У DHO900 нет режима High Res (36г.16) — остаются Average, BW Limit и цифровые фильтры (36е.19).

Подключение. CH1 генератора → CH1 осциллографа, CH2 генератора → CH2 осциллографа.

Генератор. CH1: Sine, Freq 1 kHz, Ampl 100 mVpp, Imped HighZ; Output Mode → Mod, тип SUM, Waveform Noise — к синусу добавляется шум (SUM Ratio — его доля к размаху синуса, руководство DG с. 68). CH2: Square, Freq 1 kHz, 3.3 Vpp — чистый сигнал запуска той же частоты. Сколько шума в «процентах» SUM Ratio и какая у шума полоса, руководство не говорит: подберите Ratio так, чтобы VRMS шума на осциллографе был около 20 мВ.

Осциллограф. CH1 — 20 mV/div, CH2 — 2 V/div; запуск Edge по CH2; Horizontal → Acquisition → Average, 16, потом 256 (от 2 до 65536, степени двойки — даташит с. 12); 200 us/div.

Что должно получиться (модель: синус 100 mVpp и шум 20 мВ ср. кв.):

усреднение остаток шума расчёт σ/√N
16 4,93 мВ 5,00 мВ
256 1,25 мВ 1,25 мВ

Шаг кода DHO900 на 20 mV/div — 39,1 мкВ, так что 256 усреднений упираются в шум, а не в разрядность. Нужен сигнал ещё меньше — у DG900 Pro есть аттенюатор 40 дБ на 50 Ом, 1 Вт (RA5040K, руководство DG с. 120): 1 mVpp на нагрузке 50 Ом превращаются в 10 мкВ размаха.

Типичная ошибка. Запуск по самому шумному CH1. Модель: уровень 0, взвод ниже −10 мВ (условно): шум запускает развёртку в случайных фазах, и после 256 усреднений от синуса остаётся 11,7 % амплитуды. Average требует, чтобы каждая запись начиналась в одной фазе сигнала, — поэтому запуск по чистому CH2 генератора.


36н.13 Задача 12: всё вместе из Python — АЧХ в CSV

Цель. Снять АЧХ RC-цепи из 36н.3 по точкам автоматически: генератор шагает по частоте, скрипт читает из DHO900 частоту, размахи и фазу и пишет таблицу.

Чем управляем. Команды DHO900 — настоящие, из руководства по программированию (*IDN? — с. 148, :CHANnel<n>:SCALe — с. 97, :MEASure:ITEM? — с. 217–218, :SYSTem:ERRor? — с. 290, :TIMebase:MAIN:SCALe — с. 315; как писать команды и разбирать ответы — 36ж.15). С генератором хуже: руководство DG отсылает за командами в отдельный DG800 Pro/DG900 Pro Programming Guide (с. 36, 117), а сам приводит лишь две команды для ключей опций и одну для загрузки точек (с. 35–36, 83) — ни частоты, ни выхода. Пока руководства по программированию нет, у генератора спрашиваем только *IDN? — общую команду IEEE 488.2 — и записываем ответ в шапку CSV. Частотой управляет сам генератор, режимом Step.

Подключение. Как в 36н.3: вход цепи — CH1, выход — CH2. Оба прибора — по USB или LAN; VISA-адрес генератора — Utility → I/O → VISA Address (руководство DG с. 107), осциллографа — 36ж.15.

Генератор. Sine, Ampl 1 Vpp, Imped HighZ. Sweep: Sweep Type Step, Step Num 31, Start 100 Hz, Stop 100 kHz, Sweep Time 62 s, Source Manual. Время на шаге задают Sweep Time и Step Num (руководство DG с. 71); для Log и Step полное время не больше 500 с (с. 72–73). Как именно расставлены шаги — равно по частоте или по логарифму, — руководство не говорит, поэтому скрипт не полагается на расстановку: он сам меряет частоту. Запустить скрипт, потом нажать Trigger на генераторе.

Осциллограф. Как в 36н.3, без Peak; скрипт сам подбирает развёртку (три периода на экран) и масштаб CH2 (выход — около шести делений).

# sweep_log.py — АЧХ по шагам: DG900 Pro качает сам (Sweep, Step), DHO900 меряет по SCPI, итог — CSV
import csv, math, sys, time
import pyvisa

SCOPE, GEN, OUT = sys.argv[1], sys.argv[2], sys.argv[3]   # VISA-адреса и имя файла
DT = 0.25                     # с между опросами; шаг генератора должен быть в несколько раз длиннее
STEPS = 31                    # Step Num в меню Sweep генератора

rm = pyvisa.ResourceManager()
scope, gen = rm.open_resource(SCOPE), rm.open_resource(GEN)
for d in (scope, gen):
    d.timeout = 5000
    d.read_termination = d.write_termination = "\n"


def cmd(s):
    scope.write(s)
    err = scope.query(":SYSTem:ERRor?").strip()
    if int(err.split(",")[0]) != 0:
        raise RuntimeError(s + " -> " + err)


def meas(item, *src):
    v = float(scope.query(":MEASure:ITEM? %s,%s" % (item, ",".join(src))))
    return None if abs(v) > 9e36 else v       # 9.9E37 — измерение не получилось


ids = [scope.query("*IDN?").strip(), gen.query("*IDN?").strip()]   # у генератора — только IEEE 488.2
rows, last, same = [], None, 0
with open(OUT, "w", newline="") as fh:
    w = csv.writer(fh)
    w.writerow(["# " + ids[0]])
    w.writerow(["# " + ids[1]])
    w.writerow(["f_Hz", "vin_V", "vout_V", "gain_dB", "phase_deg"])
    while len(rows) < STEPS:
        f = meas("FREQuency", "CHANnel1")
        if f is None:
            time.sleep(DT)
            continue
        if last is None or abs(f - last) > 0.01 * last:      # генератор перешёл на новый шаг
            last, same = f, 0
            cmd(":TIMebase:MAIN:SCALe %.3e" % (3 / f / 10))     # три периода на экран
            time.sleep(DT)
            continue
        same += 1
        if same == 2:                                          # второй совпавший опрос — шаг устоялся
            vin, vout = meas("VPP", "CHANnel1"), meas("VPP", "CHANnel2")
            ph = meas("RRPHase", "CHANnel1", "CHANnel2")
            cmd(":CHANnel2:SCALe %.3e" % (vout / 6))           # выход занимает около 6 делений
            vout = meas("VPP", "CHANnel2")
            row = [round(f, 1), vin, vout, round(20 * math.log10(vout / vin), 2), ph]
            rows.append(row)
            w.writerow(row)
            print("%9.1f Hz %7.2f dB %7.1f deg" % (row[0], row[3], ph))
        time.sleep(DT)

Что должно получиться. Прогон против подставных приборов (шаги — по логарифму, 2 с на шаг, виртуальное время): 31 строка за 63,75 с, ни одной ошибки в очереди. Несколько строк вывода:

частота усиление фаза
100 Гц −0,00 дБ 1,7°
3162,3 Гц −2,72 дБ 43,0°
3981,1 Гц −3,77 дБ 49,6°
100000 Гц −29,41 дБ 88,1°

Срез 3386,3 Гц лежит между двумя шагами — точнее даёт Mark в 36н.3 или больше шагов. Фаза положительная: выход позже входа, а Delay(r-r) у DHO900 положителен, когда фронт B позже A (руководство DHO с. 153).

Типичная ошибка. Шаг генератора короче, чем два опроса плюс перестройка развёртки: скрипт пропустит частоты. И масштаб CH2, оставленный на 1 В/дел: на −29 дБ размах 34 мВ — это 17 кодов, и усиление пляшет.


36н.14 Грабли

Вдвое больше или вдвое меньше. Imped генератора не совпадает с реальной нагрузкой. HighZ на входе 1 МОм — верно; с проходной нагрузкой 50 Ом — Load 50 Ом (36н.2).

На плате оказалось 20 Vpp. Load Last = Last восстановил вчерашнюю настройку. Выход — сначала на осциллограф, вход платы — через 1,5 кОм (36н.1).

АЧХ при линейном качании «сплюснута». До среза 3386,3 Гц — 3,29 % времени развёртки. Только Log (36н.3).

Прошивка видит 1 кГц, а подано 9 кГц. Алиасинг при выборке 10 кГц; фильтр до АЦП, а не в прошивке (36н.4).

Хвост задержки не ловится. Частота генератора кратна частоте задач прошивки: при расхождении кварцев 20 ppm в 79,2 % десятисекундных попыток хвоста нет. Некратная частота — 1013 Гц (36н.5).

Захват показывает мусор на 1 кГц. Переполнение 16 бит при тике 1/72 МГц: ниже 1098,6 Гц — только с предделителем (36н.6).

Прерывание считает 668 из 1000. Обработчик не успевает за 1 МГц; счёт — таймером от входа (36н.7).

Счётчик у генератора насчитал лишнее. Полка 1,65 В на ближнем конце кабеля без нагрузки — 20,7 нс у порога (36н.9).

Фаза между каналами случайная. Не нажата Align Phase (36н.10).

Несущая AM на 6 дБ ниже ожидаемой. Ampl у DG900 Pro — вершина огибающей (36н.11).

Усреднение стёрло сигнал. Запуск по шумному каналу: 11,7 % амплитуды после 256 записей; запуск по чистому CH2 (36н.12).


36н.15 Итоги

Дальше: часть VI, раздел 37 «Приложения IoT» — сетевые модули, стеки и обмен с сервером.

Открыть в интерактивном справочнике