Hallo, ich wollte einen Funktionsgenerator bauen, und habe mir dazu überlegt den NCO eines PIC's zu nutzen. Ich habe leider nur einen PIC16F1509 -> http://ww1.microchip.com/downloads/en/DeviceDoc/41609A.pdf sehe ich das richtig dass ich den Takt zum NCO nur mit dem Internen osc. (16Mhz) geteilt zuführen kann ? nur sehe ich im datenblatt das dieser eine ungenauigkeit von 4.5% bei 0-60C° aufweist (HFINTOSC FREQUENCY ACCURACY OVER V DD AND TEMPERATURE) und ich sehe keine möglichkeit wenn ich z.B einen quarz als taktquelle (genauer) verwende, diesen zu teilen und dann dem NCO zuzuführen , was mich ehrlich gesagt überrascht. mit AVR's ginge das immer :)
Richard _. schrieb: > sehe ich das richtig dass ich den Takt zum NCO nur mit dem Internen osc. > (16Mhz) geteilt zuführen kann Wo im Datenblatt siehst du das genau? Figure 25-1 und Kapitel 25.1.1 führen da doch viel mehr Möglichkeiten auf.
Richard _. schrieb: > sehe ich das richtig dass ich den Takt zum NCO nur mit dem Internen osc. > (16Mhz) geteilt zuführen kann ? nur sehe ich im datenblatt das dieser > eine ungenauigkeit von 4.5% bei 0-60C° aufweist (HFINTOSC FREQUENCY > ACCURACY OVER V DD AND TEMPERATURE) Ich sehe auf FIGURE 25-1 Dass man da alles mögliche draufschalten kann, inklusive einem NCO1CLK-Pin, der sich anbieten würde, um da einen Qarzoszillator dranzuklemmen. Einstellen tut man das mit: NCxCKS. Zur Auswahl stehen: - NCO1CLK - LC1OUT - FOSC - HFINTOSC
danke für die antworten, mir ist bewusst dass das NCO mit diesen Taktquellen arbeitet, nur mich interessiert wie ich den Input-Clock geteilt zuführen kann, um eine höhere frequenzauflösung zu erreichen denn: http://ww1.microchip.com/downloads/en/AppNotes/90003131A.pdf laut EQUATION 1: NCO ACCUMULATOR OVERFLOW FREQUENCY F_Overflow = NCO_CLOCK * Increment Val _______________________ 2^20 (Akkumulator-Overflow-Value) was zugleich die ausgangsfrequenz des NCO bedeutet, bei einem NCO_CLOCK von z.B 20 Mhz ergibt sich eine frequenzauflösung von ~19.0734 Hz (20e6 / 2^20) bei einem NCO_CLOCK von nur 20kHz = 0.019073486 Hz um möglichst hohe bandbreite und auflösung zu erzielen ohne den ungenauen internen oszillator zu verwenden. anscheinend muss ich einen timer heranziehen und den NCO mit dem NCO1CLK-Pin takten, um den quarz-takt zu teilen. bitte korrigiert mich falls ich mich irre.
Richard _. schrieb: > bei einem NCO_CLOCK von nur 20kHz = 0.019073486 Hz Hmmm - bei 20kHz Takt liegen die Flanken des Ausgangssignals aber auch auf einem recht groben Raster von 50µs - wenn dieser "Jitter" für die Anwendung keine Rolle spielt... Richard _. schrieb: > anscheinend muss ich einen timer heranziehen und den NCO mit dem > NCO1CLK-Pin takten, um den quarz-takt zu teilen. Den externen Pin müsste man nicht benutzen, wenn man das CLC1-Modul als Taktquelle einstellt. Das CLC-Modul lässt sich z.B. von einem PWMOUT ansteuern. Vielleicht könnte man aber auch gleich die CLCs direkt als Teiler einsetzen - mit den 4 CLCs des PIC16F1509 käme man immerhin schon mal auf 1/16.
:
Bearbeitet durch User
Man könnte auch einen PIC mit Referenzoszillator nehmen. Wie einen PIC32MX470. Sicher, der ist unnötig fett, aber damit Richard _. schrieb: > danke für die antworten, > > mir ist bewusst dass das NCO mit diesen Taktquellen arbeitet, nur mich > interessiert wie ich den Input-Clock geteilt zuführen kann, um eine > höhere frequenzauflösung zu erreichen denn: > > http://ww1.microchip.com/downloads/en/AppNotes/90003131A.pdf > > laut EQUATION 1: > > NCO ACCUMULATOR OVERFLOW FREQUENCY > > F_Overflow = NCO_CLOCK * Increment Val > _______________________ > 2^20 (Akkumulator-Overflow-Value) > > was zugleich die ausgangsfrequenz des NCO bedeutet, > > bei einem NCO_CLOCK von z.B 20 Mhz ergibt sich eine frequenzauflösung > von ~19.0734 Hz (20e6 / 2^20) > > bei einem NCO_CLOCK von nur 20kHz = 0.019073486 Hz > > um möglichst hohe bandbreite und auflösung zu erzielen ohne den > ungenauen internen oszillator zu verwenden. > anscheinend muss ich einen timer heranziehen und den NCO mit dem > NCO1CLK-Pin takten, um den quarz-takt zu teilen. > > bitte korrigiert mich falls ich mich irre. Ach so, du willst also tiefe Freuqenzen genauer erzeugen können, und dazu den Eingangstakt herunterteilen, habe ich das richtig verstanden? Denn aus 20kHz kannst du ja keine z.B. 1MHz erzeugen. Wie wärs dann damit: Du speist deinen Quarzoszillator in einen Timer, und schleust dessen Ausgangssignal über einen Pin in den NCO-Eingang. Hab jetzt nicht geprüft, ob das WIRKLICH geht, sehe aber so jetzt so mal kein Hindernis. Dein PIC hat Timer mit Eingängen. Du kannst das Clocksignal auch extern Muxen (d.h. zwischen Timer Out und Oszillator umschalten) damit du den Clock ungeteilt verwenden kannst. Das wäre dann ein zusätziches externes Gatter.
Thomas E. schrieb: > Den externen Pin müsste man nicht benutzen, wenn man das CLC1-Modul als > Taktquelle einstellt. Das CLC-Modul lässt sich z.B. von einem PWMOUT > ansteuern. Vielleicht könnte man aber auch gleich die CLCs direkt als > Teiler einsetzen - mit den 4 CLCs des PIC16F1509 käme man immerhin schon > mal auf 1/16. Ja am liebsten würde ich den quarztakt (hab einen 20MHz quarz genommen) teilen, das CLC modul hab ich noch nie verwendet. bin gerade dabei mich zu informieren wie es funktionieren sollte das als Taktteiler zu konfigurieren , habe nur diese Appnote gefunden die auf Seite 10 kurz einen "FREQUENCY DIVIDER" beschreibt, wie das ganze funktioniert versteh ich aber noch nicht ganz.
Die Konfiguration geht mit dem CLC-Designer sehr einfach. Und Mann kann die Konfiguration zur Laufzeit durch neue Parametersaetze aendern. Fuer: NCOCLOCK = Fosc: Den Takt in der CLC1 durchreichen.
1 | BANKSEL CLC1GLS0 |
2 | movlw H'02' |
3 | movwf CLC1GLS0 |
4 | movlw H'00' |
5 | movwf CLC1GLS1 |
6 | movlw H'00' |
7 | movwf CLC1GLS2 |
8 | movlw H'00' |
9 | movwf CLC1GLS3 |
10 | movlw H'04' |
11 | movwf CLC1SEL0 |
12 | movlw H'00' |
13 | movwf CLC1SEL1 |
14 | movlw H'02' |
15 | movwf CLC1POL |
16 | movlw H'80' |
17 | movwf CLC1CON |
NCOCLOCK = Fosc/2 Mit dem JK-FF Fosc durch 2 teilen.
1 | BANKSEL CLC1GLS0 |
2 | movlw H'02' |
3 | movwf CLC1GLS0 |
4 | movlw H'00' |
5 | movwf CLC1GLS1 |
6 | movlw H'00' |
7 | movwf CLC1GLS2 |
8 | movlw H'00' |
9 | movwf CLC1GLS3 |
10 | movlw H'04' |
11 | movwf CLC1SEL0 |
12 | movlw H'00' |
13 | movwf CLC1SEL1 |
14 | movlw H'0A' |
15 | movwf CLC1POL |
16 | movlw H'86' |
17 | movwf CLC1CON |
Wie es weitergeht, darauf solltest Du nun selber kommen.
(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· schrieb im Beitrag #4846206: > Die Konfiguration geht mit dem CLC-Designer sehr einfach. > woher hast du den ? ich hab im netz nichts gefunden , ich hab nur ein plugin für MPLABX das nennt sich MCC (MPLAB® Code Configurator) der macht das auch über eine GUI sieht aber ein bisschen anders aus. > > NCOCLOCK = Fosc: Den Takt in der CLC1 durchreichen. > warum hast du 2 blöcke gebraucht für einmal Durch 2 teilen ? ich dachte es geht mit nur einem block
bei der app-note von microchip wird der frequenz-teiler beschrieben wie in diesem bild. bei dem bild wundere ich mich deswegen weil die eingänge des D-flops jeweils einmal CLC4IN und CLC4OUT sind wie kann das funktionieren wenn die eingänge von zelle 4: zelle 4 eingang und zelle 4 ausgang ist. ich kann die eingänge der gates ein und ausschalten (gekennzeichnet durch das X) und zusätzlich negiert zuführen und ausgeben. korrigiert mich falls ich mich irre. ich verstehe dieses D-Flop echt ned , gibt es da nicht eine einfache wahrheitstabelle wie bei AND und OR ? habe nichts gefunden. und was ist der eingang gekennzeichnet mit V ?
Es ist der selbe Block. Einmal reicht er Fosc an den NCO durch. Einmal teilt er ihn durch 2. Wenn Du mit einem D-FF nichts anfangen kannst, solltest Du Dich vllt erst mit den Grundlagen befassen. Das JK-FF ist da noch uepler. Es braucht aber keine Rueckfuehrungen des Ausgangs.
warum aus dem datenblatt des PIC stehen nur diese clocks zur verfügung: • HFINTOSC • F OSC • LC1_out • CLKIN pin (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· schrieb im Beitrag #4847022: > Einmal reicht er Fosc an den NCO durch. warum überhaupt durchreichen, ich habe gedacht einfach den ausgang des CLC1 nehmen -> LC1_out. Fosc steht sowieso grundsätzlich zur auswahl des NCO
Der erste Post in diesem Jahr in diesem Forum!!!! Und er kommt von einem Troll :-P Vielen dank für eure Aufmerksamkeit!
Richard _. schrieb: > aus dem datenblatt des PIC stehen nur diese clocks zur verfügung: > > • HFINTOSC > • F OSC > • LC1_out > • CLKIN pin Deshalb nimmst Du dann LC1_out - jetzt musst Du nur noch dafür sorgen, daß am Ausgang des LC1-Moduls (nicht unbedingt am entsprechenden Pin des PICs!) Deine gewünschte Taktfrequenz 'rauskommt. Richard _. schrieb: > warum überhaupt durchreichen, ich habe gedacht einfach den ausgang des > CLC1 nehmen -> LC1_out. Aber am CLC-Modul stehen viel mehr Auswahlmöglichkeiten an dessen Eingängen zur Verfügung, als die o.g. 4 Clockmöglichkeiten des NCOs. Natürlich macht es keinen Sinn, über CLC1 den F_OSC zum NCO durchzureichen, aber wenn Du z.B. einen PWM-Ausgang durchreichst, hast Du den Ausgang des PWM-Moduls als Clock-Source am NCO.
(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· schrieb im Beitrag #4847022: > Das JK-FF ist da noch uepler. > Es braucht aber keine Rueckfuehrungen des Ausgangs. Habs geschafft mit deinem beschriebenen JK-Flip flop , weiss zwar ned wie es funktioniert ^^ aber hab meinen quarz-clock von 20mhz über clc auf den pin ausgegeben und 10Mhz gemessen. danke dir nochmal. noch eine frage: wird mit dieser CLC beschaltung intern beim µC der Quarzoszillator-takt in irgendeiner form verfälscht oder ungenau ?
Der NCO ist von relativ begrenztem nutzen für einen Funktionsgenerator. Bestenfalls hat man damit einen Rechtecktakt, der so wie ich es oben verstanden habe in etwa 20 Hz Stufen einzustellen ist und einen deutlichen Jitter vom Taktraster hat. Für einen Funktionsgenerator will man eher schon einen DDS Generator - der ist zwar verwandt, erzeugt aber einen Sinus mit vergleichsweise wenig Jitter.
Lurchi schrieb: > deutlichen Jitter vom Taktraster hat. sorry ich weiss leider nicht was du meinst, jitter = abweichung, aber wie erklärst du diesen in diesem Fall?
Richard _. schrieb: >> deutlichen Jitter vom Taktraster hat. > > sorry ich weiss leider nicht was du meinst, > jitter = abweichung, aber wie erklärst du diesen in diesem Fall? Was denkst Du, was aus Deinem NCO herauskommt, wenn Du ihn mit 20 kHz taktest und ihn auf die Ausgabe eines 1.1kHz Signal einstellst? Es wäre schön, wenn da ein Rechteck mit 909,1 µs Periodendauer und 454,55 µs pro Halbwelle 'rauskommen würde, aber so funktioniert das leider nicht - die Halbwellen werden meistens 450 µs lang sein und ab und zu mal eine mit 500µs dazwischen, so daß sich im Mittel die gewünschte Frequenz ergibt.
:
Bearbeitet durch User
Thomas E. schrieb: > Was denkst Du, was aus Deinem NCO herauskommt, wenn Du ihn mit 20 kHz > taktest und ihn auf die Ausgabe eines 1.1kHz Signal einstellst? Es wäre > schön, wenn da ein Rechteck mit 909,1 µs Periodendauer und 454,55 µs pro > Halbwelle 'rauskommen würde, aber so funktioniert das leider nicht - die > Halbwellen werden meistens 450 µs lang sein und ab und zu mal eine mit > 500µs dazwischen, so daß sich im Mittel die gewünschte Frequenz ergibt. warum sollte das so sein? kannst du mir das genauer erklären , wäre dir dankbar. d.h. je niedriger die eingangsfrequenz des NCO , desto größer der jitter ?
Richard _. schrieb: > warum sollte das so sein? kannst du mir das genauer erklären , wäre dir > dankbar. Die Funktionsweise des NCO ist im Datenblatt erklärt! Es ist gibt dort keinen VCO o.ä., der über eine PLL auf die gewünschte Frequenz eingestellt wird, sondern er besteht aus einem Register (Akku), bei dem bei jedem Eingangs-Taktimpuls der Inhalt eines anderen Registers (Increment Value) draufaddiert wird. Bei Überlauf des Akkus wird der Ausgang getoggelt. Die Flanken des Ausgangsignals liegen deshalb auf dem Zeitraster des Eingangstakts und können nicht zu beliebigen Zeitpunkten auftreten. Bei 20kHz Takt kann sich am Ausgang also nur alle N*50µs etwas bewegen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.