DAT290 / dokumentation / projektrapport / include / Theory.tex
Theory.tex
Raw
\chapter{Teori}

\section{Nödvändiga komponenter}
\label{subsec:tekniska förutsättningar}
För att konstruera ett dörrlarm, ett rörelselarm, en centralenhet samt en störenhet kommer
följande hårdvara att användas:

\subsection*{MD407-kort}
\label{sec:MD407}
MD407-kortet är en enkortsdator som är baserad på ARM-mikrokontrollern STM32F407.
Kortet är utvecklat på Chalmers tekniska högskola i Göteborg och har tillräcklig prestanda för projektet. 
De olika enheterna som ska utvecklas under detta projekt är alla baserade på varsitt MD407-kort, tillsammans
med övriga sensorer eller mätare. Enkortsdatorn lägger grunden till all funktionalitet som de olika enheterna 
har och möjliggör även CAN-kommunikation mellan dessa enheter. Se figur~\ref{fig:systemöversikt} för en 
övergripande bild över hur de olika enheterna kommer att kommunicera med varandra.

\subsection*{Avståndsmätare (ultraljud), HC-SR04}
\label{sec:HC-SR04}
Avståndsmätaren mäter avstånd genom att skicka ut åtta pulser ultraljud och sedan mäta hur lång tid 
det tar för ljudet att studsa tillbaka. Avståndet ges av \( \mathrm{\frac{Ts}{2}}\), där \(\mathrm{s}\) 
är ljudets hastighet och \(\mathrm{T}\) är den uppmätta tiden.

\subsection*{Vibrationssensor, "Flying-Fish" SW-18010P}
\label{sec:SW-18010P}
Vibrationssensorn kan känna av vibration från alla vinklar och larmar när en vibrationströskel 
överskrids. Med en inbyggd potentiometer justeras vibrationströskeln.

\subsection*{Knappsats med 16 knappar}
\label{sec:knappsats}
Knappsatsen är byggd på ett rutnät av kablar sammankopplade med strömbrytare i varje korsning av kablar, se figur~\ref{fig:keypad}.
\begin{figure}[H]
  \includegraphics{figure/auxiliary/KeypadKopplingschema}
  \caption{Kopplingsschema för knappsatsen  \cite{Keypad}}
  \label{fig:keypad}
\end{figure}

\subsection*{RJ11 anslutning}
\label{sec:rj-11}
RJ11 är en kontakttyp som vanligtvis används för fasta telefoner, men på MD407 används den för CAN-bussen.
För CAN-kommunikation används två av ledarna för CAN-hög och CAN-låg.

\section{Klockor på MD407}
\label{sec:timer}

På MD407 finns det två olika sorters klockor, en enklare Systick klockan (STK) och flera multifunktionella TIM-klockor.

Den första klocktypen STK är en 24-bitars enklare systemklocka.~\cite{pm0214:2020} STK har tre centrala register, ett kontrollregister (STK\_CTRL), ett återladdningsregister (STK\_LOAD) och ett räknarregister (STK\_VAL).
När klockan är aktiverad via kontrollregistret räknar den ned från återladdningsregistrets värde till noll i räknarregistret med samma frekvens som MD407:s processor (168 MHz).
Återladdningsregistret kan hålla ett värde mellan 1 och 16 777 215 (0xFFFFFF).
Detta resulterar i en maximal tid på knappt 100 millisekunder.
Nuvarande räknarvärde finns i räknarregistret.
När klockan når noll startas en avbrottsrutin definierad i vektortabellen, samt återladdas värdet från återladdningsregistret och klockan börjar räkna ner igen.

Den andra klocktypen TIM finns det 14 olika multifunktionella klockor. Av dessa klockor finns det tre olika typer.~\cite{rm0090:2021} Det finns klockor för allmän användning (TIM2--TIM5 och TIM9--TIM14), avancerade klockor (TIM1 och TIM8), grundläggande klockor (TIM6 och TIM7) och högprecisionsklockor (TIM2 och TIM5). Jämfört med STK-klockan har en TIM-klocka två register för att justera tiden, ett återladdningsregister (TIMx\_ARR) och ett skalärregistret (TIMx\_PSC).
Dessa är 16-bitars register eller 32-bitar för högprecisionsklockorna.
När klocka är startad laddas återladdningsregistrets värde till räknarregistret (TIMx\_CNT) som räknas upp eller ner beroende på konfiguration.
När räknarregistret är fyllt/tomt upprepas detta så många gånger som värdet i skalärregistret. När klockan är klar kan en konfigurerad händelse ske, till exempel ett avbrott eller för allmänanvändningsklockorna kan ett analogt och digitalt värde avläsas från GPIO.


\section{Kommunikation via CAN-bussen}
\label{sec:can}

Controller Area Network (CAN) är ett seriellt kommunikationsprotokoll som används mellan mikrokontroller på en delad databuss utan behov av en styrenhet.
CAN började utvecklas under 1980-talet för bilindustrin, men idag används databussen även för andra applikationer.
Sedan år 1993 är CAN en internationell standard under ISO 11898.~\cite{iso_11898:1993}

Alla anslutna enheter är kopplade till två gemensamma ledare, CAN-hög och CAN-låg.
Dessa ledare är sammankopplade med motstånd för att utjämna spänningsskillnader.
När ingen data skickas på bussen håller båda ledarna 2,5 V och en logisk etta ligger på bussen.
När någon av enheterna skickar data på bussen håller CAN-hög 3,75 V och CAN-låg 1,25 V och en logisk nolla ligger på bussen.~\cite{what-is-can:2006}
Detta gör att en logisk nolla på bussen är dominant ifall flera enheter skickar något samtidigt.
Denna egenskap används för att förhindra kollisioner, när en enhet skickar ett meddelande så skickar den sitt ID medan den lyssnar på bussen.
Om sändaren upptäcker att en annan enhet skriver på bussen samtidigt avbryter den och meddelandet får försökas skickas igen senare.
Detta resulterar i att sändaren med lägst ID prioriteras.

Varje meddelande består av en CAN-ram som visas i tabell~\ref{tab:can-header}.
I ID-fältet lagras 11 bitar som används för att undvika kollisioner, identifiera enheten samt kan användas för att specificera mottagare eller lagra annan extra information.
I datafältet lagras meddelandets innehåll som kan vara upp till 64 bitar långt och datafältets längd sparas i längdfältet.
CRC-fältet är en kontrollsumma för att upptäcka bitfel.
ACK-fältet är en bit som sätt till noll av en mottagare som har tagit emot meddelandet.
Mellan varje ram är det åtminstone 7 bitars mellanrum.
Det finns även en utökad version av CAN-ramen som innehållet till extra ID-fält med ytterligare 18 bitar.~\cite{controller-area-network:nodate}

\begin{table}[H]
  \centering
  \begin{tabular}{|l||l|l|l|l|l|l|l|l|} \hline
  Antal bitar & 1 & 11 & 3 & 4 & 0--64 & 16 & 2 & 7 \\ \hline
  Fältnamn & Start & ID & Reserverad & Längd & Data & CRC & ACK & Slut \\ \hline
  \end{tabular}
  \caption{CAN-ramens olika fält}
  \label{tab:can-header}
\end{table}

\section{Lösenordsgenerering med en linjär kongruensgenerator}
\label{sec:lösenordsgenerering}

För nätverkskommunikationen mellan centralenheten och periferienheter används ett pseudoslumpmässigt tal som lösenord för att säkerställa att ett mottaget meddelande är genuint.
Pseudoslumptalsalgoritmem som används är en linjär kongruensgenerator som genererar en sekvens tal som till synes ses slumpmässiga.
Den är lättimplementerad och kräver en kort exekveringstid.
Algoritmen definieras enligt differensekvationen $X_{i+1}\equiv AX_{i}+B{\pmod {M}}$ där $A$, $B$ och $M$ är välvalda heltalskonstanter, $X_{i}$ är nuvarande tillstånd och $X_{i+1}$ är nästa tillstånd.
Startvärdet $X_{0}$ bestäms av centralenheten när kommunikationen upprättas.

Genom att sätta $M$ till $2^{32}$ kan moduloberäkningen utföras kostnadsfritt.
Detta eftersom med 32-bitars heltalsaritmetik utan tecken trunkera talet till de 32 minst signifikanta bitarna.
Därtill blir algoritmen lämplig för datorer med begränsade resurser gällande minne och beräkningskraft såsom MD407.

En sidoeffekt av att $M$ är en tvåpotens är att det minst signifikanta bitarna ofta hamnar i kortare upprepande sekvenser.
För att motverka detta kan endast de mest signifikanta bitarna användas för pseudoslumptalet, medan hela talet används för att beräkna nästa tillstånd.

Eftersom vi använder oss av modulo $M$ är den maximalt möjliga perioden av sekvensen lika med $M$.
Enligt Hull–Dobells sats uppnås detta om och endast om $M$ och $C$ är relativt prima, $A-1$ är delbart med alla primfaktorer av $M$ och $A-1$ är en multipel av 4 om $M$ är en multipel av 4.
Om $M$ är $2^{32}$ kan algoritmen generera drygt fyra miljarder pseudoslumptal innan de upprepas.


\section{Meddelandetyper för effektiv kommunikation}
\label{sec:meddelandetyper}
För att möjliggöra specialiserad kommunikation mellan centralenheten och periferienheter finns en meddelandetyp
i varje CAN-ram som bestämmer vad ramen innehåller. Nätverksprotokollet har stöd för 16 olika 
meddelandetyper vilket kan ses i appendix~\ref{app:meddelandetyper} meddelandetyper.

\section{Teknisk förklaringar}
\subsection{Pull up/down motstånd}
\label{sec:pullup}
En pinne som inte är konfigurerad kan hamna i ett flytande tillstånd, alltså då pinnens tillstånd
inte kan garanteras och befinner sig någonstans mellan logiskt ett och noll. För att komma runt detta
kan de konfigureras som antingen pull up eller pull down. 

Om en pinne är konfigurerad som pull down är pinnens bastillstånd en logisk nolla tills den kopplas till en spänningskälla. Om den i stället
är konfigurerad som pull up är pinnens bastillstånd en logisk etta tills den kopplas till jord.
Kopplingsschemat för de två konfigurationerna ses i figur~\ref{fig:circuit}.

\begin{figure}[H]
\begin{circuitikz}
  \draw
  (-0.5,0) -- node[anchor=south]{VCC} (0.5,0) node[]{}
  (0,0) to[resistor] (0,-2)
  (0,-2) to (1,-2) node[anchor=west]{pin}
  (0,-2) to[switch] (0,-4)
  (0,-4) node[ground]{}
;
\draw
(4.5,0) -- node[anchor=south]{VCC} (5.5,0) node[]{}
(5,-2) to[switch, mirror] (5,0)
(5,-2) to (6,-2) node[anchor=west]{pin}
(5,-2) to[resistor] (5,-4)
(5,-4) node[ground]{}
;
\end{circuitikz}
\caption{Kopplingsschemat för pull up respektive pull down}
\label{fig:circuit}
\end{figure}

\subsection{CCR - Capture and Compare Registar}
Capture and compare registar (CCR) är ett timerrelaterat register som används för att lagra tidsstämplar.


\subsection[ICU]{ICU - Input Capture Unit}
Input Capture Unit (ICU) är en enhet som fångar en tidsstämpel för en specifik händelse i en digital signal.
Händelser representeras av stigande eller fallande flank i en digital signal.
Genom att hämta tidsstämplar från CCR för två händelser kan man beräkna tiden mellan händleserna
$\mathrm{{Tidspann} = {(CCR_{new}}-{CCR_{old}})* tidsenhet}$.

\section[USART-terminal]{USART - Universal Synchronous Asynchronous Receiver Transmitter}
\label{sec:usart}
Universal Synchronous Asynchronous Receiver Transmitter (USART) är ett samlingsnamn för de kretsar som är avsedda för hanteringen av olika seriella kommunikationsprotokoll.~\cite{mop:2020}
MD407-kortet har åtta olika sådana kretsar, men detta projekt kräver endast en av dem. Se avsnitt~\ref{sec:usartkretsen} för kretsens behov.

\subsection{Initiering av USART}
USART-kretsen kräver en initiering för att kretsen ska fungera enligt projektets ändamål. Detta görs via STM-biblioteket som används vid programmeringen av projektets olika enheter.
Varje USART-krets innehåller en mängd olika register för initiering och konfiguration. Bland dessa register finns ett statusregister, ett dataregister, tre kontrollregister samt ett register för att ställa in överföringshastigheten.
STM-biblioteket underlättar otroligt mycket när det kommer till initieringen av USART-kretsen. Biblioteket innebär i praktiken att programmerare slipper programmera kretsens olika register manuellt, vilket sparar mycket tid samt bidrar till mer lättläst kod.
Även uträkningar som skulle behöva göras av en programmerare vid konfiguration av överföringshastigheten, sker helt automatiskt med hjälp av STM-biblioteket. Programmeraren bestämmer alltså en överföringshastighet och biblioteket sköter själva konfigurationen.


De relevanta egenskaperna som bör ställas in vid initiering av USART-kretsen är:
\begin{description}
\item[Överföringshastighet] USART-kretsens överföringshastighet som syftar på antalet bitar som maximalt kan överföras per sekund.~\cite{phongchit_what_nodate}
\item[Ordlängd] Ordlängden är antalet databitar som kan skickas eller tas emot i dataregistret. Antalet databitar som kan skickas eller tas emot kan antingen ställas till 8 eller 9.
\item[Stoppbitar] För att signalera att det överförda datapaketet är slut så används antingen en eller två stoppbitar.
\item[Paritet] Paritet kan användas så att mottagaren upptäcker att databitar har förändrats under överföringen. Alltså, paritet gör det möjligt för mottagaren att veta om den skickade datan är felaktig.~\cite{noauthor_uart_nodate}
\item[Översampling] För att säkerställa att datan överförs korrekt så kan man använda sig av översampling. Översamplingen kan antingen ställas till 8 eller 16. Om översamplingen ställs till 8, då kommer varje inläst bit avkännas 8 gånger.~\cite{fastbitlab_stm32_2021}
\end{description}

\begin{comment}
\section{Equation}
\begin{equation}
f(t)=\left\{ \begin{array}{ll}
1,~~~~ & t< 1 \\
t^2 & t\geq 1
\end{array}\right.
\end{equation}

\section{Table}
\begin{table}[H]
\centering
\caption{Values of $f(t)$ for $t=0,1,\dots 5$.}
\begin{tabular}{l|llllll} \hline\hline
$t$ & 0 & 1 & 2 & 3 & 4 & 5 \\ \hline
$f(t)$ & 1 & 1 & 4 & 9 & 16 & 25 \\ \hline\hline
\end{tabular}
\end{table}

\section{Chemical structure}
\begin{center}
\chemfig{X*5(-E-T-A-L-)}
\end{center}

\section{List}
\begin{enumerate}
  \item The first item
  \begin{enumerate}
    \item Nested item 1
    \item Nested item 2
  \end{enumerate}
  \item The second item
  \item The third item 
  \item \dots
\end{enumerate}

\section{Source code listing}
%\lstset{language=Matlab}
\begin{lstlisting}[frame=single]
% Generate x- and y-nodes
x=linspace(0,1); y=linspace(0,1);

% Calculate z=f(x,y)
for i=1:length(x)
 for j=1:length(y)
  z(i,j)=x(i)+2*y(j);
 end
end
\end{lstlisting}

\section{To-do note}
The \texttt{todo} package enables to-do notes to be added in the page margin. This can be a very convenient way of making notes in the document during the process of writing. All notes can be hidden by using the option \emph{disable} when loading the package in the settings. \todo{Example of a to-do note.}
\end{comment}