Forum: Mikrocontroller und Digitale Elektronik Funktionsgenerator, NCO, PIC


von Richard X. (synq1e)


Lesenswert?

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 :)

von AVRler (Gast)


Lesenswert?

Richard _. schrieb:
> NCO

Was ist das?

von Volker S. (vloki)


Lesenswert?

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.

von Gästchen (Gast)


Lesenswert?

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

von Richard X. (synq1e)


Lesenswert?

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.

von Thomas E. (picalic)


Lesenswert?

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
von Gästchen (Gast)


Lesenswert?

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.

von Richard X. (synq1e)


Angehängte Dateien:

Lesenswert?

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.

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Richard X. (synq1e)


Lesenswert?

(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· 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

von Richard X. (synq1e)


Angehängte Dateien:

Lesenswert?

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 ?

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


Lesenswert?

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.

von Richard X. (synq1e)


Lesenswert?

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

von TROLL (Gast)


Lesenswert?

Der erste Post in diesem Jahr in diesem Forum!!!!
Und er kommt von einem Troll :-P

Vielen dank für eure Aufmerksamkeit!

von Christian S. (roehrenvorheizer)


Lesenswert?

Endlich mal ein Troll mit guten Umgangsformen.

von Thomas E. (picalic)


Lesenswert?

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.

von Richard X. (synq1e)


Lesenswert?

(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· 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 ?

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


Lesenswert?

> verfälscht oder ungenau ?

warum sollte.

von Lurchi (Gast)


Lesenswert?

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.

von Richard X. (synq1e)


Lesenswert?

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?

von Thomas E. (picalic)


Lesenswert?

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
von Richard X. (synq1e)


Lesenswert?

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 
?

von skorpionx (Gast)


Lesenswert?


von Thomas E. (picalic)


Lesenswert?

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
Noch kein Account? Hier anmelden.