ru en
16.12.2020

Автор: Андрей В. Горевой, к.т.н., ведущий инженер ДИИС, АО «НПФ «Микран» andrew.gorevoy@micran.ru



В линейке измерительных продуктов СВЧ производства АО «НПФ «Микран» существует класс портативных приборов Portable Lab Devices. К особенностям таких приборов относятся компактность, питание и управление от шины USB и умеренные или высокие функциональные возможности и электрические характеристики. Пока весь класс представлен измерителями мощности PLS (Portable Lab Sensor) до 6/26,5/50 ГГц и генераторами сигналов СВЧ PLG (Portable Lab Generator) до 6/12/20 ГГц. В статье мы опишем возможности и особенности генераторов сигналов.

В двух предыдущих частях были описаны внешний вид, комплект поставки, электрические характеристики, программное обеспечение управления, структурная схема и особенности режимов работы генераторов PLG06/12/20. В третьей части рассмотрим принципы программирования генераторов, описание системы команд SCPI (Standard Commands for Programming Instruments) и приведем примеры программирования основных режимов работы.


Подключение

Генераторы серии PLG созданы в соответствии с концепцией виртуального измерительного прибора. Использование архитектуры VISA (Virtual Instrument Software Architecture) позволяет управлять устройства-ми независимо от среды передачи данных или имеющегося интерфейса связи. Управление осуществляется с помощью системы команд SCPI, описание которой приводится в сопро-водительной документации к устройству. Также поставляются примеры работы с генератором, выполненные на языке C++. 


При подключении к ПК PLG определяется как составное устройство, включающее дваUSB-устройства — Mass Storage Class (встроенный накопитель данных) и Test and Measurement Class (собственно генератор). Такой под-ход упрощает процесс подготовки устройства к работе, поскольку управляющее ПО и драй-вер USBTMC поставляются непосредственно в приборе и не требуют лишних действий вро-де скачивания со страницы изготовителя. 


Для примера воспользуемся языком программирования Python, который широко применяется не только как основной язык программирования, но и для создания расширений и интеграции приложений. Для работы с измерительными устройствами из Python существует модуль PyVISA — это«обертка» для библиотеки VISA, предоставляющая все удобства и гибкость высокоуровневого языка программирования Python для быстрого создания систем сбора и обработки данных с измерительного оборудования в научной лаборатории. Для работы нам понадобятся:

  • прибор;
  • драйвер для прибора;
  • интерпретатор Python;
  • библиотека VISA (back end);
  • библиотека PyVISA (front end);
  • описание системы команд прибора.

Интерпретатор Python и библиотеку PyVISA можно скачать на сайте [1], а все остальное предусмотрено в комплекте поставки генератора. Для работы с устройством необходимо подключить его к ПК, открыть любую
IDE для взаимодействия с Python и написать следующие команды. Описание всех поддерживаемых команд доступно на сайте АО «НПФ «Микран» [2].

# подключение библиотеки PyVISAimport visa
# в качестве бэк энда используем библиотеку VISA из пути пере-
менных окружения
rm = visa.ResourceManager()
# поиск устройств
print(rm.list resources(‘?*’))
# подключение к устройству
plg = rm.get instrument(‘USB0::11120::64::1129170012::0::INSTR’)
# запрос имени устройства
print(plg.query(“*idn?”))
# установка частоты
plg.write(“frequency 1e9”)
# установка мощности
plg.write(“power 0”)
# включение СВЧ-выхода
plg.write(“output on”)


Ответ прибора на команду *IDN? следующий:

(‘PXI0::MEMACC’, ‘USB0::11120::64::1129180012::0::INSTR’)
Micran,PLG06,1129170012,D.4.5


Возвращаемая прибором первая часть первой строки этой структуры выглядит как


USB0::VID::PID::SN::0::INSTR,


где:

  • VID (Vendor ID) = 0x2B70 или 11120d — уникальный идентификатор, принадлежащий НПФ «Микран»;
  • PID (Product ID) — идентификаторы продуктов, назначаемые производителем по своему усмотрению:

         – 0x0040 — PLG06 Composite (накопитель включен);

         – 0x0041 — PLG06 TMC Device (накопитель выключен);

         – 0x0042 — PLG12 Composite (накопитель включен);

         – 0x0043 — PLG12 TMC Device (накопитель выключен);

         – 0x0044 — PLG20 Composite (накопитель включен);

         – 0x0045 — PLG20 TMC Device (накопитель выключен);

  • SN — серийный номер устройства.

Основные режимы работы генератора

Рассмотрим несколько наиболее часто встречающихся способов использования генераторов:

  • генерирование непрерывного гармонического сигнала с заданной частой и мощностью (его программирование было описано выше);

Таблица. Настройки синхронизации

TRIG:SOUR

INIT:CONT LIST:MODE
IMM
EXT
BUS
ON
MAN

Многократное сканирование начинается по команде

INITiate:IMMediate.

Автоматически перезапускается по достижении последней точки диапазона.

Бесконечное поточечное сканирование.

Один триггер — одна точка.

После последней точки генератор по триггеру переходит на первую, и сканирование начинается сначала.

Бесконечное поточечное сканирование. 

Одна команда *TRG — одна точка. 

После последней точки генератор по команде *TRG переходит на первую, и сканирование начинается сначала.

AUTO
Бесконечное сканирование по диапазону. Один триггер — один цикл сканирования.
Бесконечное сканирование по диапазону. Одна команда *TRG — один цикл сканирования.
OFF
MAN

Однократное сканирование заданного диапазона начинается сразу после команды INITiate:IMMediate.

После завершения сканирования генератор остается на последней точке диапазона в ожидании следующей команды запуска.

Однократное поточечное сканирование.

Один триггер — одна точка.

В конце генератор остается на последней точке, пока триггер не будет взведен.

Однократное поточечное сканирование.

Одна команда *TRG — одна точка. В конце генератор остается на последней точке, пока триггер не будет взведен.
AUTO Однократное сканирование по диапазону. Один триггер — один цикл сканирования.

В конце генератор остается на последней точке, пока триггер не будет взведен командой INITiate:IMMediate.

Однократное сканирование по диапазону. Одна команда *TRG — один цикл сканирования. В конце генератор остается на последней точке, пока триггер не будет взведен командой INITiate:IMMediate.


  • сканирование по частоте с фиксированной мощностью: 

freq start = 100e6 freq stop = 4100e6

points = 41

# настройка режима сканирования генератора

plg.write(‘freq:mode sweep’)

plg.write(‘pow:mode fix’)

# установка границ диапазона сканирования и количества точек

plg.write(‘freq:start ‘ + str(freq start))

plg.write(‘freq:stop ‘ + str(freq stop))

plg.write(‘sweep:points ‘ + str(points))

# настройка триггера/синхронизации

plg.write(‘init:cont off’)

plg.write(‘trig:sour bus’)

plg.write(‘list:mode manual’)



  • сканирование по мощности на фиксированной частоте:


pow start = –10

pow stop = 10

points = 41

# настройка режима сканирования генератора

plg.write(‘freq:mode fix’)

plg.write(‘pow:mode sweep’)

# установка границ диапазона сканирования и количества точек

plg.write(‘pow:start ‘ + str(pow start))

plg.write(‘pow:stop ‘ + str(pow stop))

plg.write(‘sweep:points ‘ + str(points))

# настройка триггера — без автозапуска, источник — шина, по-

точечное переключение

plg.write(‘init:cont off’)

plg.write(‘trig:sour bus’)

plg.write(‘list:mode manual’)


  • сканирование по списку произвольных частот и мощностей:


# передача параметров списка

plg.write(‘list:freq 25000000Hz,50000000Hz,75000000Hz,10000000

0Hz’)

plg.write(‘list:pow 0,0,-2,10’)

plg.write(‘list:dwell 0.1,0.1,0.2,0.03’)

plg.write(‘freq:mode list’)

# настройка режима запуска

plg.write(‘init:cont off’)

plg.write(‘trig:sour imm’)

plg.write(‘list:mode manual’)

# запуск сканирования

plg.write(‘init:imm’)



Если при настройке режима сканирования по списку список составляет больше 32 точек, следует воспользоваться командами для отправки дополнительных параметров LIST:FREQuency:ADD, LIST:POWer:ADD,LIST:DWELl:ADD. То есть после триады команд LIST:FREQuency, LIST:POWer, LIST:DWELl с первыми 32 элементами списка должна идти триада LIST:FREQuency:ADD,LIST:POWer:ADD, LIST:DWELl:ADD максимум с 32 следующими элементами, за ней еще одна триада LIST:FREQuency:ADD, LIST:POWer:ADD, LIST:DWELl:ADD и т. д., пока не будет загружен весь список. Далее следуют команды FREQ:MODE LIST и т. д. в соответствии с приведенными листингами.

Подготовка прибора к сканированию сводится к следующим действиям:

  • выбор режима сканирования (по списку точек, диапазону частот или диапазону мощностей);
  • задание границ диапазона сканирования — загрузка в устройство списка параметров или граничных значений и количества точек;
  • выбор режима синхронизации (таблица);
  • перевод генератора в режим ожидания триггера или запуск сканирования командой INITiate:IMMediate. Источник синхронизации можно выбрать из трех вариантов, командой TRIGger:SOURce BUS|IMM|EXT:
  • BUS, синхронизация по шине USB, выполняется командой *TRG.
  • IMMediate, в этом режиме отсутствует ожидание синхросигнала, прибор сразу начинает сканирование.
  • EXTernal, система запуска ждет изменения напряжения на входе TRIG IN, ожидание положительного или отрицательного фронта задается командой TRIG:SLOPe POS|NEG.

Для остановки сканирования предназначена команда *ABORt, однако при включенной настройке INITiate:CONTinuous ON сканирование инициализируется заново, если значение параметра TRIGger:SOURce равно IMM.

В предыдущей части было сказано, что в режиме сканирования по внешнему синхросигналу возможны задержки, обусловленные работой встроенного накопителя. Для его отключения предусмотрена команда MEMory:MSC ON|OFF. При этом меняется адрес прибора, так как происходит переинициализация USB-устройства с другим Product ID. Данный процесс может занимать до нескольких секунд, если выполняется первый раз на вашем ПК.

В зависимости от настроек генератор может воспринимать как сигнал запуска импульсы положительной полярности, так и отрицательной. Реакция на событие триггера задается командой LIST:MODe AUTO|MANual. Либо генератор при появлении события триггера перестраивается на одну точку в списке, либо проходит весь заданный диапазон точек. События триггера в автоматическом режиме, произошедшие после запуска сканирования, игнорируются.

Для синхронизации прибора с другими устройствами в составе некой измерительной системы предназначены сигналы READY и TRIG IN, а также управление по USB. Например, для несложных задач вроде измерения КП аттенюатора можно использовать связку из генератора PLG и USB-измерителя мощности PLS, синхронизация которых будет выполняться на уровне управляющей программы. Синхронизировать нужно начало измерения мощности и время установки частотной точки. Для синхронизации по выполнению команд в протоколе SCPI существует запрос *OPC?, прибор отвечает на него символом 1 после завершения всех операций, заданных предыдущими командами. В случае, когда между управляющим ПК и устройством отсутствует обмен командами, контроль захвата можно проводить по уровню напряжения на разъеме READY либо по состоянию индикаторного светодиода.


Низкочастотный генератор

В составе генератора PLG имеется низкочастотный генератор стандартных форм сигналов на отдельной микросхеме, комбинирующей ядро прямого цифрового синтезатора с разрядностью 24 бит, память на 4096 отчетов, генератор ПСП и генератор постоянного напряжения. Ядро прямого цифрового синтезатора обеспечивает генерацию синуса до 1 МГц с шагом 1,49 Гц. Генерирование ПСП реализуется встроенными аппаратными средствами микросхемы НЧГ. Форма спектра напряжения — вида sin(x)/x с минимумом на частоте 25 МГц. Генерация прямоугольного, треугольного сигналов выполняется в виде паттернов, загружаемых в память микросхемы, а затем «проигрываемых» микросхемой ЦАП. Недостатком этого подхода является ограничение по шагу перестройки частоты такого модулирующего сигнала, потому генератор рассчитывает наиболее близкие параметры к заданным, после чего пользователь может прочесть реальную частоту сигнала, подаваемого на выход НЧГ. Ниже приведен пример программирования гармонического сигнала частотой 10 кГц и амплитудой 1,5 В: 


# настройка низкочастотного генератора

plg.write(‘lfo:func:freq 10000’)

plg.query(‘lfo:func:freq?’)

plg.write(‘lfo:ampl 1.5’)

# включаем генерацию НЧ-сигнала

plg.write(‘lfo:state on’) 


Графики АЧХ.png


Аналоговые модуляции

Для модулирования несущей применяется внутренний низкочастотный генератор сигналов стандартных форм либо используется внешний сигнал, который заводится на модулятор через разъем MOD IN/LFG OUT. С точки зрения управления все три аналоговых модуляции практически одинаковы — в зависимости от типа модуляции задается форма и параметры модулирующего сигнала, а также глубина модуляции или девиация фазы или частоты. Для генерации внутреннего модулирующего воздействия используется встроенный низкочастотный генератор. При изменении частоты в общем случае требуется также пересчитать параметры низкочастотного генератора, что обеспечивается при калибровке модуляции. Однако при использовании внешнего модулирующего сигнала невозможно заранее определить его необходимый уровень, поэтому применение внешней модуляции требует предварительной калибровки уровня модулирующего воздействия.

Система команд практически одинакова для разных видов модуляции, поэтому рассмотрим настройку генератора на примере только амплитудной модуляции глубиной 50% от внутреннего источника синусоидальным частотой 10 кГц.


# Настройка параметров амплитудной модуляции

plg.write(‘am:sour int’)

plg.write(‘am:int:func:shap sin’)

plg.write(‘am:int:func:freq 10000’)

plg.write(‘am:int:func:freq?’)

plg.write(‘am:depth 50’)

# включаем модуляцию

plg.write(‘am:state on’)


Импульсная модуляция

Импульсная модуляция реализуется с помощью ключей. В качестве источника сигнала для внутренней импульсной модуляции используется 16‑разрядный таймер, минимальная длительность импульса 0,1 мкс, максимальная — 3276,7 мкс. Источник внешней импульсной модуляции заводится снаружи через вход TRIG IN/PULM. Пример настройки импульсной модуляции с периодом следования импульсов 10 мкс и коэффициентом заполнения 0,01:  


# выбор источника опорного сигнала

plg.write(‘pulm:sour int’)

# настройка числовых параметров модулирующего сигнала

plg.write(‘pulm:int:per 10U’)

plg.write(‘pulm:int:pwid 0.1U’)

# запуск модуляции

plg.write(‘pulm:state on’)


Построение измерительных стендов

Для примера соберем измерительный стенд на базе генератора PLG и измерителя мощности PLS фирмы «Микран». Имея данную комбинацию устройств, можно измерить АЧХ всех переходов, аттенюаторов и кабельных сборок на рабочем месте при наличии базовых навыков программирования и описания системы команд (рисунок). Измерения проводим по следующей схеме: сначала калибруем генератор в новой измерительной плоскости, то есть со всеми необходимыми переходами для подключения тестируемого устройства, полученную таблицу значений сохраняем в csv-файл. Затем делаем то же самое, но с подключенным измеряемым устройством, таблицу сохраним в другой файл, а потом вычтем из первой характеристики вторую и получим АЧХ устройства. Далее показана функция на языке Python, которая создает список мощностей на всех частотных точках, определенных в диапазоне между freq start и freq stop при количестве точек points:

freq_start = 100e6

freq_stop = 4100e6

points = 41

step = (freq_stop — freq_start) / (points–1)

freq_list = [freq_start + step*i for i in range(points)]

def sweep_freq_band(plg, sens):

return_list = []

# настройка генератора в режим сканирования

plg.write(‘freq 1e9’)

plg.write(‘power 0’)

plg.write(‘output on’)

plg.write(‘freq:mode sweep’)

plg.write(‘pow:mode fix’)

# установка границ диапазона сканирования и количества точек

plg.write(‘freq:start ‘ + str(freq_start))

plg.write(‘freq:stop ‘ + str(freq_stop))

plg.write(‘sweep:points ‘ + str(points))

# настройка триггера/синхронизации

plg.write(‘init:cont off’)

plg.write(‘trig:sour bus’)

plg.write(‘list:mode manual’)

# переводим генератор в режим ожидания триггера

plg.write(‘init:imm’)

# цикл измерения мощности

for i in range(points):

plg.write(‘*trg’)

# Программная синхронизация,

# ответ придет только после выполнения команды “*TRG”

plg.query(‘*opc?’)

# Установка частоты сенсора

sens.write(‘freq ‘ + str(freq_list[i]))

meas_value = float(sens.query(‘fetch?’))

print(meas_value)

# Добавление измеренной точки к списку возвращаемых

значений

return_list.append(meas_value)

return return_list



Заключение

В статье рассмотрены принципы программирования генератора PLG на языке Python. Использование распространенной системы команд SCPI позволяет с минимальными накладными расходами поменять генератор на любой другой, поддерживающий ту же систему команд.

Простые режимы программируются тремя-четырьмя строчками кода.

Основные трудности в работе с генератором могут возникнуть при программировании режимов сканирования. Из-за гибкого функционала режимы имеют несколько настроек в виде трех команд с несколькими параметрами. Особенности передачи данных накладывают некоторые ограничения на работу со списками сканирования. Это описано в тексте и необходимо учитывать при формировании списков с количеством точек больше 32.

Невысокие вычислительные мощности могут внести искажения в работу сканирования с внешним синхросигналом, что также описано в тексте и даны рекомендации, позволяющие этого избежать.

 В целом, как видно из всех трех частей, генераторы серии PLG обладают средним уровнем технических характеристик, но вместе с гибким и широким функционалом могут составить конкуренцию типичным настольным приборам общего применения.


Литература

1. www.python.org/downloads/

2. www.micran.ru/productions/IIS/kia/usb/plg/