switch controller: shorten the gap-minimum window to adapt to dwell changes

Окно минимума было 4096 отсчётов, и это давало опасную асимметрию: при
УМЕНЬШЕНИИ межстадийной паузы минимум падает мгновенно, а при УВЕЛИЧЕНИИ
(подняли dwell_us или задержку PLL прибора) устаревшее маленькое значение живёт
тысячи стадий. Порог оказывался ниже реальной межстадийной паузы, детектор
границы срабатывал на каждой стадии и залипал ключ в положении A на пару
развёрток.

Окно сокращено до 16 отсчётов. Длинное окно не давало точности: пауза задаётся
счётчиком в FPGA и детерминирована, а межстадийная — самая частая (три из
четырёх при четырёх стадиях), так что минимум по десятку отсчётов уже равен ей.
Зато теперь смена настроек подхватывается за считанные точки, и случайная
короткая пауза от помехи вымывается так же быстро.

IFBW на порог не влияет и влиять не может: он меняет длительность оцифровки
(фронт-спад), а меряется пауза (спад-фронт). Плюс ключ переключается по спаду,
когда оцифровка закончена, а детектор границы во время оцифровки неактивен —
boundaryPending_ сбрасывается на фронте. Разобрано в README.

Прошито и проверено: после сброса ядро в loop, Verified OK.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ayzen
2026-09-10 12:37:31 +03:00
co-authored by Claude Opus 5
parent c1f8654677
commit 2412aedc58
2 changed files with 37 additions and 3 deletions
+14 -3
View File
@@ -63,9 +63,20 @@ constexpr bool kSwitchActiveLow = false;
constexpr uint32_t kBoundaryFactorNum = 3;
constexpr uint32_t kBoundaryFactorDen = 2;
// Окно, по которому берётся минимальная пауза. Двух окон хватает, чтобы
// оценка пережила смену настроек развёртки за пару секунд.
constexpr uint32_t kGapWindowSamples = 4096;
// Окно, по которому берётся минимальная пауза. Оно намеренно КОРОТКОЕ.
//
// Межстадийная пауза — самая частая: при четырёх стадиях на точку это три паузы
// из четырёх, при двух — одна из двух. Значит минимум даже по десятку отсчётов
// уже равен ей, и длинное окно не даёт никакой точности (пауза задаётся
// счётчиком в FPGA, она детерминирована).
//
// Зато длинное окно вредит. Если пауза ВЫРОСЛА — подняли dwell_us или задержку
// PLL прибора — устаревший маленький минимум держит порог ниже реальной
// межстадийной паузы, и детектор границы начинает срабатывать на каждой стадии,
// залипая ключ в положении A. С таким окном это самоустраняется за считанные
// точки, а не за развёртку. По той же причине короткое окно быстро вымывает
// случайную короткую паузу от помехи.
constexpr uint32_t kGapWindowSamples = 16;
// Защита от шума: пауза короче этого не считается настоящей стадией.
constexpr uint32_t kMinPlausibleGapMicroseconds = 2;