\@writefile{lot}{\contentsline{table}{\numberline{6.1}{\ignorespaces OCR1A Werte für verschiedene Frequenzen des Mithörtons\relax}}{19}{table.caption.11}\protected@file@percent }
\@writefile{lof}{\contentsline{figure}{\numberline{6.4}{\ignorespaces Sinus nach Tabelle vom Python3 Script als Linie\relax}}{20}{figure.caption.12}\protected@file@percent }
\@writefile{lof}{\contentsline{figure}{\numberline{6.5}{\ignorespaces Sinus nach der Tabelle vom Python3 Script mit Stützpunkten\relax}}{20}{figure.caption.13}\protected@file@percent }
\dictum[DK5KE]{Die Morsetelegrafie ist der Urknall des Internets.}
\end{titlepage}
@ -92,9 +122,9 @@ Preisklassen.
Warum noch ein Morse-Keyer?
Einige der erhältlichen Morse-Keyer sind in großen Gehäusen untergebracht, mit vielen Funktionen, Abschluß für eine Tastatur, dutzende Speicher und LC-Display und kosten viel Geld. Andere sind sehr günstig, haben aber nur einen Anschluß für eine Taste. Wenn man nicht gerade der Contester und DX-Jäger ist, gerne mal diverse Tasten an mehr als einem Transceiver verwendet und weder Steuerung über den PC noch Anschluß für Tastaturen benötigt, findet fast nichts am Markt.
Einige der erhältlichen Morse-Keyer sind in großen Gehäusen untergebracht, mit vielen Funktionen, Anschluß für eine PC Tastatur, dutzende Speicher und LC-Display und kosten viel Geld. Andere sind sehr günstig, haben aber nur einen Anschluß für eine Taste. Wer nicht gerade der Contester und DX-Jäger ist, gerne mal diverse Tasten an mehr als einem Transceiver verwendet und weder Steuerung über den PC noch Anschluß für Tastaturen benötigt, findet fast nichts am Markt.
Deswegen der BJ-Keyer, einfach, simpel, klein und trotzdem können mehrere Tasten und 2 Transceiver angeschlossen werden. Alles, was ich nicht benötige, habe ich auch weggelassen. Wer also auf der Suche nach einem Morse-Keyer mit ganz vielen Funktionen ist, dem empfehle ich eher sich woanders umzuschauen.
Deswegen der BJ-Keyer, einfach, simpel, klein und trotzdem können mehrere Tasten und 2 Transceiver angeschlossen werden. Alles, was ich nicht benötige, habe ich auch weggelassen. Wer also auf der Suche nach einem Morse-Keyer mit ganz vielen Funktionen ist, dem empfehle ich eher, sich woanders umzuschauen.
Wer aber einen kleinen Keyer mit wenigen aber praktischen Funktionen sucht, sollte hier weiterlesen.
@ -104,8 +134,6 @@ Viel Spaß!
Tom, DL7BJ
%\newline
\renewcommand\contentsname{Inhalt}
\tableofcontents
\chapter{Funktionen}
@ -113,12 +141,13 @@ Tom, DL7BJ
\item{BJ-Keyer Funktionsübersicht}
\begin{itemize}
\item{Iambic A und Iambic B Mode}
\item{Anschluß für Handtaste und Paddle}
\item{Ausgang für Key-Eingang TRX}
\item{Ausgang für PTT}
\item{Anschluß für 3 Handtasten und 3 Paddle}
\item{Ausgänge für die Ansteuerung von 2 Transceivern}
\item{optionales Tastenfeld für Speicher}
\item{Stromversorgung 7-15V}
\item{Integrierter Lautsprecher für Mithörton}
\item{Mithörton als Sinussignal}
\item{USB Anschluß für Firmware Update}
\end{itemize}
\end{itemize}
@ -127,9 +156,10 @@ Tom, DL7BJ
In dieser Dokumentation werden diverse gleichbleibende Darstellungsweisen verwendet. Dies erleichtert Dir das Verständnis der Bedeutung. Texte, die auf dem Display erscheinen, werden in der Bedienungsanleitung so \texttt{dargestellt}. Quellcode wird in einer farbigen Code-Darstellung eingebunden.
\chapter{Grundlagen}
\section{Betriebsarten eines Morse-Keyers}
Bei Morse-Keyer
\subsection{Zeitverhalten}
\begin{figure}[!ht]
@ -185,92 +215,40 @@ In dieser Dokumentation werden diverse gleichbleibende Darstellungsweisen verwen
\end{figure}
\chapter{Bedienung}
\section{Tastaturbelegung}
\chapter{Die Bedienung}
\section{Bedienelemente}
Als Bedienelemente stehen ein Drehencoder für diverse Einstellungen und ein Potentiometer für die Lautstärke des Mithörtons zur Verfügung. Optional kann ein Tastenfeld mit max. 5 Tastern für Zusatzfunktion wie Textspeicher angeschlossen werden. Zur Ausgabe von eingestellten Parametern wird ein 0,96$"$ OLED Display mit 128x64 Pixeln verwendet.
\subsection{Übersicht}
\chapter{Schaltung}
\chapter{Die Schaltung}
\section{Beschreibung}
\chapter{Die Software}
\section{Timer 2}
Der Timer 2 läuft in der Betriebsart Pulsweitenmodulation und erzeugt das PWM Signal für den Mithörton.
Mit dem Timer 1 werden die Zeiten für die Nachladewerte für Timer 2 zur Erzeugung des Sinussignals für den Mithörton erzeugt.
Der Timer 1 ist ein 16Bit Timer. Dieser wird für die Erzeugung von 2 Zeiten verwendet.
Der Timer löst jeweils beim Erreichen der Zeit einen Interrupt aus. Die Interrupts werden
alle 1ms und 20ms ausgelöst. So können einfach Interrupt gesteuerte Zeiten verwendet werden.
\section{Timer 0}
Der Timer 0 läuft mit einem Takt von einer Millisekunde. Im Timer Interrupt werden 3 Zähler verwendet, so dass Zeiten von 1ms, 10ms und 20ms für diverse Abläufe zur Verfügung stehen.
\subsection{Timer einstellen}
\begin{align}
f_{OCnA} = \frac{f_{clk\_I/O}}{2 \cdot N \cdot (1+OCRnA)}
Mit einer konstanten Frequenz wird ein Rechteckimpuls moduliert, bei
dem die Weite variert. Das Verhältnis zwischen Impuls und Pause wird Tastgrad (Duty Cycle) genannt.
Mit einer konstanten Frequenz wird ein Rechteckimpuls moduliert, bei dem die Weite variert. Das Verhältnis zwischen Impuls und Pause wird Tastgrad (Duty Cycle) genannt.
Bei einer Rechteckschwingung gilt für den Tastgrad D:
\begin{align}
@ -299,78 +275,139 @@ Die resultierende Ausgangsspannung berechnet sich wie folgt:
U_{Out} = \frac{\tau}{T}\cdot U_{In}
\end{align}
Dabei ist $U_{In}$ gleich $V_{SS}$. Bei einem Tastgrad von 50\% und einer Spannung $V_{SS}$ von 5V
beträgt $U_{Out}$ = 2,5V.
beträgt $U_{Out}$ = 2,5V. Je länger die Einschaltzeit ist, desto höher ist die effektive Spannung
des erzeugten Rechtecksignals, bis zu $V_{SS}$ bei einem Tastgrad von 100\%.
\subsubsection{Pulsweitenmodulation}
Das PWM Signal wird mit einem Timer erzeugt. Um die Frequenz des PWM Signals zu verändern, wird
die Taktrate und der obere Grenzwert des Zählers eines Timers verändert. Eine Änderung des Output-
Compare-Registers ändert das Pausenverhältnis. Der PWM Ausgang des ATMega328 ist High bis der Wert
im zugehörigen OCR erreicht ist und Low bis der obere Zählwert erreicht wird. Das ist der Fast-PWM
Mode des ATMega328.
Für die Erzeugung des Sinussignals wird der Timer 2 im Fast-PWM Mode verwendet. Der PWM Ausgang des
Timers 2 ist OC2A. Die Taktquelle des Timers 2 wird eingestellt und der PWM Mode ausgewählt, so dass
OC2A geschaltet wird. Weiter wird der Overflow-Interrupt aktiviert.
Das PWM Signal wird mit Timer 2 des ATMega328P erzeugt. Das PWM Signal wird an PortB Pin 3, OC2A ausgegeben.
Es wird der Fast PWM Mode 7 des Controllers verwendet, dabei ist der obere Wert des Timers der Wert
im Register OCR2A. Der Ausgang OC2A wird auf den Ausgangswert Toggle konfiguriert, d.h. jedes Mal, wenn der
Timer 2 den Wert in OCR2A erreicht, wird der Port umgeschaltet. Es wird ein Rechteck-Signal an PB3 erzeugt,
dessen Tastgrad durch OCR2A eingestellt wird. Als Taktquelle wird der CPU Takt verwendet. Dies bedeutet,
der Timer 2 läuft ohne einen Vorteiler.
Der maximale Wert für FastPWM berechnet sich wie folgt:
\begin{align}
f = \frac{f_{Quarz}}{2 \cdot 1\cdot 256}
f = \frac{f_{Quarz}}{\mathbb{N}\cdot 256}
\end{align}
Der maximale Wert bei einem Quarz mit 8MHz und der minimalen Vorteilung von 1 beträgt somit:
Der maximale Wert bei einem Quarz mit 16MHz und der minimalen Vorteilung von 1 beträgt somit:
\begin{align}
\frac{8.000000Hz}{2 \cdot 1 \cdot 256} = 15.625Hz
\frac{16MHz}{1 \cdot 256} = 62,5\si{\kilo\Hz}
\end{align}
Am Ausgang von PB3 liegt so bei einem Tastgrad von 50\% ein symmetrisches Rechtecksignal mit 62,5\si{\kilo\Hz} an. Der Effektivwert beträgt bei einer Betriebsspannung $V_{SS}$ von 5V = 2,5V. Die 256-1 sind der maximale Wert (256 Werte von 0-255), den OCR2A haben kann (Timer 2 ist ein 8 Bit Timer).
Das ist aber nicht das Ziel, da der Keyer ein sinusförmiges Signal ausgeben soll. Um das zu erreichen, muss der Effektivwert der Rechteckspannung an PB3 veränderbar sein. Dies erreicht man durch eine Änderung des Tastgrades. Nun kann ein Mikrocontroller an einem digitalen Ausgangsport keinen Sinus erzeugen, einzig eine Treppe mit einer bestimmten Anzahl an Stufen, an- und absteigend ist möglich.
15625Hz entspricht einer Periodendauer von 64µs.
Diese 15.625Hz wären die Samplerate. Für einen Sinuston von 800Hz bei 256 Schritten für die Einzelwerte
der PWM wären aber 800 \cdot 256 = 204.800Hz erforderlich. Die einzige Möglichkeit, mit dieser niedrigen
Samplerate ist die Verringerung der Schritte. Auf jeden Fall wird die Pulsbreitenänderung im hörbaren Bereich
liegen, dies soll das RLC Filter am Ausgang des Controllers bereinigen.
Wenn der obere Zählwert des Timers 2 in OCR2A verändert wird, ändert sich auch der Effektivwert der Rechteckspannung, durch die Änderung des Tastgrades. Läßt man OCR2A von 0 bis 255 zählen, ändert der Tastgrad sich von 0\% bis 100\%. Wenn dies über eine Zeitdauer \tau durch Änderung von OCR2A passiert, dann steigt die effektive Spannung über diese Zeitdauer \tau von 0V-{$V_{SS}$.
\begin{align}
V_{eff} = U_{max}\cdot\sqrt{Tastgrad}
\end{align}
Da der digitale Port nur zwischen Low und High wechseln und keine negativen Spannungen erzeugen kann, legt man eine virtuelle Nulllinie auf die Mitte, also auf 2,5V\footnote{es wird im weiteren Verlauf immer von $V_{ss}$ = 5V ausgegangen}. Die 2,5V werden bei einem Tastgrad von 50\% erreicht, entsprechend einem Wert von 128 in OCR2A.
Bei 16 Schritten würde eine Samplerate von 800Hz \cdot 16 = 12.800Hz erforderlich sein.
Da ich 800Hz als Mithörton zu hoch empfinde und damit die PWM und die Nachladefrequenz
möglichst synchron laufen, habe ich 32 Schritte gewählt. Dies führt dann dazu, dass bei
32 Teilschritten der Sinusperiode pro Teilschritt 4 PWM Impulse erzeugt werden. Damit ist die Nachladefrequenz
und die PWM Frequenz synchron und es ergibt sich ein Mithörton mit einer Frequenz von 488.28Hz.
Erhöht man den Wert von OCR2A in Form einer Sinusfunktion von 128 auf 255 über eine Zeitdauer \tau, ergibt sich eine ansteigende effektive Spannung in Form einer Sinusfunktion von 2,5V auf 5,0V. Verringert man den Wert von OCR2A von 255 auf 0 in Form einer Sinusfunktion, fällt die effektive Spannung auf 0V. Durch die passende Änderung von OCR2A in Form einer Sinusfunktion über die Zeitdauer \tau können somit Effektivspannungen mit 256 Werten dargestellt werden. Je mehr Werte es über die Zeitdauer \tau sind, umso genauer ist die resultierende Hüllkurve in Form eines Sinus.
Die Zeitdauer \tau, mit der OCR2A mit den Werten einer Sinusfunktion geladen wird, legt die Frequenz des Mithörtons fest. Für die Zeitdauer \tau wird ein weiterer Timer benötigt. Für einen Mithörton von 600Hz müssen 600 \cdot 256 Werte pro Sekunde über einen Interrupt in OCR2A geladen werden. Je mehr Werte es sind, um so genauer ist die Kurvenform. Für den Timer kann die Zeit wie folgt berechnet werden:
\begin{align}
600\si{Hz}\cdot 256 = 153,6\si{\kilo\Hz}
\end{align}
Die Timer 1 läuft im CTC Modus und es wird ein Output Compare Match Interrupt ausgelöst. Das bedeutet, der Timer läuft bis zum Wert in OCR1A hoch und dann erfolgt der Interrupt. Der Wert für OCR1A wird wie folgt berechnet:
12 für OCR1A ergibt. Allerdings bedeutet eine Frequenz von 153,6\si{\kilo\Hz} für den Timer, dass alle 6,5µs ein Interrupt ausgelöst wird, bei 800\si{Hz} Mithörton sind es alle 5µs.
Der Controller läuft mit 16\si{\mega\Hz}, ein Taktzyklus dauert 62,5ns. Damit bleiben ungefähr 80 Taktzyklen für alle restlichen Aufgaben, wie Tasten abfragen, Display ansteuern, Drehgeber abfragen, CW Zeichen ausgeben. Das ist sehr wenig und die Gefahr besteht, dass Interrupts der Tasteneingänge verloren gehen\footnote{was auch in der Praxis bei den Tests so war}. Der einzige Weg zur Verlängerung der Zeit zwischen 2 Interrupts besteht in einer Verringerung der Werte für die Sinusfunktion. Mit den 256 Werten ist die Kurvenform zwar fein abgestuft, aber der Controller ist damit am Limit.
Bei einer Verringerung auf 64 Werte für den Sinus ergibt sich dann bei 600\si{Hz} eine Zeit von 26µs, das entspricht ungefähr 416 Taktzyklen, was mehr als ausreichend ist. Das der Mithörton dadurch etwas rauher im Klang wird, muss das nachfolgende RLC Filter ausgleichen.
\begin{align}
\frac{\frac{15.625}{32}} = 488.28Hz
600\si{Hz}\cdot 64 = 38,4\si{\kilo\Hz}
\end{align}
Mit einer Tabelle von 64 Werten ergibt sich für den Timer 1 eine Frequenz von 38,4\si{\kilo\Hz} und für OCR1A ein Wert von 51 bei einem Prescaler von 8.
Die Berechnung der Werte für OCR1A für unterschiedliche Frequenzen des Mithörtons erfolgt nach dieser Formel mit $f_{Sinus}$ als gewünschte Frequenz des Mithörtons.
\caption{Sinus nach der Tabelle vom Python3 Script mit Stützpunkten}
\end{figure}
\listoftables
\listoffigures
\appendix
\chapter{Entwicklungsumgebung}
Als Entwicklungsumgebung verwende ich mehrere, ausschließlich kostenfreie und überwiegend Open Source Programme:
\begin{itemize}
\item{Editor vim \& neovim}
\item{Editor neovim}
\item{Shell bash}
\item{Filemanager mc}
\item{Terminalmultiplexer tmux}
\item{RS232 Terminal minicom}
\item{Dokumentation lualatex}
\item{PDF Reader zathura}
@ -388,4 +425,8 @@ Als Entwicklungsumgebung verwende ich mehrere, ausschließlich kostenfreie und
Wie man sieht, sind das bis auf die CAD Anwendungen und dem PDF Reader alles Anwendungen für die Textconsole. Ich finde, richtig produktiv kann man nur mit der Textconsole arbeiten ;-)