В двух предыдущих частях были описаны внешний вид, комплект поставки, электрические характеристики, программное обеспечение управления, структурная схема и особенности режимов работы генераторов 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 для быстрого создания систем сбора и обработки данных с измерительного оборудования в научной лаборатории. Для работы нам понадобятся:
# в качестве бэк энда используем библиотеку 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? следующий:
Micran,PLG06,1129170012,D.4.5 |
Возвращаемая прибором первая часть первой строки этой структуры выглядит как
USB0::VID::PID::SN::0::INSTR,
|
– 0x0040 — PLG06 Composite (накопитель включен);
– 0x0041 — PLG06 TMC Device (накопитель выключен);
– 0x0042 — PLG12 Composite (накопитель включен);
– 0x0043 — PLG12 TMC Device (накопитель выключен);
– 0x0044 — PLG20 Composite (накопитель включен);
– 0x0045 — PLG20 TMC Device (накопитель выключен);
Рассмотрим несколько наиболее часто встречающихся способов использования генераторов:
Таблица. Настройки синхронизации
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 и т. д. в соответствии с приведенными листингами.
Подготовка прибора к сканированию сводится к следующим действиям:
Для остановки сканирования предназначена команда *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’) |
Для модулирования несущей применяется внутренний низкочастотный генератор сигналов стандартных форм либо используется внешний сигнал, который заводится на модулятор через разъем 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’) |
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 обладают средним уровнем технических характеристик, но вместе с гибким и широким функционалом могут составить конкуренцию типичным настольным приборам общего применения.
2. www.micran.ru/productions/IIS/kia/usb/plg/
Элемент не найден