librecal_autocal.py робить повне SOLT-калібрування LibreVNA
електронним калібрувальним набором LibreCAL без ручного
перемикання стандартів. Результати кожного запуску зберігаються в librecal_out/ і комітяться в
цей репозиторій, щоб мати повну історію калібрувань.
LibreVNA-GUI не вміє керувати LibreCAL через SCPI, тому скрипт працює з обома приладами окремо:
- Підключається до LibreVNA-GUI (SCPI по TCP, порт 19542) і до LibreCAL (SCPI по USB-serial,
знаходить його за VID:PID
1209:4122). - Чекає, поки термостат LibreCAL вийде на робочу температуру (
:TEMP:STABLE?). - Вичитує з LibreCAL виміряні характеристики стандартів (набір коефіцієнтів, за замовчуванням
FACTORY) і зберігає їх у Touchstone (.s1p/.s2p). Стандарти LibreCAL неідеальні, тому калібрувати з ідеальною моделлю не можна. - Зберігає бекап поточного cal kit у GUI і збирає новий кіт із цих Touchstone-файлів.
- Перемикає LibreCAL у OPEN → SHORT → LOAD (усі порти одночасно) → THROUGH для кожної пари портів і на кожному стані запускає калібрувальний вимір у GUI.
- Активує SOLT і зберігає
.cal. - Перевірка: з новим калібруванням ще раз вимірює кожен стан LibreCAL і порівнює з його коефіцієнтами.
- LibreVNA-GUI (перевірено на 1.6.5): запущений, VNA підключений, у налаштуваннях увімкнено SCPI-сервер.
- Python 3 з
pyserial. - Серійний порт LibreCAL має бути вільним: не підключайтеся до нього в LibreCAL-GUI або в діалозі eCal у LibreVNA-GUI, поки працює скрипт.
- Скрипт і LibreVNA-GUI мають працювати на одній машині: GUI сам зберігає
.cal/.calkitі читає Touchstone-файли за шляхами, які передає скрипт.
Спочатку налаштуйте в GUI розгортку (діапазон, кількість точок, IFBW, потужність), потім:
./librecal_autocal.pyКалібрування діє тільки для тих налаштувань розгортки, з якими його зроблено. Після зміни
налаштувань запустіть скрипт знову. Діапазон розгортки має вкладатися в діапазон коефіцієнтів
LibreCAL (у FACTORY це 9 kHz – 8.5 GHz), скрипт це перевіряє.
| Опція | За замовчуванням | Опис |
|---|---|---|
--map |
1:1,2:2 |
відповідність портів VNA:LibreCAL, напр. 1:3,2:4 |
--set |
FACTORY |
набір коефіцієнтів LibreCAL (:COEFF:LIST?) |
--out |
librecal_out/ поруч зі скриптом |
тека для результатів |
--host, --scpi-port |
localhost, 19542 |
адреса SCPI-сервера LibreVNA-GUI |
--serial |
автовизначення | серійний пристрій LibreCAL, напр. /dev/ttyACM0 |
--temp-timeout |
900 |
скільки секунд чекати стабілізації температури |
--no-verify |
— | пропустити перевірку |
Після запуску закомітьте результати:
git add librecal_out && git commit -m "Calibration $(date +%F)" && git pushУсі файли одного запуску мають однакову мітку часу YYYYMMDD_HHMMSS:
librecal_out/
├── latest.cal # копія останнього калібрування (для git diff)
├── librecal_<stamp>.cal # калібрування
├── librecal_<serial>_<set>_<stamp>.calkit # cal kit, зібраний з даних LibreCAL
├── calkit_backup_<stamp>.calkit # кіт, який був у GUI до запуску
└── coeffs_<serial>_<set>_<stamp>/ # коефіцієнти LibreCAL у Touchstone
├── P1_OPEN.s1p P1_SHORT.s1p P1_LOAD.s1p
├── P2_OPEN.s1p P2_SHORT.s1p P2_LOAD.s1p
└── P12_THROUGH.s2p
Файли з мітками часу ніколи не перезаписуються. latest.cal перезаписується при кожному запуску,
тому git бачить його як той самий файл, що змінився. Так можна подивитися, як змінилося
калібрування між запусками:
git log --oneline -- librecal_out/latest.cal
git diff HEAD~1 -- librecal_out/latest.calЗавантажити збережене калібрування в GUI можна через меню Calibration → Load або SCPI-запитом
VNA:CAL:LOAD? /абсолютний/шлях/до/файлу.cal.
Наприкінці скрипт виводить найбільшу векторну похибку |S_виміряне − S_коефіцієнт| по всій
розгортці для кожного стану LibreCAL, а для THROUGH також приблизну похибку в dB. Приклад
першого калібрування (1 MHz – 6 GHz, 501 точка, IFBW 1 kHz, −10 dBm):
OPEN S11: 0.0137 OPEN S22: 0.0132
SHORT S11: 0.0066 SHORT S22: 0.0068
LOAD S11: 0.0035 LOAD S22: 0.0019
THRU S21: 0.0046 (≈ ±0.040 dB)
THRU S12: 0.0037 (≈ ±0.032 dB)
Це перевірка тими самими стандартами, якими калібрували. Вона показує, що калібрування застосоване й узгоджене, але не замінює незалежної перевірки окремим атенюатором або навантаженням.
- У SCPI-команді
VNA:CAL:KIT:STA:<n>:FILEє помилки з індексами портів. Для.s1p/.s2pвони не заважають, тому скрипт генерує саме такі файли і завжди передає номери портів явно. - Помилки команд скрипт визначає через
*ESR?. Запит із помилкою GUI просто лишає без відповіді, тому скрипт вважає тайм-аут помилкою.