Pfad: Home => AVR-DE => Anwendungen => Signalgenerator   This page in English: Flag EN Logo
Signalgenerator AVR-Anwendungen

Sinus/Dreieck/Rechteck/Sägezahn-Signalgenerator mit ATmega16
Hardware, Aufbau, Anwendung und Software für den Signalgenerator

Signalgenerator ATmega16

  1. Eigenschaften
  2. Hardware
  3. Aufbau
  4. Software
Diese Seiten als PDF (99 Seiten, 3,5 MB).

1 Eigenschaften des Signalgenerators mit ATmega16 und R/2R-Netzwerk

Die Hardware-Eigenschaften des beschriebenen Signalgenerators:

Seitenanfang Eigenschaften Hardware Aufbau Software

2 Hardware

2.1 Prozessor und Signalverarbeitung

Funktionsüberblick Dies gibt einen Überblick über die an den ATmega16 angeschlossenen externen Komponenten.

Als Eingabequellen sind angeschlossen. Portausgaben erfolgen über

2.2 Schaltbild

Dies hier ist das gesamte Schaltbild mit allen Komponenten.

Schaltbild

Die LCD ist mit einer 16-poligen Standardanschlussfolge angeschlossen, der Datenbus ist mit 8 Bit Breite an Port C, die Kontrollbits sind an Port A (Bits 5, 6 und 7) angeschlossen. Die Hintergrundbeleuchtung der LCD erfolgt entweder aus der geregelten Betriebsspannung von 5 V oder aus der ungeregelten Betriebsspannung mit 9 oder 12 V, der Vorwiderstand ist dann mit der Formel
RLCD-LED = (Umittel - 4,1) / ILCD-LED(mA) * 1000

auszurechnen und anzupassen (bei 9 V und 150 mA ergeben sich z. B. 33 Ω).

An den Analogspannungseingang PA0/ADC0 ist das 100k-Potentiometer zur Frequenzeinstellung angeschlossen. Der interne AD-Wandler wird am Pin AVCC über eine 22 µH-Drossel und einen Keramikkondensator aus der Betriebsspannung versorgt, die ADC-Referenzspannung wird über einen Keramikkondensator am AREF-Pin geglättet.

Die Schalter S1 und S2 zur Frequenzeinstellung und S3 und S4 zur Wellenformeinstellung sind an die Portbits PA1 bis PA4 angeschlossen. Die Schaltereingänge liegen mit den eingeschalteten internen Pull-Up-Widerständen im offenen Schalterzustand auf High-Potenzial.

Der R/2R-Digital-Analog-Wandler ist mit je 8 Widerständen von 2k20 und 1k10 aus 1% Metallfilm-Widerständen an Port D gebildet. Der Ausgang des Wandlers liegt über 10k am ersten Analogschalter 4066 und über weitere 10k am zweiten Analogschalter 4066. Beide Analogschalter schalten Kondensatoren von 470 pF, 1 nF, 10 nF und 100 nF entweder einzeln oder parallel dem RC-Filter zu. Die Auswahl der einzuschaltenden Kondensatoren erfolgt mit den Portbits PB0 bis PB4.

Das RC-gefilterte Analogsignal wird dem positiven Eingang des FET-Operationsverstärkers CA3140 zugeführt, sein negativer Eingang ist mit seinem Ausgang verbunden. Der Operationsverstärker puffert das gefilterte Analogsignal von 3 Vpp bzw. 1,0 Veff für den analogen (über einen Elko) und einen digitalen Ausgang.

Der ATmega16 wird von einem 16 MHz-Quarz und zwei Anschwing-Keramikkondensatoren von 18 pF an XTAL1-Eingang und am XTAL2-Ausgang getaktet.

An den Portpins PB5 bis PB7 sowie am Reset-Eingang (über 10k auf Plus) ist das ISP6-Interface angeschlossen, mit dem der ATmega16 in der fertigen Schaltung programmiert werden kann.

2.3 LCD-Interface

Übliche LCD-Anzeigen mit 14 (ohne Hintergrundbeleuchtung) oder 16 Pins (mit Beleuchtung) können direkt auf die 16-polige Fassung aufgesteckt werden. Bei LCDs ohne Hintergrundbeleuchtung braucht der Widerstand 15 Ω nicht bestückt werden, die Anschlüsse 15 und 16 bleiben dann frei.

Soll der Anzeigentyp DIP081 verwendet werden, der größere Zeichen als bei Standard-LCDs anzeigt, ist eine Anpassung des LCD-Standardanschlusses an die geänderte Pinbelegung im 2 mm-Raster erforderlich. Dabei sind folgende Änderungen nötig: Zusatzschaltung für DIP081-Anzeige Das Schaltbild des Adapters ist hier gezeigt.

Für die Hintergrundbeleuchtung der DIP081-Anzeige sind zwei Varianten denkbar:
  1. Betrieb mit 150 mA LED-Strom (gemäß Spezifikation), oder
  2. Betrieb mit 60 mA LED-Strom (stromsparende Variante).
In beiden Fällen macht es Sinn, die LCD-Beleuchtung direkt aus der gleichgerichteten Wechselspannung des Netzteils zu versorgen, da die Versorgung nicht unbedingt auch geregelt erfolgen muss. Da für die reine Schaltungsversorgung ein 78L05-Spannungsregler ausreicht, muss bei dieser Versorgungslösung kein 7805 eingesetzt werden, da die Wärmeleistung des Stroms zur Hintergrundbeleuchtung nicht im Spannungsregler sondern im Vorwiderstand verbraten wird (bei 9V und 150 mA 735 mW, bei 60 mA 294 mW).

Der Vorwiderstand von 33 Ω sind für 9V-Versorgung und 150 mA LED_Strom ausgelegt (sollte 1 oder besser 2 W vertragen). Bei 9V und 60 mA muss ein 82 Ω verwendet werden (vorzugsweise Metallfilm mit 400 mW Leistung). Erfolgt die Versorgung aus der geregelten 5 V-Spannung mit 60 mA LED-Strom sind 15 Ω erforderlich.

2.4 Netzteil

Die Auslegung des Netzteils ist im Wesentlichen vom Strom für die LCD-LED-Hintergrundbeleuchtung bestimmt. Ohne Hintergrundbeleuchtung reicht ein Trafo mit <1 VA aus oder die Schaltung kann aus Batterien oder Akkus versorgt werden. Für eine LCD mit hochstromiger Hintergrundbeleuchtung (wie dem DIP081) sind für das Netzteil zwei Varianten denkbar:
  1. spezifikationsgerechter Betrieb mit 150 mA Strom für die Hintergrundbeleuchtung: hierfür muss ein 3,6-VA-Trafo verwendet werden,
  2. abgespeckter Betrieb mit 60 mA: hierfür reicht ein 1,2-VA-Trafo aus.

2.4.1 Die 3,6-VA-Variante

Netzteilschaltung mit 3,6VA Dies ist die spezifikationsgerechte Variante des Netzteils. Die Schaltung liefert 150 mA für die Hintergrundbeleuchtung und über den Spannungsregler 78L05 den Strom für den Rest der Schaltung.

Netzteilspannungen unter Last Dies sind die Spannungsverhältnisse unter einer Last von 170 mA (simuliert mit dieser Software). Die durchschnittliche Spannung am Elko liegt bei 12 V. Damit ist der Widerstand vor der LCD mit
R = (12 - 4,1) / 0,15 = 53 Ω
(praktisch E12: 56 oder 47 Ω; E48: 53,6; E96: 52,3 Ω)

Der Widerstand sollte in diesem Fall 2 W abkönnen.

Netzteilspannungen ohne Last Dies sind die Spannungen ohne Laststrom. Die Spannung überschreitet 16 V, daher sind Kondensatoren mit mehr Spannungsfestigkeit (25 oder 35 V) zu verwenden.

2.4.2 Die 1,2-VA-Variante

Netzteilschaltung mit 1,2VA Dies ist die Variante mit reduziertem Beleuchtungsstrom.

Netzteilspannungen bei 1,2VA Dies hier sind die Spannungen unter einer Last von 100 mA. Bei den durchschnittlichen 9 V ergibt sich der LED-Widerstand zu
bei 60 mA: R = (9 - 4,1) / 0,06 = 82 Ω
mit P = (9 - 4,1) * 0,06 = 294 mW
bei 80 mA: R = (9 - 4,1) / 0,08 = 61 Ω
mit P = (9 - 4,1) * 0,08 = 392 mW

Allerdings ergeben sich hohe Spannungen, wenn das Netzteil ohne Last betrieben wird: die Leerlaufspannung liegt bei über 20 V. Das liegt an dem hohen Spulenwiderstand des Trafos, der nur bei Nennlast 9 Veff hat, unterhalb der Nennlast aber auf eine deutlich höhere Spannung kommt. Die Dimensionierung des Ladeelkos und der eingangsseitigen Tantalelkos muss sich an dieser höheren Spannung orientieren, damit diese Bauteile nicht wegen Überspannung versagen.


Seitenanfang Eigenschaften Hardware Aufbau Software

3 Aufbau

3.1 Layout und Bestückungsplan

3.1.1 Prozessor und Signalverarbeitung

Dies ist die Belichtungsmaske für die 80*80-mm große Platine.

Leitseite Prozessorplatine

Der entsprechende Bestückungsplan ist hier zu sehen:

Bestückungsplan Prozessorplatine

Alle Brücken wurden mit lötbarem lackisoliertem Kunststoffdraht ausgeführt, um Nebenschlüsse zu vermeiden.

3.1.2 LCD-Interface

Hier das Layout der DIP081-LCD-Adapterplatine.

LCD-Adapterplatine

Man beachte die eigenwillige Nummerierung der DIP081-Pins und die beiden nicht verbundenen Pins.

LCD-Stiftleiste Man beachte ferner, dass die 16-polige Stiftleiste von der Lötseite her nach unten zeigend eingelötet wird, damit sie auf die Buchsenleiste gesteckt werden kann.

3.2 Bilder

Bestückte Prozessorplatine Das hier ist die fertig bestückte Prozessorplatine. Die externen Anschlüsse für das Potentiometer und die vier Schalter links sowie die Audio- und Digitalausgänge und die Stromversorgung rechts erfolgen über 1 mm Lötstifte.

Netzteil Netzteil seitlich Die mit einem 1,2 VA Trafo und einem 78L05 bestückte Netzteilplatine wurde der Einfachheit halber auf Lochraster aufgebaut.

3.3 Gehäuse

Als Gehäuse kommt eine kleine Plastikschachtel in Betracht, wie man sie im Haushaltswarenbedarf kriegt.

Box von oben Box von der Seite Box geoeffnet Das passt alles in eine nette kleine Plastikschachtel mit Öffnung für die aufgesteckte LCD und mit den Schaltern und Cynch-Buchsen.


Seitenanfang Eigenschaften Hardware Aufbau Software

4 Software

4.1 Fuse-Einstellungen ATmega16

Damit die Software korrekt funktioniert, sind Fuses des ATmega16 zu ändern, da dieser per Default mit 1 MHz arbeitet. Links sind die werksseitigen Fuses zu sehen, rechts die erforderlichen Einstellungen.

Fuses werksseitig Fuses-Einstellung Signalgenerator

Natürlich muss die Umstellung der Fuses mit dem angeschlossenen Quarz vorgenommen werden, damit sie korrekt abläuft. Ist kein Quarz angeschlossen, kommt es zu Fehlermeldungen, da die abschließende Fuse-Verifikation dann nicht mehr funktionieren kann.

4.2 Software-Überblick

Die Software unterteilt sich in drei wesentliche Funktionsblöcke:
  1. die Auswertung des Poti-Wertes und der Schalterstellungen,
  2. die Übernahme dieser Neueinstellungen nach dem nächsten Nulldurchgang der Frequenzausgabe, und
  3. der Frequenzausgabe.

4.2.1 Auswertung der Poti-Werte und der Schalterstellungen

Das Auswerten des Poti-Wertes erfolgt mittels ADC-Interrupts.

ADC-Taktung Der Takt der AD-Wandlung wird mit dem Timer TC0 bestimmt. Mit einem Vorteiler von 1.024 und einem Compare-A-Wert von 243 ergibt sich im CTC-Modus eine Frequenz von 64,04 Hz bzw. eine Wiederholrate von 15,6 ms. Der Compare-Match A stößt eine AD-Wandlung an. In der Interrupt-Service-Routine von TC0CmpA wird die T-Flagge ausgeschaltet, um bei nicht abgeholten Wandler-Resultaten ein Abholen während der Wandlungsphase zu unterbinden.

Ist die Wandlung abgeschlossen (nach 128*13=104 µs) setzt der ADC seine Interrupt-Flagge. In der Interrupt-Service-Routine wird nur die T-Flagge im Statusregister gesetzt.

Außerhalb der Interrupt-Service-Routine wird der ermittelte Wert eingelesen und 16 dieser Werte werden aufsummiert. Sind alle 16 Werte eingelesen (alle ca. 250 ms), werden die Schalterstellungen eingelesen und wird aus diesem Mittelwert durch 8*16-Bit-Multiplikation die eingestellte Frequenz errechnet. Aus dieser wird durch eine 32/24-Bit-Division der neue einzustellende CTC-Wert für die Frequenzerzeugung mit dem Timer TC1 errechnet. Abhängig von der Schalter- und Potistellung werden beim Sinus auch die einzustellenden Kondensatorwerte ermittelt. Abhängig von den Schalterstellungen, sowie bei Frequenzen ab 2.500 Hz auch von der Potistellung, wird die einzustellende Kurvenform ermittelt (Kurvenart, Kurvenauflösung). Ändert sich die Kurvenform, wird das Flaggenbit bSetR2R gesetzt. Ändert sich die zu erzeugende Frequenz, wird das Flaggenbit bSetCtc gesetzt. Die weitere Verarbeitung dieser beiden Flaggen erfolgt erst dann, wenn die Frequenzausgabe einen Nulldurchgang hat (Flagge bStart gesetzt). So lange, bis das der Fall ist, werden die neuen Einstellungen im SRAM gespeichert.

4.2.2 Nulldurchgang und Übernahme der neuen Werte

Erfolgt bei der Frequenzausgabe ein Nulldurchgang (der letzte Wert eines Kurvenzuges ist ausgegeben), wird die Flagge bStart gesetzt. Außerhalb von Interrupt-Service-Routinen wird diese Flagge geprüft. Damit erfolgt eine Synchronisierung mit dem Ausgabeprozess.

Parametertransfer Hat die Frequenzausgabe den Nulldurchgang signalisiert, wird geprüft, ob die Flagge bSetR2R gesetzt ist. Ist das der Fall, wird die Flash-Tabelle der ausgewählten Kurvenform (Dreieck, Sinus, Sägezahn, Rechteck) in den Ausgabebereich im SRAM kopiert. Dabei wird entsprechend der eingestellten Frequenz
  1. jedes, oder
  2. nur jedes zweite, oder
  3. nur jedes vierte, oder
  4. nur jedes achte Byte
aus der Flashtabelle kopiert und, bei nur teilweisem Kopieren, mit der Flashtabelle von vorne begonnen, bis 256 Werte kopiert sind.

Nach dem Transfer der Werte oder wenn nur die Flagge bSetCtc gesetzt war, wird der CTC-Wert des Ausgabe-Timers neu eingestellt, wodurch sich die Ausgabefrequenz entsprechend ändert. Die beiden bSet-Flaggen werden gelöscht.

Aus dem real eingestellten CTC-Wert und der frequenzspezifischen Anzahl auszugebender Dezimalstellen wird mit einer 40/16-Bit-Division die anzuzeigende Frequenz ermittelt und auf der LCD, zusammen mit einem Symbol für die Kurvenform angezeigt.

4.2.3 Frequenzausgabe

Die eigentliche Ausgabe der zu erzeugenden Frequenz erfolgt mit dem PWM/CTC-Interrupt von TC1 indem die im SRAM gespeicherten Tabellenwerte an den AD-Wandler ausgegeben werden.

TC1-CTC-Interrupt Abhängig von der eingestellten Frequenz erfolgt zwischen 512 und 640.000 mal in der Sekunde ein PWM/CTC-Interrupt, denn die Comparewerte liegen zwischen 31.249 (niedrigste Frequenz) und 25 (höchste Frequenz). Der nächste Tabellenwert für die Frequenzerzeugung wird aus der SRAM-Tabelle gelesen und an den DAC-Wandler ausgegeben. Ist der letzte Tabellenwert aus dem Flash gelesen, wird mit der Tabelle von vorn begonnen und außerdem die Nulldurchgangsflagge bStart gesetzt.

Dies sind die Abläufe im Wesentlichen. Mehr Details zur Software gibt es im folgenden Kapitel.

4.3 Software-Erläuterungen und -details

Die Software ist vollständig in Assembler geschrieben, um die zeitkritischen Schritte des Ablaufs (insbesondere die Kurvenausgabe über den Digital-Analog-Wandler) zeitkorrekt abwickeln zu können.

In einer Extra-Datei hier sind die einzelnen Routinen der Software und die Rechen- und Einstellungsteile erläutert und die gesamte Software im HTML-Format dargestellt.

Der Assembler-Quellcode ist in dieser Datei enthalten. Dazu sind noch die LCD-Include-Datei hier und die Wellenformen-Include-Tabelle hier zusätzlich nötig. Falls die Virus-Überwachung die Include-Dateien beanstandet: sie sind reine Textdateien, ihr Download ist absolut ungefährlich.

Seitenanfang Eigenschaften Hardware Aufbau Software

5 Anwendungsbeispiele im Simulator

Hier zwei simulierte Kurven:

Sinus 2 kHz Ein Sinus mit 2 kHz bei 256 Schritten Auflösung pro Durchgang, noch ohne angeschlossenes RC-Filter.

Saegezahn 5 kHz Und hier ein Sägezahn mit 5 kHz mit 64 Schritten pro Durchgang.

Beides kann sich sehen lassen.


Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über das Kommentarformular an mich.

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