\chapter{Popis firmware}

Pojmem firmware je v této kapitole myšlen program, který běží v mikrokontroléru, obsluhuje všechny části reflektometru, poskytuje uživatelské rozhraní a zajišťuje měření, vyhodnocování měření a komunikaci s počítačem. Firmware je napsán v jazyce C, knihovny pro ovládání periferií byly převzaty od výrobce. Všechen ostatní zdrojový kód je vlastní, vznikl v rámci této práce.

\section{Technické parametry firmware}
Použitý mikrokontrolér disponuje \SI{20}{\kilo\byte} \acrshort{RAM}. Jeden měřený vzorek zabírá 12 bitů, bez použití komprese dat je možné do \acrshort{RAM} uložit 10000~vzorků. Parametr $\frac{a b}{c}$ v rovnici \ref{equation_tshift} určuje délku měřeného souboru dat. Vzhledem k použitým hodnotám má měřený soubor dat 500000~bodů s časovým krokem přibližně \SI{19.62}{\pico\second}. Část RAM ovšem zabírá program pro svůj chod, délka měřicího okna byla nakonec zvolena 4096 bodů, což umožňuje v rámci jednoho okna změřit interval o délce přes \SI{80}{\nano\second}. Ve vakuu tento interval odpovídá délce měřeného úseku \SI{12}{\meter}. Pro koaxiální kabely odpovídá měřený úsek přibližně \SIrange{7.9}{10.2}{\meter} při uvažování typického rozsahu zkracovacího činitele \SIrange{0.66}{0.85}{}. V případě potřeby měřit delší vedení se může měřicí okno posunout a měřit další úsek vedení. Tento nedostatek tedy nebrání měřit libovolně dlouhá vedení, pouze znamená, že pro delší vedení je nezbytné provádět měření po částech.

\section{Autokalibrace a autodiagnostika zařízení}

\subsection{Detekce stability fázového závěsu}
Po zapnutí mikrokontrolér zapne všechny svoje interní periferie, načež začne komunikovat s fázovým závěsem Si5351. Nejprve je kontrolován indikátor úspěšného startu fázového závěsu, firmware čeká, dokud není fázový závěs připraven. Firmware pak nakonfiguruje všechny registry fázového závěsu, ovšem prozatím je nastaven tak, aby negeneroval žádné řídicí signály. Následně kontroluje firmware diagnostické registry fázového závěsu pro zjištění, zda je stabilní krystalový oscilátor. Fázový závěs je schopen indikovat stav, kdy vysazuje krystalový oscilátor \cite{Si5351datasheet}, například kvůli nedostatečnému zisku oscilátoru. Dále jsou kontrolovány indikátory nestability fázového závěsu, která může být způsobena například špatně navrženým napájením obvodu, které má na pracovních frekvencích \acrshort{VCO} pak příliš vysokou impedanci (interní \acrshort{VCO} pracují ve frekvenčním rozsahu \SIrange{600}{900}{\mega\hertz}). Pokud během fáze testování nenastane žádná z popsaných chyb, pokračuje program dále, jinak se zastaví a informuje uživatele o chybě.

\subsection{Autokalibrace stejnosměrné složky}
Dalším krokem autokalibrace je nastavení stejnosměrného posuvu měřeného signálu. Tento krok je nezbytný kvůli rozptylu parametrů tranzistoru BF998 použitého v oddělovacím zesilovači, testuje se při odpojeném měřeném vedení. Fázovému závěsu se nyní zapnou všechny výstupy, není však generován budicí impulz, výstup obvodu je ovládán firmwarem. Nejprve je nastavena logická úroveň 1, firmware postupně inkrementuje kódové slovo \acrshort{DAC}, dokud se nedostane měřené napětí do měřitelného rozsahu. Pokud tento test selže, je opět indikována chyba. Výstup pro budicí impulz se přepne do logické úrovně 0. Ze změřených napětí se spočítá, jak je nezbytné dále posunout měřený signál tak, aby průměr napětí v obou stavech ležel uprostřed rozsahu ADC. Podle tohoto výsledku je kódové slovo DAC inkrementováno nebo dekrementováno, dokud není dosaženo požadovaného stavu.

\subsection{Kalibrace napěťových úrovní}
V dalším kroku se provede kalibrace logických úrovní a zjištění úrovně šumu v měřeném signálu. V obou logických úrovních budicího pulzu je nejprve změřeno 4096 vzorků, ze kterých se spočítá průměr. Potom se změří dalších 4096 vzorků, které jsou použity pro spočítání rozptylu měřených hodnot. Tím se získá informace o statických napěťových úrovních pro stavy odpovídající vedení zakončenému otevřeným koncem a zkratem, tedy pro koeficienty odrazu $-1$ a $+1$, čímž je získán teoretický rozsah měřených hodnot. Rozptyl hodnot je podstatný pro odhad vhodného počtu průměrování. Vhodný počet průměrování byl uvažován jako počet průměrů, při kterých již byl šum podstatně potlačen, avšak dále by jeho úroveň klesala již pomalu.

\subsection{Odhad šumové úrovně a průměrování}
Pro průměrování je použit algoritmus, který se v minulosti objevil např. v osciloskopech značky Hewlett-Packard \cite{HP54100_article_journal}. Tento algoritmus je počítán celočíselně a pro svůj chod potřebuje množství paměti odpovídající pouze jedinému zaznamenanému průběhu. Pro algoritmus je potřeba jen soubor předchozích změřených dat $ y_{i-1}$, nový změřený vzorek $x$ a proměnná $i$ vyjadřující, kolikátý průměr je právě měřen. Při změření nového $n$-tého vzorku se odpovídající $n$-tý zprůměrovaný vzorek získá podle rovnice \ref{equation_averaging}.

\begin{equation}
\begin{gathered}
	y_i[n]=	\frac{x[n]+i \cdot y_{i-1}[n]}{i+1}
\end{gathered}
\label{equation_averaging}
\end{equation}

Tento algoritmus byl numericky simulován, nejprve v přesné podobě v plovoucí desetinné čárce a poté v celočíselné podobě. Pro simulaci byla použita náhodná data s rozptylem 1024, a tedy směrodatnou odchylkou 32. Tato hodnota je blízká reálně měřeným hodnotám v realizovaném zapojení reflektometru. Graf \ref{averaging_variance} vychází z dat simulovaných v plovoucí desetinné čárce, pro celočíselnou variantu není graf uveden, neboť rozdíl mezi nimi není rozpoznatelný. Rozdíly jsou znázorněny na následujících grafech. Výpočty byly provedeny $256\times$, výsledky byly zprůměrovány, aby byly křivky v grafech hladké. Bez průměrování jsou křivky lehce zatížené šumem.

\begin{figure}[htbp]
\includegraphics[width=\textwidth,keepaspectratio]{images/averaging_float_variance.eps}\caption{Závislost rozptylu na počtu provedených průměrů.}\label{averaging_variance}
\end{figure}	

Průběh této závislosti odpovídá funkci $\frac{1}{N}$, což je možné vizualizovat tak, že se rozptyl ve všech bodech pronásobí počtem průměrů, který danému bodu odpovídá. Na grafu \ref{averaging_float_difference_error} je vidět, že součin rozptylu s počtem průměrů je přibližně konstantní a odpovídá počátečnímu rozptylu. Diference rozptylu se pro větší počet průměrů než 16 blíží nule. Pro více než 16 průměrů, tedy polovinu směrodatné odchylky, tedy již úroveň šumu výrazně neklesá.

\begin{figure}[htbp]
\includegraphics[width=\textwidth,keepaspectratio]{images/averaging_float_difference_error.eps}\caption{Závislost diference rozptylu (červeně) a součinu rozptylu s počtem průměrů (modře) na počtu provedených průměrů pro výpočet v plovoucí desetinné řádce.}\label{averaging_float_difference_error}
\end{figure}

\begin{figure}[htbp]
\includegraphics[width=\textwidth,keepaspectratio]{images/averaging_integer_difference_error.eps}\caption{Závislost diference rozptylu (červeně) a součinu rozptylu s počtem průměrů (modře) na počtu provedených průměrů pro celočíselné výpočty.}\label{averaging_integer_difference_error}
\end{figure}

V případě celočíselných výpočtů vypadá diference rozptylu podobně, ovšem ze součinu počtu průměrů a rozptylu je vidět, že závislost rozptylu na počtu průměrů neodpovídá již přesně hyperbolické funkci. Jde o vliv numerických chyb způsobovaných zaokrouhlováním výsledků. Pro větší počet průměrů než je směrodatná odchylka měřeného signálu, již znatelně stoupají numerické chyby. Význam tohoto faktu spočívá v tom, že již nestoupá odstup užitečného signálu od šumu, protože dominantním zdrojem šumu jsou chyby zaokrouhlování.

Výsledkem těchto simulací je odhad vhodného počtu průměru. Optimální počet průměrů $N$ tedy leží v rozsahu $\langle\frac{\sigma}{2}, \sigma \rangle$, kde $\sigma$ je směrodatná odchylka měřeného signálu. Po změření rozptylu měřeného signálu je tedy možné přímo odhadnout vhodný počet průměrování.

\subsection{Autokalibrace polohy budicího pulzu}
Při zapnutí fázového závěsu je fázový rozdíl mezi budicím signálem a vzorkovacím signálem náhodný. Proto je potřeba nejprve najít polohu budicího pulzu v měřených datech. Vzhledem k tomu, že není pro nedostatek RAM možné uložit celé měření a v uložených datech hledat budicí impulz, je využito přímého hledání náběžné hrany, kdy se ukládá pouze posledních 8 vzorků. Ta probíhá tak, že v obslužném přerušení se ukládá posledních 8 měřených vzorků, ze kterých se počítá průměr diferencí přes těchto 8 vzorků kvůli zvýšení imunity vůči šumu. Výpočet této průměrné diference je možné zjednodušit podle vzorce \ref{equation_difference_sum}. 

\begin{equation}
\begin{gathered}
	\mathit{diff}_{\mathrm{AVG8}}[n]= \dfrac{1}{8} \sum_{k=0}^7 \dfrac{x[n-k]-x[n-(k+1)]}{2}= \dfrac{x[n]-x[n-8]}{16}
\end{gathered}
\label{equation_difference_sum}
\end{equation}

Pak platí, že pro průměr $n$ diferencí je potřeba spočítat jen diferenci ze dvou vzorků vzdálených o~$n$~prvků. Tato operace tedy pro každý změřený vzorek vyžaduje jedinou matematickou operaci, a tedy zabere malé množství výpočetního času, díky čemuž je možné tento výpočet umístit do obslužného přerušení. Z tohoto spočteného průměru diferencí se hledá maximum, tedy oblast s nejvyšší strmostí. Během fáze hledání náběžné hrany je mimo přerušení sledována odhadnutá poloha náběžné hrany. Pokud se tato poloha čtyřikrát v řadě ocitne v tolerančním poli $\pm256$ bodů, je tato poloha uznána jako skutečná poloha náběžné hrany. Celá tato autokalibrační fáze probíhá s odpojeným měřeným systémem i prodlužovacím vedením. 

\begin{figure}[H]
\includegraphics[width=\textwidth,keepaspectratio]{images/rising_edge_port_load.eps}\caption{Budicí pulz při připojeném standardu \quotedblbase load\textquotedblleft{} přímo k testovacímu portu. Červeně je vyznačena diference při průměrování přes 8 bodů. Maximum diference odpovídá přibližně středu náběžné hrany.}\label{rising_edge_port_load}
\end{figure}

\subsection{Kalibrace polohy roviny měření}
Následně je poloha měřicího okna nastavena 512 bodů před detekovanou hranu budicího pulzu. Reflektometr čeká na zásah uživatele, je vyžadováno připojení vedení, na jehož konec se později bude připojovat měřený systém. Na konec vedení je při tomto kalibračním kroku připojený kalibr typu \quotedblbase open\textquotedblleft. Průběh v okolí budicího pulzu je osmkrát změřen a zprůměrován. Ve změřeném průběhu jsou v oblasti odhadnuté náběžné hrany v rovině měření změřena počáteční napětí před náběžnou hranou a konečné napětí po náběžné hraně, odhad probíhá na základě maxima, ke kterému dochází na náběžné hraně v rámci překmitu. Následně proběhne hledání bodů, kde náběžná hrana prochází \SI{20}{\percent} a \SI{80}{\percent} mezi počátečním a konečným napětím. Z polohy těchto bodů je lineárně extrapolován počátek odezvy v rovině měření tak, aby při měření již nebyla měřena část sytému před rovinou měření. Budicí impulz je tedy po tomto kroku již mimo okno měření a nadále již v měření nijak nevystupuje. Ukázková odezva kalibru \quotedblbase open\textquotedblleft{} společně s vyznačenými význačnými body je na grafu \ref{rising_edge_DUT_open}.

\begin{figure}[H]
\includegraphics[width=\textwidth,keepaspectratio]{images/rising_edge_DUT_open.eps}\caption{Odezva v rovině měření při připojeném standardu \quotedblbase open\textquotedblleft , čáry vyznačují úrovně \SI{20}{\percent} (tmavě červená) a \SI{80}{\percent} (tmavě zelená) náběžné hrany a jejich polohu v čase. Délka náběžné hrany v tomto úseku je \SI{180}{\pico\second}. Při měření mezi body \SI{10}{\percent} a \SI{90}{\percent} náběžné hrany je tato délka \SI{280}{\pico\second}.}\label{rising_edge_DUT_open}
\end{figure}

\section{Postup ovládání firmware}
Po zapnutí se zobrazí obrazovka s informací o verzi firmware, datu a času jeho kompilace. Její podoba je vidět na obrázku \ref{greeting_screen}. Všechny dále uvedené obrázky byly vyexportovány z běžícího zařízení, měly by tedy přesně odpovídat zobrazovaným informacím.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio]{images/greeting_screen.png}\caption{Uvítací obrazovka s informací o verzi.}\label{greeting_screen}
\end{figure}

Prozatím není zařízení interaktivní, pouze oznamuje stav autokalibračních postupů. Následuje detekce stability fázového závěsu, tuto část ukazují obrázky \ref{init_5351} a \ref{stability_5351}. Ukazatel ve spodní části je běžící, aby uživateli signalizoval, že zařízení běží a nezastavilo se například z důvodu nějaké chyby.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/init_5351.png}\caption{Obrazovka zobrazovaná po dobu inicializace fázového závěsu.}\label{init_5351}
\end{figure}

Po inicializaci následuje indikace stability jednotlivých částí PLL podle obrázku \ref{stability_5351}. V případě, že je vše v pořádku, zobrazí se hlášení \quotedblbase PLL Startup complete\textquotedblleft{} a program pokračuje dále. V případě, že dojde k chybě, program se zde zastaví s indikací chyby \quotedblbase PLL Startup error\textquotedblleft. 
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/stability_5351.png}\caption{Obrazovka s informacemi o stabilitě jednotlivých částí PLL Si5351.}\label{stability_5351}
\end{figure}

Před autokalibrací polohy budicího pulzu, autokalibrací stejnosměrné složky a odhadu šumové úrovně je uživatel požádán, aby odpojil od reflektometru všechna připojená vedení nebo DUT. Tento požadavek je uveden na obr. \ref{offset_user_wait}. V tuto chvíli se zastaví běžící ukazatel ve spodní části obrazovky, aby signalizoval čekání.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/offset_user_wait.png}\caption{Čekání na zásah uživatele - autokalibrace stejnosměrné složky, kalibrace úrovní a měření úrovně šumu.}\label{offset_user_wait}
\end{figure}

V průběhu autokalibračních kroků je uživatel postupně informován o probíhajícím kroku, případně o jeho postupu. Takto proběhne autokalibrace stejnosměrné složky (obr. \ref{offset_wait}) a měření napěťových úrovní a úrovně šumu (obr. \ref{levels_user_wait}). Následně je uživatel informován o výsledku autokalibrace napěťových úrovní a šumu (obr. \ref{levels_complete}), ze kterých je možné odhalit některé možné závady. Pokud by například jedna z úrovní byla rovna 0 nebo 4095, případně kdyby se obě přibližně rovnaly, pak je možné usuzovat na chybu ADC nebo hardwarovou závadu. Pokud by vyšla variance měřeného signálu příliš vysoká nebo příliš nízká, mohla by tato informace indikovat chybu vzorkovače.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/offset_wait.png}\caption{Probíhající autokalibrace stejnosměrné složky.}\label{offset_wait}
\end{figure}

\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/levels_user_wait.png}\caption{Probíhající autokalibrace napěťových úrovní a měření úrovně šumu.}\label{levels_user_wait}
\end{figure}

\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/levels_complete.png}\caption{Výsledek autokalibrace napěťových úrovní a měření šumu.}\label{levels_complete}
\end{figure}

Po změření napěťových a šumových úrovní následuje hrubé hledání náběžné hrany budicího signálu, indikováno je dle obr. \ref{edge_wait}.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/edge_wait.png}\caption{Hrubé hledání náběžné hrany.}\label{edge_wait}
\end{figure}

Po hrubém nalezení polohy hrany budicího signálu je uživatel vyzván k připojení testovacího vedení a připojení standardu \quotedblbase open\textquotedblleft{} na konec vedení podle obr. \ref{edge_user_wait}.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/edge_user_wait.png}\caption{Čekání na zásah uživatele - přesné hledání náběžné hrany.}\label{edge_user_wait}
\end{figure}

Přesné hledání polohy měřicí roviny trvá delší dobu, protože dochází k opakovanému měření a průměrování. Tento proces je tedy indikován ukazatelem průběhu, ze kterého je možné odhadnout, kdy bude proces dokončen. Tento krok je uveden na obr. \ref{edge_sampling}. Po dokončení hledání je zobrazeno potvrzení o úspěšném dokončení autokalibrace podle obr. \ref{edge_found}.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/edge_sampling.png}\caption{Přesné hledání náběžné hrany.}\label{edge_sampling}
\end{figure}

\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/edge_found.png}\caption{Úspěšné nalezení přesné polohy náběžné hrany.}\label{edge_found}
\end{figure}

Nyní je již zařízení připraveno k měření. Uživatel je dle obr. \ref{measurement_user_wait} vyzván k připojení DUT a potvrzení začátku měření tlačítkem.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/measurement_user_wait.png}\caption{Čekání na zásah uživatele - připojení DUT a začátek měření.}\label{measurement_user_wait}
\end{figure}

Během prvního měření je zobrazena informace o čekání na dokončení prvního měření dle obr. \ref{measurement_avg_wait}.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/measurement_avg_wait.png}\caption{Čekání na proběhnutí prvního měření.}\label{measurement_avg_wait}
\end{figure}

V průběhu dalších měření je průběh každého měření indikován ukazatelem v levé spodní části obrazovky dle obr. \ref{measurement_running} a celkový počet změřených průběhů je uveden v pravé spodní části obrazovky. Změřený a zprůměrovaný průběh je vidět v horní části obrazovky.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/measurement_running.png}\caption{Průběh měření, 33. průměr.}\label{measurement_running}
\end{figure}

V případě, že je zařízení ovládáno z počítače, je na konci měření zobrazena výzva k vyčkání na odeslání zprůměrovaných změřených dat do počítače. Tato výzva je vyobrazena na obr. \ref{measurement_complete}.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/measurement_complete.png}\caption{Měření dokončeno.}\label{measurement_complete}
\end{figure}

V případě, že je zařízení ovládáno bez využití počítače, přiblíží se změřená data tak, aby každý změřený bod odpovídal jednomu horizontánímu bodu na displeji. Začátek tohoto procesu je zachycen na obr. \ref{zooming_start}, konec tohoto procesu pak na obr. \ref{zooming_complete}.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/zooming_start.png}\caption{Měření dokončeno, začátek přibližování změřených dat.}\label{zooming_start}
\end{figure}

\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/zooming_complete.png}\caption{Měření dokončeno, konec přibližování změřených dat.}\label{zooming_complete}
\end{figure}

Po přiblížení se změřený průběh začne plynule posouvat až k části průběhu, kde byla detekována diskontinuita na vedení podle obr. \ref{discontinuity_open_after_split}. Firmware jako diskontinuitu považuje jakoukoli část změřeného průběhu, kde diference průběhu odpovídá $\abs{\Gamma}>\SI{0.15}{}$. Zde několik sekund počká, aby si jej uživatel mohl prohlédnout. 
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/discontinuity_open_after_split.png}\caption{Přiblížená data vycentrovaná na polohu diskontinuity.}\label{discontinuity_open_after_split}
\end{figure}

Následně se zobrazí informační text, který informuje o pořadí diskontinuity, koeficient odrazu v místě diskontinuity, detekovaný typ závady a polohu závady. Poloha je indikována v časových jednotkách, protože nejsou známé parametry vedení. Poloha je vztažena vůči detekované poloze roviny měření. Tato informační obrazovka je vyobrazena na obr. \ref{discontinuity_split}.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/discontinuity_split.png}\caption{Informační obrazovka o typu diskontinuity, obecná diskontinuita.}\label{discontinuity_split}
\end{figure}

Odezva na kalibr typu \quotedblbase open\textquotedblleft{} je na obr. \ref{discontinuity_open}. Z levé strany je průběh uprostřed obrazovky, odpovídá $\Gamma=0$, v místě diskontinuity přejde až k vrchnímu okraji obrazovky, který odpovídá $\Gamma=1$. Spodní okraj obrazovky odpovídá $\Gamma=-1$.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/discontinuity_open.png}\caption{Přiblížená odezva na kalibr typu \quotedblbase open\textquotedblleft .}\label{discontinuity_open}
\end{figure}

Průběhu na obr. \ref{discontinuity_open_report} odpovídá informační obrazovka z obr. \ref{discontinuity_open_report}. Koeficient $\Gamma$ je přibližně roven 1, odpovídá tedy odrazu na kalibru \quotedblbase open\textquotedblleft .
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/discontinuity_open_report.png}\caption{Informační obrazovka o typu diskontinuity, kalibr typu \quotedblbase open\textquotedblleft .}\label{discontinuity_open_report}
\end{figure}

Poté, co jsou uživateli popsány všechny diskontinuity (firmware detekuje pouze 8 největších diskontinuit), zobrazí se informace o tom, že všechny diskontinuit již byly zobrazeny. Tato informace je vidět na obr. \ref{discontinuities_shown}. Poté je možné celé měření opakovat.
\begin{figure}[H]
\includegraphics[width=0.3\textwidth,keepaspectratio,interpolate=false]{images/discontinuities_shown.png}\caption{Informační obrazovka o zobrazení všech diskontinuit.}\label{discontinuities_shown}
\end{figure}
