PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenzgenerator- Allgemeine Fragen zur Frequenz usw



nase
05.05.2009, 18:40
Bin Anfänger im Programmieren des Atmega 32, habe dennoch versucht einen Frequenzgenerator zu Basteln bei dem ich die Frequenz mit einer möglichst hohen Bandbreite einstellen kann.Es ist mir auch soweit gelungen

Kann auch die Frequenz einstellen im Bereich von ca 5 Herz bis 25Khz
allerdings ist der Einstellbereich nicht Linear, hat da jemand einen besseren Vorschlag oder einen Hinweis wo man nachschlagen kann.
Dann ist da noch die obere Maximale Frequenz von ca 25 Khz kann ich die höher bekommen ?
Ich benutze einen 8 Mhz Quarz

mfg Nase

Folgender Bascon Code:


__________________________________________________ __________________

' Frequenzgenerator 1 E

'Led 1(grün) Blinkt im Takt
'ca im Sekunden Takt, mit Taste 1 kann Frequenz erhöht werden und mit Taste 2
' verringert werden

'--------------------- Allgemeine Prozessor Konfiguration ---------------------

$baud = 9600 'Rs232 Datenüberagungsrate
$regfile "m32def.dat" 'Definiert den Atmega als Atmega 32
$crystal = 8000000 'Gibt die Quarzfrequenz an in Herz
'-----------------------------------------------------------------------------
' Variablen definieren
Dim Wert1 As Word
Dim A As Long 'Schrittweite zum Aufwärts-Zählen

Ddra = &B0011111 ' Port A0 bis A7 als Ausgänge setzen für Leds
Ddrb = &B00000000 ' Port B komplett als Eingänge setzen für Taster
Portb = &B00011110 ' Port B1-B2-B3-B4 PullUp aktivieren für Taster

'-----------------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 8
'Bestimmt das Timer 1 verwendet und teilt den Takt durch 8

Enable Timer1 'Startet Timer 1
On Timer1 Test 'springt bei Überlauf nach " Test"

Enable Interrupts 'Interrupt aktivieren

'------------------------------------------------------------------------------
' Konfiguration fürs Display
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.6 , Db7 = Portc.7 , Rs = Portc.5 , E = Portc.4

'______________________ H a u p t p r o g r a m m ____________________________
A = 100 ' Vorgabewert für Schrittweite bei Aufwärts zählen


Do

'Hier wird über Tasten 1 und 2 der Wert für die Voreinstellung des Timers
' geändert
If Pinb.0 = 1 Then Waitms 20
If Pinb.0 = 1 Then Wert1 = Wert1 + A


Waitms 20
If Pinb.1 = 0 Then Waitms 20
If Pinb.1 = 0 Then Decr Wert1



Cls
Locate 1 , 1
Lcd Wert1 ; "Voreinst."


Loop

'_____________________ H a u p t p r o g r a m m - E n d e ____________________

Test: 'Sprungmarke zu der gesprungen wird wenn der Timer einen Überlauf hat
Timer1 = Wert1 'Timer soll ab (Wert aus Wert1) hochzählen
Toggle Porta.0
'Port A.0 bei jeden Überlauf umschalten
Return
_________________ Ende ________________________________________

Code-Tags verwenden, Kollege ! (PicNick, Mod)

TomEdl
05.05.2009, 20:36
Hallo!



allerdings ist der Einstellbereich nicht Linear, hat da jemand einen besseren Vorschlag oder einen Hinweis wo man nachschlagen kann.
Dann ist da noch die obere Maximale Frequenz von ca 25 Khz kann ich die höher bekommen ?

Beide Probleme haben mit dem Timer zu tun.

Beginnen wir bei der Problemlösung also bei der Berechung des Timers:
Die Zeit für einen Zählschritt beträgt
Quarzfrequenz / Prescale = 8 MHz / 64 = 125000 Hz - also alle 0.008 ms
Die Dauer, die der Timer insgesamt benötigt bis die 65536 Schritte voll gezählt sind beträgt: 0.008 ms x 65536 = 0.524288 Sekunden.
Nach 0.524288 Sekunden wird also deine Unterroutine aufgerufen. Um eine höhere Frequenz einzustellen, verkürzt du den Zählbereich deines Timers durch die Vorgabe eines größeren Startwertes als 0.

Allerdings erfolgt beim inkrementieren des Startwertes die Zeit, die für einen Zählvorgang benötigt wird, keine lineare Änderung. Ich habe das mal in diesem Diagramm veranschaulicht:
http://img25.imageshack.us/img25/7050/unbenannt1k.gif

Überleg dir jetzt mal einen Lösungsansatz für diese Problematik, ich hab grad keine Zeit mehr. Wenn du keinen findest, gehen ich weiter darauf ein.

Grüße
Thomas

Besserwessi
05.05.2009, 20:44
So ein Rechtecksignal, erzeugt man besser mit hilfe der Hardware. der 16 Bit Timer 1 hat z.B, einen CTC modus und kann das Frequenzerzeugen vollständig in Hardware machen man muß nur noch den Teilerfaktor ins passende Register schreiben und ggf. für ganz niedriege Frequenzen den Vorteiler einstellen.

nase
06.05.2009, 17:19
Hallo Thomas

Startwert fängt ja bei 0 an und läßt sich bis 65536 erhöhen, allerdings wird die Frequenz nicht größer wenn ich den Startwert verringere sonder kleiner , weil je höher der Startwert umso schneller wird ja der Überlauf erreicht und umso größer die Frequenz

gruß nase

nase
06.05.2009, 17:23
So ein Rechtecksignal, erzeugt man besser mit hilfe der Hardware. der 16 Bit Timer 1 hat z.B, einen CTC modus und kann das Frequenzerzeugen vollständig in Hardware machen man muß nur noch den Teilerfaktor ins passende Register schreiben und ggf. für ganz niedriege Frequenzen den Vorteiler einstellen.

Das mit der Hardware versteh ich nicht , was heißt CTC Modus ?

Gruß Nase

Besserwessi
06.05.2009, 17:45
Die 16 Bit timer und zum Teil auch die 8 Bit Timer haben einen Modus wo man angeben kann wie weit der Timer zählt. Danach fängt er dann wieder bei 0 an. Zur Erklärung siehe hier:
https://www.roboternetz.de/wissen/index.php/Timer/Counter_(Avr)

Zusammen mit der Möglichkeit auch die Ausgabe von der Hardware machen zu lassen, geht die Frequenzerzeugung dann gang im Hintergrund, ohne Interrupt.