PIC16F18326のNOCのテストをします。
環境は、MPLAB X(v6.15) XC8(v2.45) MCC(v5.3.7)です。
NCO(Numerically Controlled Oscillator 数値制御発振器)とは、数値で周期を設定できるパルス発生器で、2つのモードがあります。
下の図のように、デューティ比が一定で周波数を変化させられる固定デューティモード(FDC)とパルス幅一定で周波数を変化させられるパルス周波数モード(PFM)モードです。
それぞれのモードの信号を発生させてみることにします。
NCOの詳しい説明は省略します。詳細は、こちらのサイトをご覧ください。
MPLAB Xでprojectを作成し、MCCを立ち上げます。
まず、systemモジュールでクロック周波数を設定します。
今回はデフォルトの状態で、1MHzとしました。
NCOモジュールを導入し、出力先を設定します。出力は、RA3を除くすべてのI/Oポートに設定できます。今回は、RC3に設定しました。
NCOモジュールで、モードと周波数を設定します。
まず、FDCモードで周波数を1KHzに設定します。(デフォルトの状態です)
この状態でGenerateします。
main.cは次のように生成されます。(プログラム上にはNCOについては何も書かれていません)
-----------------------------------------------------
#include "mcc_generated_files/mcc.h"
void main(void)
{
// initialize the device
SYSTEM_Initialize();
while (1)
{
}
}
-----------------------------------------------------
buildして書き込んでみます。
RC3に自作の周波数カウンタを接続して周波数を測定してみました。(この周波数カウンタの製作記事はこちら)
1002Hzでした。(プログラム上の計算値は999Hzです)誤差5%以内とけっこう優秀です。
波形を見てみましょう。
確かにデューティ比50%の波形です。
では、次にPFMモードで1KHzの信号を発生させてみます。
NCOモジュールで、モードをPFMに、パルス幅を64クロックとしてみました。
出力波形を見てみます。
周波数1KHzでパルス幅が一定の波形が観測できました。
では、NCOの周波数を変えるのにはどうしたらよいでしょうか。
簡単に行うには、NCOモジュールのNCO Output Frequencyに周波数を記入すればよく、必要な計算とレジスタへのセッティングは自動的に行われます。
NCOモジュールでRegistersの値を見ると
NCO1INCH = 0x2
NCO1INCL = 0xC
NCO1INCU = 0x0
と計算されています。
この値を検証してみます。
今回、NCOのクロックには、HFINTOSC=4MHzを使っています。
確かに、NCOの計算のとおりになりました。
この計算式を利用すれば、任意の周波数を発生させることができます。
次回はこれを利用して音楽の演奏をやってみます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます