PIC16F18346の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
DATA SIGNAL MODULATOR (DSM)
2020-10-1

16F18325 には、DATA SIGNAL MODULATOR (DSM)があり、情報信号に搬送波を混合して変調出力を生成できます。DSM モジュールに供給する搬送波信号と情報信号は、デバイス内部の周辺モジュールの出力を使うか、入力ピンからの外部信号を選べます。
変調出力信号は、搬送波信号と情報信号の論理和(AND)で、MDOUT ピンから出力されます。
搬送波信号は、2 つの独立した信号である搬送波High (CARH) 信号と搬送波Low (CARL)信号から構成され、情報信号(MOD) が論理High 状態にある間、DSM は搬送波High 信号を出力し、情報信号(MOD) が論理Low 状態にある間、DSM は搬送波Low 信号を出力します。

DSMに関連するレジスター一覧を下表に示します。

*注意*
DSM出力とDSMpin入力は、PPS機能でピンを指定します。PPS指定例を示します。

PPS機能で、入出力pinを指定
MDCIN1PPS = 0x00; // 搬送波入力 1 を RA0 に指定
MDCIN2PPS = 0x01; // 搬送波入力 2 を RA1 に指定
MDMINPPS = 0x02; // 情報信号入力を RA2 に指定
RC3PPS = 31; // DSM出力を RC3 に指定
レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
MDCON MDEN - - MDOPOL MDOUT - - MDBIT
MDSRC - - - - MDMS<3:0>
MDCARH - MDCHPOL MDCHSYNC - MDCH<3:0>
MDCARL - MDCLPOL MDCLSYNC - MDCL<3:0>
レジスタ BIT 説明 1 0
MDCON 7 MDEN DSMモジュールのOn/Off ON OFF
4 MDOPOL 出力極性 負論理 正論理
3 MDOUT (Read Only)DSM出力 1 0
0 MDBIT MDBIT 1 0
MDSRC <3:0> MDMS 情報信号選択 表1参照
MDCARH 6 MDCHPOL 搬送波Highの極性 反転する 反転せず
5 MDCHSYNC 搬送波同期 同期 同期せず
<3:0> MDCH 搬送波High入力選択 表2参照
MDCARL 6 MDCLPOL 搬送波Lowの極性 反転する 反転せず
5 MDCLSYNC 搬送波同期 同期 同期せず
<3:0> MDCL 搬送波Low入力選択 表2参照
表1 情報信号入力選択 MDMS<3:0>
1111 = CLC4 出力 0111 = C2 出力
1110 = CLC3 出力 0110 = C1 出力
1101 = CLC2 出力 0101 = PWM6 出力
1100 = CLC1 出力 0100 = PWM5 出力
1011 = NCO1 出力 0011 = CCP2 PWM 出力
1010 = EUSART1 TX 0010 = CCP1 PWM 出力
1001 = MSSP2 SDO2 0001 = MDMINPPS
1000 = MSSP1 SDO1 0000 = MDBIT bit
表2 搬送波選択 MDCH<3:0> MDCL<3:0>
1111 = CLC4 出力 0111 = PWM6 出力
1110 = CLC3 出力 0110 = PWM5 出力
1101 = CLC2 出力 0101 = CCP2 PWM 出力
1100 = CLC1 出力 0100 = CCP1 PWM 出力
1011 = HFINTOSC 0011 = CLKR
1010 = FOSC 0010 = MDCIN2PPS
1001 = Reserved 0001 = MDCIN1PPS
1000 = NCO1 出力 0000 = VSS

DSMのプログラム例

PWM5で発生させた搬送波信号とNCOで発生させた情報信号を混合します。情報信号は約1Hz、搬送波信号は約15Hzで、参考のためにRC0とRC1に直接出力します。 DSMは情報信号が「1」の時だけ搬送波を出力する『On/Off』モードでRC2に出力されています。
<回路図>

<プログラム>

/*************************************
 * File: DSM sample
 * System ClockはConfigで内部1MHzに設定
 * PWM5搬送波信号とNCO情報信号を混合
 * 搬送波信号は約15Hz、情報信号は約1H
 * RC1とRC0に直接出力。
 * DSMは『On/Off』モードでRC2に出力
 * PIC16F18346
 * Created on Oct 2, 2020, 2:37 PM
 **************************************/

#include <xc.h>
#define _XTAL_FREQ 1000000      // delay_ms(x) のための定義

#pragma config FEXTOSC = OFF,RSTOSC = HFINT1  // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = OFF,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = OFF,CP = OFF,CPD = OFF

void main(void) {
    LATC = 0;
    TRISC = 0b110000;           // RC0を出力に設定
    TRISA = 0b111111;           // PortAを入力に設定
    ANSELA = 0;                 // 全てのpinをデジタルに設定
    ANSELC = 0;

    // NCO 設定 ************************************************
    //   1MHz*2/2^20/2 = 0.95Hz
    // *********************************************************
    NCO1INCU = 0;               // NCO1INCU に値セット
    NCO1INCH = 0;               // NCO1INCH に値セット
    NCO1INCL = 2;               // NCO1INCL を最後にセット
    NCO1CLK = 0b00000001;       // Fosc (1 MHz)がクロック
    NCO1CON = 0b10000000;       // 正論理、反転モード
    RC0PPS  = 29;               // RC0にNCO出力

    // PWM 設定 ************************************************
    //   1MHz/4/64/256 = 15Hz
    // *********************************************************
    T2CON  = 0b00000111;        // Timer 2 PS1/64設定
    PR2    = 0xFF;              // Timer2 Period Register設定
    PWM5CON= 0b11000000;        // 正論理出力
    PWM5DCH= 0x80;              // デュティサイクルを設定
    RC1PPS  = 2;                // RC1にPWM5出力

    // DSM 設定 ************************************************
    //   PWM5搬送波信号とNCO情報信号を混合
    // *********************************************************
    MDCON = 0x80;               // DSMは『On/Off』モード
    MDSRC = 0x0B;               // 情報信号 正論理非同期 NOC1
    MDCARH = 0x06;              // 搬送波H 正論理非同期 PWM5
    MDCARL = 0;                 // 搬送波L VSS
    RC3PPS = 31;                // RC3にDSM出力

    while(1);
}