JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F18326 MCC NCOテスト その1

2024-01-27 18:49:43 | MPLAB X MCC
 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の計算のとおりになりました。

 この計算式を利用すれば、任意の周波数を発生させることができます。
 次回はこれを利用して音楽の演奏をやってみます。

最新の画像もっと見る

コメントを投稿