Pfad: Home => AVR-DE => Anwendungen => Signalspektrum tn2313   This page in english: Flag EN Logo
Signalspektrum-Logo AVR-Anwendungen

Signalspektrum-Aufnehmer mit ATtiny2313 und RS232-Schnittstelle


Signalspektrum-Aufnehmer mit ATtiny2313 und RS232-Schnittstelle

Das braucht man ab und an: irgendein Teil macht irgendwelche Rechtecke und man möchte gerne wissen, wie lang genau die sind und wie die Verteilung der unterschiedlich langen Rechtecke nun genau gebacken ist. Kommen die z. B. über eine Funkstrecke oder durchlaufen diverse Filter, können sie sehr unterschiedlich lang dauern.

Hiermit misst man die Dauern, ordnet sie in Zeitkategorien ein und kriegt die Anzahl Impulse mit ihrer Dauer auf der RS232-Schnittstelle zugesendet.

Die Auflösung, die man dabei erreicht, ist vom Umfang an SRAM abhängig. Der ATtiny2313 ist der kleinste AVR mit UART und liefert entsprechend 59 verschiedene Längenkategorien, der ATtiny4413 würde die doppelte Auflösung liefern. Setzt man statt dieser beiden noch größere ATmega ein, dann lassen sich noch höher aufgelöste Spektren erstellen.

Die Dauer, über die hinweg Rechtecke gezählt werden, ist im Quellcode einstellbar, zwischen einer Sekunde und mehreren Minuten bis eine Stunde (soweit dabei die 16-Bit-Zähler nicht überlaufen).

Die Maschine kann unter bestimmten Umstaänden Impulsdauern bis herunter zu 20 µs messen, was einer Frequenz von 50 kHz entspricht. Wer 100 kHz messen muss, kann den Prozessortakt verdoppeln. Auch Beginn und Ende der Signaldauer im Spektrum sind im Quellcode einstellbar. So können z. B. Signale zwischen 400 und 2.000 µs in 59 verschiedenen Kategorien aufgezeichnet werden, was einer Auflösung von etwa 27 µs entspricht. Zusätzlich werden Signale gezählt, die kürzer als das eingestellte Minimum lang sind und solche, die länger als das Maximum dauern.

Die Zeichnungen gibt es in der LibreOffice-Draw-Datei hier, Berechnungen, Stückliste und Beispiele in der Calc-Datei hier.

Top Hardware Aufbau Benutzung Software Algorithmen

1 Hardware

1.1 Die Schaltung

Schaltbild des Spektrumanalysators Das ist schon alles. Der ATtiny2313 wird mit einem Quarz getaktet, um die Zeiten exakt messen zu können.

Der Signaleingang geht an den INT0. Hat die Signalquelle eine andere Spannung als 0..5V, muss man noch einen Pegelwandler (<5V) oder einen Spannungsteiler (>5V) ansetzen.

Die serielle Schnittstelle ist an eine DB9-Buchse angeschlossen, nur das Senden ist verfügbar. Wer auch empfangen möchte, fügt noch zwei Verbindungen hinzu.

Über den ISP6-Stecker lässt sich der ATtiny2313 programmieren oder auch nur mit Strom aus dem Programmiergerät versorgen.

1.2 Hardware-Varianten

1.2.1 Filter

Um die Menge an hochfrequentem Rauschen am INT0-Eingang zu reduzieren, kann man vor den INT0-Eingang ein geeignetes RC-Filter schalten. Sollen z. B. 2 kHz noch zum INT0 durchkommen, kann man das Filter für 4 kHz auslegen. Bei einer Grenzfrequenz von 4 kHz, mit
fg = 1 / 2 / Π / R / C

wird ein Signal von 2 kHz nahezu noch nicht gedämpft, bei 4 kHz um den Faktor 2 und bei höheren Frequenzen noch mehr. Weiter unten ist der Effekt eines solchen Filters beim Rauschen eines 433MHz-Empfängers demonstriert.

1.2.2 Andere geeignete Quarze

Anstelle des 2,4576-MHz-Quarzes sind alle Quarze geeignet, deren Frequenz durch 16 sowie durch die Baudrate 38.400 Bd ohne Rest teilbar sind. Das sind:
1,8432 MHz, 3,072 MHz, 3,6864 MHz, 4,9152 MHz, 6,144 MHz, 7,3728 MHz, 9,216 MHz, 9,8304 MHz, 11,0592 MHz, 12,288 MHz, 14,7456 MHz und 18,432 MHz.

Reduziert man die Baudrate auf 9.600 Bd´kommen zusätzlich auch noch 5,0688 MHz und 7,68 MHz infrage. Man beachte, dass beim langsameren Quarz 1,8432 MHz die messbare Minimaldauer etwas länger wird, bei höheren Frequenzen sind auch noch kürzere Signale messbar. So kann ein 18,432 MHz-Quarz unter Umständen auch noch 2,3 µs messen (438 kHz).

1.2.3 Andere Baudraten

Das Senden über das UART erfolgt defaultmäßig mit 38.400 Bd. Das erwies sich bei meinem Seriell-USB-Umsetzer als sehr zuverlässig.

Wessen Umsetzer langsamer ist oder mit einem längeren RS232-Kabel ausgestattet ist, kann die Baudrate auf 19.200 oder 9.600 Bd reduzieren. Einfach im Kopf der Software einen anderen Wert eintragen. Man beachte aber dabei, dass sich Messung und Übertragung abwechseln: solange gesendet wird, wird nicht gemessen. Langsamere Übertragung nimmt daher Zeit für die Messungen von der Uhr.

Mit noch höheren Baudraten als mit 38.400 Bd habe ich die Soft- und Hardware nicht ausprobiert.

2 Aufbau

2.1 Aufbau auf dem Breadboard

Aufbau auf dem Steckbrett Das ist schnell gemacht. Die zwei Leitungen zur DB9-Buchse sind hier nicht zu sehen.

2.2 Teileliste

Teileliste des Spektrenanalysators Das ist schon alles, mehr braucht man nicht. Und alles für weniger als 10 Euro.

3 Software

Die Software gibt es in Assemblerformat hier. Sie ist auf folgende Default-Werte eingestellt:

; **********************************
;   A D J U S T A B L E   C O N S T
; **********************************
;
; Times
.equ cPulseLow = 1200 ; Pulse duration minimum in microseconds
; Minimum: 18 at 2,457,600 clock frequency), 36 by default
;
.equ cPulseHigh = 2042 ; Pulse duration maximum in microseconds
; Maximum 26,600 at 2,457,600 clock frequency, 53,200 by default

.equ cSamplingTime = 70 ; Sampling time in seconds
; Minimum 1, maximum 6,826 at 2,457,600 clock, 13,650 by default
;
.equ clock = 2457600 ; Controller XTAL clock in Hz
; Choose UART-friendly crystal (2,457,600 or equivalent, see text)
;
.equ cClkPrDiv = 2 ; Clock divider for crystal
;
.equ cUartBaud = 38400 ; Baud rate of the RS232 interface

Nach dem Programmieren des Flash nicht vergessen, die Taktfuses auf den externen Quarz umzustellen, sonst stimmen die Zeiten nicht.

4 Benutzung

4.1 Mitlesen der Werte im Realterm

Eröffnung des Datenstroms Im Terminalprogramm meldet sich der ATtiny2313 mit dieser Meldung. Aber nur, wenn man vorher
  1. im Tabulator Port die richtige Schnittstelle auswählt und diese auf die im Programm eingestellte Baudrate einstellt, dann Change und Open drückt, und
  2. im Tabulator Display auf ANSI umschaltet (sonst sieht man manchmal eigenartige Steuerzeichen).


Ende des Zählzeitraums Ist der Zählzeitraum zu Ende, dann werden alle Zählergebnisse zeilenweise ausgegeben. Die Zahl vor dem Gleichheitszeichen gibt die Dauer in Mikrosekunden an, die Zahl nach dem Gleichheitszeichen die Anzahl Zählungen. Nach der Ausgabe beginnt sofort die nächste Zählperiode.

Der Capture-Tabulator Auf dem Tabulator Capture kann man eine Datei angeben und die Aufzeichnung mit Overwrite oder Append starten. Das schreibt die Ausgabe in eine Textdatei, bis Stop Capture gedrückt wird. Die Datei kann mit einem Editor geöffnet werden, eines der mitgeschriebenen Zählausgabepakete markiert, in die Zwischenablage kopiert und in ein Tabellenkalkulationsprogramm in eine Tabelle eingefügt werden. Die LibreOffice-Datei hier enthält solche Tabellen.

4.2 Das Rauschen eines 433MHz-Empfängers

Als Beispiel für die Anwendung des Spektrum-Anlysators hier ein 433MHz-Empfänger, wie er hier beschrieben ist. Dieser Empfänger produziert ein Rauschsignal, wenn er keinen Empfang hat.

Spektrum des Empfängerrauschens Das hier sind alle Signale vom Empfänger zwischen 150 und 1.700 µs Dauer. Die Anzahl der Signale reicht von zwei bis neun Signalen innerhalb von 10 Sekunden. Eine Reihe von ganz vielen Signalen überschreiten 1.700 µs Dauer.

Rauschspektrum Rechts eine andere Darstellung des Spektrums.

4.3 Rauschen mit 40kHz-Filter

Spektrum des Empfängerrauschens mit 40kHz-Filter Rauschspektrum mit 40kHz-Filter Schon besser: ein einfaches RC-Filter mit 40kHz Grenzfrequenz am INT0-Eingang reduziert das Rauschen schon ganz gehörig (links und rechts).

4.4 Rauschen mit 4kHz-Filter

Spektrum des Empfängerrauschens mit 4kHz-Filter Rauschspektrum mit 4kHz-Filter Und hier ein rigideres RC-Filter mit 4kHz Grenzfrequenz. Nur die Signale unterhalb und oberhalb des Messbereichs sind noch da, der mittlere Bereich ist mit einzelnen Signalen schon recht sauber.

4.5 Nutzsignale ohne Filter

Als sinnvolleres Beispiel hier Empfängersignale eines 433MHz-Empfängers, der innerhalb von zwei Minuten zwei Perioden mit Nutzsignalen empfängt. Das Nutzsignal hat 1.000 Bd, Nullen mit 1 ms Dauer und Einsen mit zwei Mal 0,5 ms Dauer. Gesendet werden minütlich knapp 12.000 Bits, was etwas mehr als 12 Sekunden dauert.

Spektrum des Empfängersignals ungefiltert Empfangsspektrum ungefiltert Das sieht ohne Filter noch allzu chaotisch aus. Immerhin sind in 120 Sekunden 4.193 Signale eingegangen und haben zwei undeutliche Buckel vom Nutzsignal.

4.6 Nutzsignale mit Filter

Spektrum des Empfängersignals mit 4kHz-Filter Empfangsspektrum mit 4kHz-Filter So sieht das mit 4kHz-Filter aus: die Nutzsignale sind prima herausgefiltert, das Rauschen in den Sendepausen ist verschwunden.

Jetzt muss ich nur noch klären, weshalb mein 1.000-Bd-Signal statt 1.000 eher 1.050 bis 1.220 µs lang ist und Einsen statt 500 µs eher 820 bis 950 µs lang sind. Aber das ist eine andere Geschichte ...

4.7 Halbierung der Baudrate und Einfluss der Signalstärke

Spektrum mit 500 Baud im Nahfeld Empfangsspektrum mit 500 Baud im Nahfeld Hier wurde die Baudrate des Senders halbiert und der Sender unmittelbar neben den Empfänger gestellt. Das Spektrum ist sehr klar und eindeutig: 1.000 Bd ist klar zu viel, bei dem halben Wert geht es besser.

Spektrum mit 500 Baud im Nahfeld Empfangsspektrum mit 500 Baud im Nahfeld Und das ist das Ganze mit sehr großem Abstand zwischen Sender und Empfänger. Etwas schlechter als im Nahfeld, aber immer noch annehmbar.

5 Algorithmen

5.1 Zeitmessung

Die Zeitmessung erfolgt mit dem 8-Bit-TC0. Er wird mit folgenden Eigenschaften eingestellt:

; Timer TC0 as interval time measurement
.equ cTc0Presc = 1024 ; Prescaler for time measurement
.equ cTc0InFreq = (ClockEff + cTc0Presc/2) / cTc0Presc
.equ cTc0CtcDiv = 250 ; CTC divider
.equ cTc0CtcFreq = (1000*cTc0InFreq+cTc0CtcDiv/2)/cTc0CtcDiv ; CTC in mHz
.equ cInterval = (cSamplingTime * cTc0CtcFreq + 500) / 1000 ; 16-bit counter
.set cBlink = 2*cInterval / 75
.if cBlink == 0
  .set cBlink = 1
  .endif

Die Konstante cInterval kommt in einen 16-Bit-Zähler und wird bei jedem CTC um Eins vermindert. Die Konstante cBlink macht bei der eingestellten Intervallzeit knapp 70 Punkte, damit der Anwender sieht, ob der Prozessor noch lebt.

5.2 Flussdiagramm der Messung mit INT0

Flussdiagramm der INT0-Messung Das ist die Messroutine, die bei jedem Pegelwechsel am INT0-Eingang abläuft. Damit die Zeitmessung genau stimmt, ist ein erheblicher Teil der ISR damit beschäftigt, den 16-Bit-Zähler TC1 auf die richtige Anfangsdauer zu setzen: jede Verzweigung ist mit unterschiedlichen Takten Verzögerung dabei.

In rot sind die Taktzyklen aller alle Ausführungszeiten gerechnet. Man sieht, dass die längste Variante 43 Takte dauert, was die kürzeste Messzeit bestimmt.

Wie man sieht, ist die Dauer, und damit der beobachtbare Minimalwert, sehr von der Anzahl an Divisionen durch Zwei abhängig (c5), die notwendig werden. Diese steigt mit der Auswertungsbandbreite (cPulseHigh-cPulseLow) und kann bis zu sechs betragen. Mit diesem Maximum beträgt die maximale Dauer 5*6+43 = 73 Taktzyklen, bei 2,4576 MHz Takt also knapp 30 µs. Das dürfte aber verschmerzbar sein. Wer es schneller braucht, nimmt einen Quarz mit höherer Frequenz zum Takten.

Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte per Email an mich (info und die Web-URL-Adresse), ich freue mich über alle Arten von Rückmeldungen.

©2023 by http://www.avr-asm-tutorial.net