Forum: Mikrocontroller und Digitale Elektronik Funktionsgenerator, NCO, PIC


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Richard X. (synq1e)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht lesenswert
Richard _. schrieb:
> NCO

Was ist das?

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Endlich mal ein Troll mit guten Umgangsformen.

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
> verfälscht oder ungenau ?

warum sollte.

von Lurchi (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert

von Thomas E. (picalic)


Bewertung
2 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.