NCOの使い方 


【NCOとは】 (NCO:Numerical Controlled Oscillator)

F1ファミリには新たに「次世代周辺モジュール」として下記のようなモジュール
が新規に追加されました。

 @ CLC:Configurable Logic Cell
 A CWG:Complementary Waveform Generator
 B NCO:Numerical Controlled Oscillator
 C PWM:Pulse Width Modulation
 D COG:Complementary Output Generator


ここではこの中のNCOについて使い方を説明しています。

【NCOモジュールの内部構成】

NCOモジュールの機能はユニークで、これまでには無かった機能を持っています。
20ビット分解能で周期を設定できるパルスを生成します。NCOの内部構成は下図のようになっています。


NCOが一定周期のパルスを生成する部分は図中央のDDS(Direct Digital Synthesizer)
構成されています。このDDS部の動作を説明します。

加算器では20ビットのアキュミュレータに16ビットの増し分レジスタのデータをNCOクロックとして
設定した速度で繰り返し加算します。
そしてアキュミュレータがオーバーフローしたとき外部に出力が出ます。

したがって、16ビット増し分レジスタの値が小さければなかなかオーバーフローは起きないですから
周期の長いパルス列を生成し、値が大きければ直ぐオーバーフローが発生しますから周期の短い
パルス列を生成します。

このようにして、増し分レジスタの値で出力信号の周期を可変することができます。
加算周期を決めるNCOクロックは、図の左端のマルチプレクサで外部パルス、内蔵クロック、
CLC出力などから選択でき、これが出力周波数のクロックベースとなります。

DDS部から出力されるオーバーフロー信号は、割り込み、他の内蔵モジュールへの入力、
外部パルス出力のいずれかとして使われます。
外部パルス出力の出し方に2種類あり、NxPFMビットにより下図のような2種類のパルス列になります。



@は常にデューティ50%のパルスで、Aはオーバーフローの周期ごとに一定パルス幅の出力を
出すようにしたものです。このパルス幅はプログラム設定で指定します。
 
周波数設定ステップは、2回オーバーフローで1サイクル出力ですから

 クロック周波数÷2の20乗÷2 = クロック周波数÷2,097,152   で一定となります。

このNCOの出力パルスの実力は、例えばクロックにFoscを指定した場合、クロックが16MHzの場合には、
増し分レジスタに0xFFFFを設定したとき最高周波数で500kHzとなり、周波数設定ステップは7.63Hzとなります。

【NCO関連レジスタ】

このNCOの動作モードは下図のレジスタで設定します。設定手順は下記となります。

@ NCOxCONレジスタで出力パルスモードと出力有効化指定をします。

A NCOxCLKレジスタでクロックの選択とパルス幅の設定をします。

B 20ビットのアキュミュレータはNCOxACCU、NCOxACCH、NCOxACCLの3個の
  レジスタで構成されています。これらのレジスタには初期値として値を設定する
  ことができますが、NCOxが停止、つまりNxENが0の間しかできません。

C 増し分レジスタも2個のレジスタで構成されており、このレジスタで周波数を設定します。


【使用例】

実際の使用例として音階を出力した例です。
音階は、ある一定の周波数比率で出力する必要があります。これをPWMモジュールで
出力しようとすると、周波数分解能は8ビットしかありませんから、4桁精度での比率は
無理で、3桁比率でも1オクターブしか出力できません。
また比率の精度も出せませんから音のずれを感じることになります。
しかし、NCOモジュールを使えば、4桁比率で制御したとして、1000、2000、4000、8000、
16000、32000の最大5オクターブまで出力することが可能ですし、分解能も高いですから
高精度に比率で周波数を設定できます。。
元のクロックの周波数を調整できるようにすれば、正確な音階信号として出力すること
ができます。