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 |
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);
}