JH7UBCブログ

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

PIC16F18326 MCC DSMテスト

2024-01-31 12:31:06 | MPLAB X MCC
 PIC16F18326のDSMのテストをします。

 DSMとは、Data Signal Modulatorのことで、データ信号と搬送波(キャリア)を混合(AND)して変調出力を作成する機能のことです。説明書では次の図で説明されています。キャリアはCARHとCARLの2種類で、MOD信号がHの時、CARHが出力され、MOD信号がLの時、CARLが出力されます。


 DSMモジュールを簡単に表現すると下の図のようになります。(本当は論理回路で示すべきですが、スイッチで簡略化しました)
 MOD信号がHighの時CARHがDSMoutに出力され、MOD信号がLowの時、CARLがDSMoutに出力されます。
 CARH,CARL,MODについては、下の図の項目から選択することができます。



 さて、DSMのテストで最初に思い浮かんだのが、アマチュア無線家としては、CW通信(モールス通信)でした。搬送波に信号波で変調をかける、まさにCW信号です。

 そこで、モールス練習機を作ってみることにしました。電鍵(キー)を押したときにピーという音が聞こえるようにします。周波数は800Hzとします。この信号はNCOで発生させてCARLとし、MODがLの時に出力します。CARHはVSSとして,MODがHの時は何も出力しません。

 モールス練習機の回路図です。

 DSMの出力は、RC3としてスピーカーを接続します。電鍵はRA4に接続し、RA4はウィークプルアップし、プルアップ抵抗はつけません。

 MPLAB X でprojectを作成し、MCCを立ち上げます。systemモジュールです。デフォルトの状態で、クロックは1MHzです。


 NCOモジュールとDSMモジュールを導入し設定します。
 NCOモジュールは、周波数を800Hzとしました。

 DSMモジュールです。High CarrierはVSS,Low CarrierはNCO1_outに設定します。また、Modulation SourceはMDMIN_pinに設定します。


 Pinモジュールです。
 DSM outuputはRC4に設定します。MDMIN inputはRA4に設定し、ウィークプルアップWPUにチェックを入れます。


 電鍵(KEY)をON/OFFして、モールス符号Vを送出してみました。
 その時のDSM outの波形です。

 800HzのキャリアがKEYの信号で変調され、モールス符号として送出されました。
 プログラムです。MCCの設定以外はプログラム上には何も書いていません。
----------------------------------------------
#include "mcc_generated_files/mcc.h"

void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     while (1)
    {
    }
}
----------------------------------------------

 ブレッドボードにスピーカーと電鍵をつけてテストをしています。

 音が大きいので、出力に直列に100Ωの抵抗を入れています。

 下の写真は、10年前に製作したモールス練習機です。製作記事は、こちら
 ランド方式電で製作し、ツインT回路とNJM386アンプの2つの基板で構成されています。これらが、1個のPICでできるわけですからすごいですね。



PIC16F18326 MCC NCOテスト その2

2024-01-28 19:06:01 | MPLAB X MCC
 引き続き、PIC16F18326のNOCのテストをします。

 今回は、任意の周波数を発生させ、NOC出力(RC3に設定しました)にスピーカーを接続して音として聞くことにより、様々な効果音やメロディーを奏でてみることにします。

 回路図です。ICSPでプログラムを書き込みます。PICは、けっこう力持ちでこのままだとかなり大きな音が出ます。音が大きすぎるときには直列に100Ω程度の抵抗を入れると聞きやすくなります。


 まず、救急車のピーポー音を出してみます。
 MCCの設定は、前の記事と同じです。
 systemモジュールです。


 NCO1モジュールです。


 ピーポー音は、ピーの音(960Hz)0.65秒、ポーの音(770Hz)0.62秒の繰り返しです。予めNCOモジュールで、周波数に対するレジスタの設定値を調べておきます。
 NCOの出力周波数を決定するのは、NCO1INCU,NCO1INCH,NCO1INCLレジスタ(各8bit)の値で、NCO1INCU = 0x0で、周波数ごとの各レジスタの値は
周波数  NCO1INCH    NCO1INCL
960Hz    0x1    0xF7
770Hz    0x1    0x94
です。
プログラムです。NCO1INCUは設定していませんが、デフォルトで0x0です。
-----------------------------------------
#include "mcc_generated_files/mcc.h"

void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     NCO1CONbits.N1EN = 1;//NCO1スタート
     NCO1INCH = 0x1;
     while (1)
    {
         NCO1INCL = 0xF7;//ピーの音 960Hz
         __delay_ms(650);
         NCO1INCL = 0x94;//ポーの音 770Hz
         __delay_ms(650);
   }
}
-----------------------------------------
 レジスタへの設定は、NCO1INCH,NCO1INCLの順に行います。

 はい、ピーポーピーポーと聞こえました。

 では、次にドレミソラシドの音階を出してみましょう。各音階(周波数)とレジスタの設定値は次のとおりです。(NCOINCUは0x0です)
 音階(周波数) NCO1INCH NCO1INCL
 ド(262Hz)   0x00    0x89
 レ(294Hz)   0x00    0x9A
 ミ(330Hz)   0x00    0xAC
ファ(349Hz)   0x00    0xB7
 ソ(392Hz)   0x00    0xCE
 ラ(440Hz)   0x00    0xE7
 シ(494Hz)   0x01    0x03
 ド(523Hz)   0x01    0x12
 
ドレミファソラシドを繰り返すプログラムです。
--------------------------------------------------------------------
/*
 * PIC16F18326 MCC NCO test
 * 2024.1.28
 * JH7UBC Keiji Hata
*/
#include "mcc_generated_files/mcc.h"

void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     NCO1CONbits.N1EN = 0;//NCO1ストップ
     NCO1INCH = 0x1;
     while (1)
    {
         NCO1CONbits.N1EN = 1;//NCO1スタート
         NCO1INCH = 0x0;
         NCO1INCL = 0x89;//ドの音 262Hz
         __delay_ms(1000);
         NCO1INCL = 0x9A;//レの音 294Hz
         __delay_ms(1000);
         NCO1INCL = 0xAC;//ミの音 330Hz
         __delay_ms(1000);
         NCO1INCL = 0xB7;//ファの音 349Hz
         __delay_ms(1000);
         NCO1INCL = 0xCE;//ソの音 392Hz
         __delay_ms(1000);
          NCO1INCL = 0xE7;//ラの音 440Hz
         __delay_ms(1000);
         NCO1INCH = 0x1;//シの音 494Hz
         NCO1INCL = 0x03;
         __delay_ms(1000);
          NCO1INCL = 0x12;//ドの音 523Hz
         __delay_ms(1000);
         NCO1CONbits.N1EN = 0;//NCO1ストップ
         __delay_ms(1000);
    }
}
--------------------------------------------------------------------
 この音階を利用すれば、メロディーを奏でることができますね。


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の計算のとおりになりました。

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

PIC16F18326 MCC DACテスト

2024-01-26 07:31:36 | MPLAB X MCC
 PIC16F18326のDACのテストをします。
 環境は、MPLAB X(v6.15) XC8(v2.45) MCC(v5.3.7)です。 

 回路図です。RA0がDACの出力ですので、ICSPが使えません。


 MPLAB Xでprojectを作り、MCCを立ち上げます。
 まず、systemモジュールでクロックを設定します。4MHzとしました。


 DACモジュールを導入します。デフォルトのままで特に設定はしません。
 Positive Reference はVDD、Negative ReferenceはVSSです。



 Pinモジュールです。DAC1OUTはRA0にだけ設定できます。



 DAC1OUTのDirectionがinputとなっているのですが、これでAnalog出力になります。

 Generateして、main.cを編集します。
 鋸歯状波を出力してみます。
 プログラムです。
--------------------------------------------------------
/*
 * PIC16F18326 MCC DAC test
 * 2024.1.24
 * JH7UBC Keiji Hata
*/

#include "mcc_generated_files/mcc.h"

void main(void)
{
     // initialize the device
     SYSTEM_Initialize();
     while (1)
    {
         for(uint8_t i = 0;i<32;i++){
              DAC1_SetOutput(i);
         }
    }
}
--------------------------------------------------------

 DAC1_SetOutput(uint8_t data);関数でDACの出力が決まります。
 PIC16F18326のDACは、5bitですので、dataは0から31の間の値を入れます。Positive Referenceは、VDDのほかFVR(Fixed Voltage Reference)や外部からの電圧も使えます。

 DAC1OUTの出力波形です。ギザギザのある鋸歯状波が出力されました。



 DAC1OUTの出力は、電流が取れませんので、実際に利用する場合は、オペアンプなどのバッファが必要です。


ARDUINO R3とR4の比較

2024-01-25 07:51:35 | Arduino
 ARDUINO UNO R3とR4の比較をしてみましょう。
 まず、外見です。左がR3、右がR4(WIFI)です。


            R3            R4
Microcontroller   ATmega328P  Renesas RA4M1 (Arm® Cortex®-M4)
          (8bit)      (32bit)
Clock speed    16MHz      48MHz
Flash Memory   32 KB      256 kB
SRAM       2 KB      32 kB
EEPROM      1 KB         8KB
Digital I/O Pins   14        14
Analog Input Pins  6(10bit ADC)   6(14bit ADC)
DAC        -        1(12bit)
PWM        6        6
UART       1        1
I2C        1        1
SPI        1        1
CAN        -         1
Operating Voltage  5V       5V
Input Voltage  7-12V(limit 6-20V) 6-24 V
DC Current per I/O Pin  20 mA      8 mA
USB port    Type B       Type C
Size     68.6 mm×53.4 mm         68.85 mm×53.34 mm

R4 WIFIには、WiFiとBluetooth機能が付加されます。

プロセッサとメモリは、大幅に強化されています。
他の機能は、R3との互換性を考えられて同じ程度にしています。