Pfad:
Home =>
AVR-Übersicht =>
Anwendungen => Rechteckgenerator
(This page in English:
)
Rechteckgenerator mit ATmega8
Diese Anwendung eines AVR beschreibt einen Rechteckgenerator mit dem ATMEL ATmega8 mit
folgenden Eigenschaften:
- Einstellbarer Frequenzbereich: 0,25 Hz bis 8 MHz in 1024 Stufen
- Weiter Dynamikbereich der Frequenz ohne mechanisches Umschalten
- Umprogrammierung des Frequenzverlaufs möglich
- Einstellbare Pulsweite von 0,00 bis 100,00% in 1024 Stufen
- Pulsweiteneinstellung und Frequenz unabhängig voneinander
- Quarzbasis 16 MHz für stabile Frequenz
- Normaler und invertierter Ausgang
- Umschaltbare Polarität der Ausgänge (aktiv high, aktiv low)
- LCD-Anzeige mit umschaltbarer Anzeige von Frequenz, Zeit, Runden pro Minute, Pulsweite
- Anpassbar an ein- und zweizeilige LCD-Anzeigen mit 16 bis 40 Zeichen pro Zeile
- Englische oder deutsche Anzeigeversion wählbar
Die Hardware besteht aus dem AVR-Prozessor
ATmega8, einem In-System-Programmieranschluss (ISP), einer LCD-Anzeige
und diversen externen Anschlüssen.
Der Prozessor ist mit folgenden externen Komponenten
beschaltet.
Die Betriebsspannung von 5 V wird über die
Pins 7 (+5 V) und 8 (0 V) zugeführt und
mit einem Keramikkondensator abgeblockt.
Pin 1 (= RESET-Eingang) liegt über einen Widerstand
an der positiven Betriebsspannung. An den beiden
Anschlüssen Pin 9 und 10 (XT1, XT2) ist ein Quarz mit
16 Mhz angeschlossen. Die Umschaltung des Prozessortakts
auf den externen Quarz erfolgt durch Setzen der entsprechenden
Fuses. Die beiden Quarzanschlüsse sind mit
Keramikkondensatoren von 22 pF zur Verbesserung des
Anschwingverhaltens des internen Oszillators versehen.
Die Betriebsspannung für den AD-Wandler wird über
eine Drossel von 22 µH und einen Folienkondensator
von 100 nF an Pin 20 (AVCC) zugeführt. Als
Referenzspannung dient eine softwareseitige Zuschaltung von
AVCC, daher ist der AREF-Pin 21 mit einem
Folienkondensator gegen Masse geblockt.
Das ISP-Interface dient der Programmierung des AVR in der
fertig aufgebauten Schaltung.
Für ISP verwendet werden die Portbits 5 (SCK), 4 (MISO),
und 3 (MOSI) sowie der RESET an Pin 1. MISO dient auch
der Ansteuerung der LCD. Die Belegung am 10-poligen
ISP-Pfostenstecker entspricht dem ATMEL-/KANDA-Standard.
Die am Pfostenstecker angeschlossene LED zeigt den aktiven
Programmiervorgang an.
Angeschlossen ist eine Standard-LCD-Anzeige. Für
leichtes Wechseln der Anzeige ist ein 14-poliger Pfostenstecker
vorgesehen, der der 14-poligen Anschlussleiste der LCD
entspricht.
Der Kontrollport der LCD ist an die Portbits PB0 (LCD-Enable)
und PB4 (LCD-RS-Eingang) angeschlossen. LCD-Enable ist
über einen Widerstand mit 0 V verbunden. Solange
der Port B nicht initialisiert ist (nach dem Einschalten,
beim Programmieren über ISP), ist dadurch sichergestellt,
dass die LCD nicht durch Fehlsignale angesteuert wird. Der Eingang
LCD-R/W ist dauerhaft mit 0 V verbunden, weil die Anzeige
ausschließlich beschrieben wird und nicht ausgelesen werden
muss.
Der Datenport der LCD ist mit allen acht Bits des Ports D
verbunden. Die Ansteuerung der LCD erfolgt also 8-bittig.
Bis auf die LCD und die Stromversorgung, die über eigene
Steckverbinder angeschlossen sind, sind alle weiteren externen
Komponenten über einen 14-poligen Steckverbinder
angeschlossen. Dadurch ist sichergestellt, dass die Platine
ausgebaut und ohne diese Komponenten betrieben und getestet
werden kann. Durch Auftrennung des Flachbandkabels können
die externen Komponenten systematisch angeschlossen werden.
Die ersten vier Adern des Flachbandkabels sind mit der
Betriebsspannung und den AD-Kanälen verbunden.
Die beiden AD-Wandlerkanäle ADC0 (Frequenz) und
ADC1 (Pulsweite) sind an die Schleifer von
10-Gang-Potentiometern angeschlossen. Die Potentiometer
sind an die Betriebsspannung angeschlossen. Ihr nominaler
Widerstandswert und ihre Linearität sind unkritisch,
weil die Einstellungen über die Anzeige kontrolliert
werden können.
Direkt am Potentiometer sind die eingestellten Spannungen
mit Folienkondensatoren abgeblockt, um eingestreute
Wechselspannungen zu vermeiden.
Die nächsten fünf Adern verbinden die Schalter
mit den Porteingängen PC2 bis PC5. Der Schalter an
PC5 ist nur notwendig, wenn eine einzeilige LCD-Anzeige
verwendet wird. Bei Anschluss einer zweizeiligen LCD ist
dieser Schalter wirkungslos.
Alle Schalter verbinden im geschlossenen Zustand den
entsprechenden Porteingang mit 0 V, da die
inaktiven Eingänge mittels der Software mit
Pullup-Widerständen auf die Betriebsspannung gezogen
werden.
Die folgenden drei Adern führen die Ausgänge
des Timers (normal, invertiert) an die
CINCH-Ausgangsbuchsen.
Die Ausgänge liefern Rechteckspannungen mit den
Ausgangscharakteristika der AVR-Treiber und liegen
gleichspannunsgekoppelt an den Buchsen. Die Ausgänge
sind kurzschlusssicher, aber gegen extern anliegende
Spannungen nicht geschützt.
Das Netzteil liefert eine stabilisierte Betriebsspannung
von 5 V bei einem Strom von etwa 20 mA. Der
Stromverbrauch ist vom Widerstandswert der Potentiometer
abhängig. Prozessor und LCD-Anzeige bleiben unter
10 mA Verbrauch.
Um einen Trafo mit 6 V Sekundärspannung verwenden
zu können, ist die Gleichrichterbrücke mit
Schottky-Dioden aufgebaut und ein Low-Drop-Spannungsregler
eingesetzt. Bei Trafos mit 7,5 V Sekundärspannung
und mehr können diese Komponenten gegen Standardwerte
ausgetauscht werden.
Der Ladekondensator ist großzügig dimensioniert,
bei dem geringen Strom kann er auch kleiner gewählt
werden.
Die beiden Tantal-Elkos blocken Schwingneigungen des
Spannungsreglers ab.
Der Aufbau ist mit einer Lochrasterplatine recht unkritisch.
Der 14-polige Anschluss der LCD ist links angeordnet, der ebenfalls
14-polige Anschluss zu den externen Bedienelementen (Potis, Schalter,
Ausgangsbuchsen) rechts auf der Platine. Das Flachbandkabel
ist so belegt, dass es zu vier, fünf, drei und zwei Adern
aufgetrennt werden kann und übersichtlich den verschiedenen
Sektionen zugeführt werden kann. Wichtig sind die beiden
Folienkondensatoren direkt an den Schleifern der beiden
Potis, die eingestreute HF/NF abblocken.
Der 10-polige ISP-Programmieranschluss wird nicht oft
benötigt und ist daher nicht außen am Gehäuse
zugänglich angebracht. Das kleine Netzteil sitzt links
oben an der Gehäusewand.
Nach dem Einschalten zeigt die LCD-Anzeige für etwa
2,5 Sekunden eine Meldung zur Gerätefunktion,
die Softwareversion und das Copyright der Software an.
Danach ist das Gerät betriebsbereit.
Mit dem Schalter Time wird zwischen der LCD-Ausgabe der
Frequenz (Schalter offen) und der Zeit (Schalter
geschlossen) umgeschaltet. Die Ausgabe der Frequenz
erfolgt in Hz mit zwei Dezimalstellen, die Ausgabe der
Zeit in Mikrosekunden. Beide Größen werden
gerundet und mit Tausenderzeichen getrennt dargestellt.
Ist die Frequenzausgabe ausgewählt, dann kann mit
dem Schalter Rpm die Ausgabe von Umdrehungen pro Minute
(= 60 * f) ausgewählt werden. Ist die Ausgabe der
Zeit gewählt, bleibt dieser Schalter unwirksam.
Mit dem Schalter Inv werden beide Ausgangssignale
invertiert.
Bei einzeiligen LCD-Anzeigen bewirkt der Schalter Pulse,
dass anstelle der Frequenz/Zeit die Pulsweite in %
angezeigt wird. Bei zweizeiligen LCDs beibt dieser
Schalter unwirksam, die Pulsweite wird dauernd in der
zweiten Zeile angezeigt.
Die Ausgangssignale stehen an den beiden CINCH-Buchsen
in positiver und invertierter Form zur Verfügung.
Um kapazitive Effekte auf die Flankensteilheit zu
vermeiden, sollten kurze und unabgeschirmte Leitungen
verwendet werden.
Dieser Abschnitt erläutert die Funktionsweise des
Prozessorteils, des ISP-Interfaces und der LCD-Anzeige.
Der Prozessor ATmega8 arbeitet mit einem extern
angeschlossenen Quarz als Taktgenerator. Da der
Prozessor als Werkseinstellung mit dem internen
RC-Oszillator bei 1 MHz arbeitet, müssen zuerst
folgende Fuses des Mega8 umgestellt werden:
- CKOPT = 0
- CLKSEL3..CKSEL0 = 1111
- SUT1..SUT0 = 11 oder 10
Das Umprogrammieren dieser Fuses kann entweder extern
in einem Programmierboard (z.B. mit einem STK500 und
dem ATMEL-Studio) erfolgen oder in der fertig aufgebauten
Schaltung mit dem ISP-Interface (z.B. mit PonyProg2000).
Beim Programmieren mit einem STK500 muss der Quarz zugeschaltet
werden, da der Mega8 sonst nach dem Umstellen der Fuses ohne
Quarz nicht mehr ansprechbar ist. Die Fuses sind richtig
eingestellt, wenn eine der beiden letzten Optionen gewählt
wird.
Bei PonyProg ist zu beachten, dass die Fuses invertiert
dargestellt sind. Zur Orientierung: per Werkseinstellung sind
CKSEL3..CKSEL0 auf 0001 und SUT1..SUT0 auf 10 eingestellt. Mit
dem Read-Button sollten die Fuses vorher ausgelesen werden.
Natürlich muss der Quarz in der Schaltung vor dem
Umprogrammieren der Fuses schon angeschlossen sein. Bei SUT0
kann ebenfalls der Haken ebenfalls entfernt werden (SUT1:SUT0 = 11).
Die angeschlossenen Schalter werden zu Beginn des
Programms mittels Software mit den Pull-Up-Widerständen
auf positives Betriebsspannungs-Niveau gezogen. Sind die
Schalter eingeschaltet (aktiviert), werden diese
Eingangsleitungen auf logisch Null gesetzt. Der Schalter
Pulse ist nur relevant, wenn eine einzeilige LCD-Anzeige
verwendet wird.
Die Frequenzerzeugung erfolgt mit dem internen
16-Bit-Zähler TC1 des ATmega8 im Fast-PWM-Modus.
Das Schema zeigt die Funktionsweise des TC1 im Fast-PWM-Modus
und die die Funktionen beeinflussenden Parameter (blau).
Die aus dem Quarz abgeleitete 16MHz-Taktfrequenz wird dazu
im Vorteiler entweder durch 1, 8, 64, 256 oder 1024 geteilt
und dem Zähler zugeführt. Bei Erreichen des
eingestellten TOP-Wertes in dem Doppelregister ICR1 setzt der
Zähler zurück und aktiviert die Compare-Ausgänge
OC1A (Portbit PB1, Pin 15) und OC1B (Portbit PB2, Pin 16).
Die Frequenz des Generators wird über den TOP-Wert
in ICR1 festgelegt. Abhängig vom eingestellten
Wert der Pulsweite werden die Vergleichswerte in
den COMPA- und COMPB-Doppelregistern eingestellt.
Erreicht der Zähler diese eingestellten Werte,
werden die Ausgänge OC1A und OC1B deaktiviert und
bleiben bis zum Erreichen von TOP inaktiv.
Die beiden Ausgänge OC1A und OC1B sind von der Software
komplementär eingestellt, d.h. sie erzeugen invertierte
Signale gleicher Pulsdauer. Mit dem Schalter "Invert" wird
diese Polarität an den Ausgängen
software-mäßig invertiert.
Die Frequenzeinstellung erfolgt mit dem Potentiometer
P1. Da 1024 verschiedene diskrete Frequenzen eingestellt
werden können, muss dafür ein Zehngang-Poti
verwendet werden. Das Poti gibt eine Spannung zwischen
0 und 5 V ab, die mit dem AD-Wandler ADC0 (Portpin
PC0, Pin 23) gemessen und in einen Hex-Wert zwischen
0x00 und 0x1F umgewandelt wird. Dieser Wert wird
verwendet, um aus der einprogrammierten Tabelle
(Lookup-Tabelle, Include-Datei rectgen_m8_table.inc)
den zugehörigen TOP-Wert auszulesen, der beim
nächsten Update in ICR1 geschrieben wird.
Abhängig von der eingestellten Frequenz wird
aus dem ADC0-Wert auch noch der Vorteilerwert des
Zählers ermittelt und gespeichert.
Die Pulsweiteneinstellung wird mit dem zweiten
Zehngang-Potentiometer aufgenommen und über
ADC1 (Portbit PC1, Pin 24) in einen Wert zwischen
0x00 und 0x1F umgewandelt. Der TOP-Wert wird mit
diesem gemessenen Wert multipliziert und durch 1024
geteilt. Das Ergebnis wird beim nächsten Update
in die Compare-Register COMPA und COMPB geschrieben.
Im gleichen Zyklus wird noch der Schalter Invert
eingelesen und die Ausgangspolarität an OC1A
und OC1B eingestellt.
Der TC1-Zähler läuft ohne Software-Eingriff
freilaufend. Zum Aktualisieren der Einstellungen wird
der 8-Bit-Zähler TC0 verwendet. Er teilt den
Systemtakt durch 1024 (Vorteiler) und läft bei
Erreichen eines Zählerstandes von 256 über
(@16MHz: alle 16,384 ms). Er unterbricht den
Programmablauf und zählt ein Register von 30
abwärts. Wird das Zählerregister Null
(nach jeweils 492 ms), wird der AD-Wandler auf
Kanal 0 eingestellt und die erste Messung auf
ADC0 gestartet.
Der AD-Wandler arbeitet mit einer durch 128 geteilten
Taktfrequenz. Das Vorliegen des ersten Resultats löst
einen ADC-Conversion-Complete-Interrupt aus. Nach Setzen
eines Flagbits wird der ADC auf Kanal 1 umgestellt
und erneut eine Messung gestartet. Liegt auch dessen
Ergebnis vor, wird der AD-Wandler abgeschaltet und
ein Behandlungsflag gesetzt.
Die Umwandlung und Aktualisierung der TC1-Parameter
erfolgt danach asynchron in der Hauptprogrammschleife.
Die eingelesenen Werte werden umgewandelt und der
Zähler auf die neuen Sollwerte gesetzt. Nach
dem Programmieren von TC1 wird die LCD aktualisiert
und der Hauptprogrammloop bis zum nächsten
TC0-Interrupt mit Schlafen der CPU abgeschlossen.
Die LCD-Anzeige ist mit dem 8-Bit-Datenport und den
beiden Kontrollleitungen E(nable) und R(egister)S(elect)
an den Prozessor angeschlossen. Die R(ead)/W(rite)-Leitung
liegt dauernd auf Write, da die gesamte Steuerung über
zeitgenaue Schleifen vorgenommen wird.
Beim Programmstart wird nach einer Wartezeit für die
interne Initialisierung die LCD-Anzeige auf folgende Modi
eingestellt:
- 8-Bit-Interface
- Ein- oder zweizeilige LCD (je nach Voreinstellung)
- keine Display-Shift
- Cursor aus
- Blinken aus
Dann wird für 2,5 Sekunden eine
Eröffnungsmeldung ausgegeben.
Nach jeder Aktualisierung des TC1-Timers wird auch die Anzeige
der LCD aktualisiert. Dazu wird zunächst der CTC-Wert
aus ICR1 mit dem Vorteilerwert (1, 8, 64, 256, 1024)
multipliziert. Ist die Anzeige der Frequenz ausgewählt
(Schalter Time aus), dann wird die mit 100 multiplizierte
Taktfrequenz (100*16.000.000) durch diesen Wert geteilt, um
die Frequenz in Hz mit einer Auflösung von 0,01 Hz
als Ganzzahl zu erhalten. Ist die Zeit ausgewählt
(Schalter Time an), wird die mit dem Vorteilerwert
multiplizierte CTC-Rate mit dem Faktor 25.600.000.000/clock
(@16MHz: 1.600) multipliziert, um die Zeit in Mikrosekunden
mal 100 als Ganzzahl zu erhalten. Bei einer zweizeiligen
LCD wird der sich ergebende Wert für die Frequenz
bzw. die Zeit in Zeile 1 ausgegeben, bei einer einzeiligen
LCD nur dann, wenn der Schalter für die Ausgabe der
Pulsweite (Schalter Pulse) nicht aktiviert ist.
Die Pulsweite wird ermittelt, indem der Wert für COMPA
bzw. COMPB mit 10.000 multipliziert und dann durch den
CTC-Wert geteilt wird. Die erhaltene Ganzzahl gibt die
Pulsweite mal 100 in % an und wird bei einer zweizeiligen
LCD in Zeile 2, bei einer einzeiligen LCD bei eingeschaltetem
Schalter Pulse in Zeile 1 mit einer Auflösung von 0,01%
angezeigt.
Die Anzeige wird ca. zwei Mal pro Sekunde aktualisiert.
Bei höheren Frequenzen können aufgrund der auf
16 Bit begrenzten Auflösung Frequenzen und Pulsweiten
nicht mehr exakt eingestellt werden. Dies ist dadurch erkennbar,
dass Nachkommastellen auftreten. Durch die Berechnung der
beiden Größen aus den tatsächlich verwendeten
Werten wird sichergestellt, dass die angezeigten
Größen auf jeden Fall zuverlässig sind.
Das ISP-Interface dient der Aktualisierung der Software
innerhalb der fertig betriebenen Schaltung. Die Daten-
bzw. Taktsignale MOSI, MISO und SCK sind an einem 10-poligen
Standard-Pfostenstecker angelegt. Über die RESET-Leitung
(Portbit PC6, Pin 1) schaltet das ISP-Programmierinterface
den Mega8 in den Programmiermodus, nach dem Ende des
Programmierens wird der RESET-Eingang wieder freigegeben
und ein Neustart des Prozessor ausgelöst.
Die Programmier-LED zeigt einen aktiven Programmierzyklus
an, dient ausschließlich diesem Zweck und kann
ersatzlos entfallen, wenn diese Funktion nicht erforderlich
ist oder wenn ein sechspoliger Programmieranschluss
verwendet wird.
Die Software ist ausschließlich in Assembler geschrieben
und in drei funktionelle Pakete aufgeteilt. Vor dem Assemblieren
müssen eine Reihe von Einstellungen vorgenommen werden, um
die Software an die vorhandene Hardware optimal anzupassen.
Die Frequenztabelle in der Datei rectgen_m8_table.inc
umfasst 1024 Worte für die Umsetzung der
eingestellten Spannung in den CTC-Wert. Die Werte wurden
mit einem Spreadsheet
errechnet und als Include-Text-Datei exportiert. Bei
Änderungen an dieser Tabelle ist zu beachten, dass
die Übergänge zwischen den verschiedenen
Vorteilerwerten in der Routine Convert in der Datei
rectgen_m8_v1.asm ebenfalls an die geänderte
Tabelle angepasst werden müssen (aktuelle Werte:
392, 225, 60 und 3).
Wird die Taktfrequenz (Konstante clock) geändert,
müssen auch die zugehörigen 5-Byte-Konstanten
cDivFx und cDivUx entsprechend angepasst werden, da
bei der automatischen Berechnung Überläufe
auftreten würden.
Die Konstanten cLcdLw und cLcdLn definieren die
angeschlossene LCD.
Die Konstante cLcdMicro definiert das Mikrozeichen auf
der angeschlossenen LCD. Der Default ist auf ein u
eingestellt, da der häufige Wert 0xE4 nicht auf
allen LCDs funktioniert.
Die Konstante cEn stellt die Tausender- und
Dezimaltrennzeichen auf englisches Format um.
Die Anschlussfolge der Schalter Time, Rpm, Inv und
Pulse lässt sich bei der Definition der Ports
umstellen (Konstanten pbTime, pbRpm, pbInv und pbPwm).
Die Schalter dbgon und dbghx dienen dem Debugging. Sie
müssen für ordnungsgemäße Funktion
des Progamms auf Null gesetzt sein.
Der kommentierte Quellcode steht im HTML-Format
und als Assembler-Quellcode gezippt zur Verfügung:
alles in einem Paket
©2006 by http://www.avr-asm-tutorial.net