Moin moin aus dem sonnigen Norden ;)
Ich habe vor ein sehr schnelles und flexibles Rechtecksignal zu
erzeugen.Da ich relativ neu in der µc welt bin habe ich dazu ein paar
grundlegende Fragen.
Vorab : Ich verwende einen ATxmega128A3
Was will ich machen : Ein rechtecksignal welches eine Periode von 166 µs
haben soll davon 50% high 50% low dazu will ich dieses Signal soweit
skalierbar haben das ich die Periode um 0,1 µs verlängern will ( nicht
verkürzen , 166 µs bleibt die kleinste Periode). Wenn es geht sogar nur
um 50 ns. Die 50/50 Aufteilung soll dabei natürlich beibehalten werden.
Da kamen mir verschiedene Lösungsmöglichkeiten in den Kopf ;
clock/osci auf 32 Mhz
1. Single-slope PWM Generation
2. simpler Counter ( Pin ~82µs HIGH 82µs LOW )
3. Frequency Waveform Generation
Nun meine Fragen dazu; Ist die harte Anforderung mit einem / allen
aufgezählten Lösungen möglich? Wenn nein warum ?
Das Board mit dem Chip liegt leider noch nicht vor mir, ist aber
unterwegs.
Daher kann ich das schwierig testen, würde aber dennoch gerne vorher mir
ein bischen Zeit ersparen und von euren Erfahrungen profitieren ;)
Vlt. gibt es in dieser Hinsicht schon fertige Lösungen (Assambler only)?
Freue mich über jeden konstruktiven Beitrage zu diesem Thema
gruß
Jendrik
@Jendrik (Gast)
>Was will ich machen : Ein rechtecksignal welches eine Periode von 166 µs>haben soll davon 50% high 50% low dazu will ich dieses Signal soweit>skalierbar haben das ich die Periode um 0,1 µs verlängern will ( nicht>verkürzen , 166 µs bleibt die kleinste Periode). Wenn es geht sogar nur>um 50 ns. Die 50/50 Aufteilung soll dabei natürlich beibehalten werden.
Wenn du 50 ns jeweils auf HIGh und LOW aufteilen willst, sind das 25ns,
sprich 40MHz. Damit ist dein ATXmega übertaktet. Bei 100 bzw. 50 ns = 20
MHZ ist alles OK, das kann sogar ein "normaler" AVR.
>1. Single-slope PWM Generation
Genau, CTC Mode + PWM mit 16 Bit Timer.
>2. simpler Counter ( Pin ~82µs HIGH 82µs LOW )>3. Frequency Waveform Generation>Nun meine Fragen dazu; Ist die harte Anforderung mit einem / allen>aufgezählten Lösungen möglich? Wenn nein warum ?
Kenn die X megas nicht so genau.
>Vlt. gibt es in dieser Hinsicht schon fertige Lösungen (Assambler only)?
Die drei Register setzen sollte nicht das Problem sein.
Die Auflösung von 0,1µS erfordert eine Taktfrequenz von 10Mhz. Um auf
166µS zu kommen, brauchst Du einen Timer mit mehr als 8 Bit. Das ist
beides kein problem. Ich empfehle einen ATtiny44.
Du hast aber was von ATxmega128A3 bei 32Mhz geschrieben. Ok, man kann
auch mit Kanonen auf Spatzen schießen.
32Mhz sind da aber ganz blöd. Takte ihn lieber mit 10Mhz, sonst kommst
Du nicht auf ein exaktes 0,1µS Raster.
Stefan Frings schrieb:> 32Mhz sind da aber ganz blöd. Takte ihn lieber mit 10Mhz, sonst kommst> Du nicht auf ein exaktes 0,1µS Raster.
Das Raster ist nicht linear , das ist ein kleines Problem daran ;) im
Grenzbereich liege ich bei einem Wunschtakt von knapp 33 ns ^^ deswegen
die 32 Mhz dieser Takt muss aber nicht erreicht werden. Da ich an die
Hardware gebunden bin will ich nur das best mögliche rausholen (deswegen
assembler ?!)
Dazu noch eine Frage kann ich die interne clock beliebig langsamer und
schneller machen ? oder bin ich da an den prescaler gebunden ?
Jendrik schrieb:> die 32 Mhz dieser Takt muss aber nicht erreicht werden. Da ich an die> Hardware gebunden bin will ich nur das best mögliche rausholen (deswegen> assembler ?!)
Quatsch.
Bei derartigen Zeiten stellt dein Programm sowieso nur noch Werte in
Register ein und überlässt es der Hardware die Frequenz zu erzeugen.
Und ob die die entsprechenden Werte in Assembler oder in sonst
irgendeiner anderen Sprache, die du beherrscht, in die entsprechenden
Register bugsierst, ist völlig wurscht.
Falk Brunner schrieb:> Wenn du 50 ns jeweils auf HIGh und LOW aufteilen willst, sind das 25ns,> sprich 40MHz. Damit ist dein ATXmega übertaktet.
Für den genannten XMEGA kein Problem.
> Nun meine Fragen dazu; Ist die harte Anforderung mit einem / allen> aufgezählten Lösungen möglich? Wenn nein warum ?
50ns sind handlebar mit 20MHz ohne deine genannten Lösungen, bloss
enthält dein ATXmega keinen Teiler für 32->20, das müsste nämlich ein
PLL Teiler sein. Takte ihn also mit 20MHz, dann tut es ein TC0/1.
oki dann noch ne kurze Frage zum PWM-Generator
bei einer auflösung von 16 Bit bdeutet das 2^16 oder wirklich nur 16
abstufungen ? weil laut datasheet die berechnung der möglichen Frequenz
folgendermaßen:
f = (f_clk/prescale)/(PER+1)
und die berechnung der auflösung:
R_res = (log(PER+1)/(log(2))
PER sind die 2-16 Bit
wenn ich für PER nun 2-16 einsetze ist der wert natürlich fürn Po daher
meine schlußfolgerung das PER von 2-2^16 geht, kann mir das jemand
bestätigen? ;)
daraus schlußfolgere ich eruneut das ich um mein Rechtecksignal zu
skalieren ich die 32 MHz fix setze und nur den PER-Wert verändere um
meine gewünschte aufgabe frequenz zu bekommen
Jendrik schrieb:> bei einer auflösung von 16 Bit bdeutet das 2^16 oder wirklich nur 16> abstufungen ?
Du hast 2^16, also 65536 'Stufen' in der PWM. Für einen
Frequenzgenerator ist aber CTC günstiger, beim XMega auch noch in
Verbindung mit dem PER Register der Timer. Für hohe Frequenzen solltest
du dich mal mit der PLL vertraut machen, dann geht nämlich auch mehr als
32 MHz.
Matthias Sch. schrieb:> Für einen> Frequenzgenerator ist aber CTC günstiger,
CTC sagt mir nicht sonderlich viel, tschuldigung , wie gesgat bin
relativ neu in der µC-Welt
Jendrik schrieb:> CTC sagt mir nicht sonderlich viel, tschuldigung , wie gesgat bin> relativ neu in der µC-Welt
Kein Problem. Such einfach mal im Datenblatt zum uC nach diesem Kürzel.
Dort ist die Hardware des uC (die du ja ausreizen willst oder musst)
genau beschrieben...
Mich würde mal interessieren, was dein eigentliches Problem ist.
Wofür brauchst du eine solch feine zeitliche Auflösung?
Viel kann ich nicht sagen da es im Rahmen eines Prototyping läuft und
ich erstmal nur Erfahrungen sammel.
Aber das Signal dient als Trigger-Signal für anderer Hardware damit
gewisse Schaltzeiten eingehalten werden
Eine eigene Frage?
Dieser Thread ist über 13 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.