DSM機能を動作させて見ます

〔PICの動かせ方入門に戻る〕


DSM機能(Data Signal Modulator Module:データ信号変調器)は、データ信号(モジュレータ信号)に
搬送波信号を混合(AND)して変調出力を生成出来ます。
DSMモジュールに供給する搬送波信号とモジュレータ信号には、デバイス内部の周辺モジュール
(PWM等)の出力を使う事も、入力ピンからの外部信号を使う事も出来ます。

タイミング図
データシートからの抜粋ですが、
モジュレータ信号(MOD)のHIGH時に搬送波High信号(CARH)が出力され、
モジュレータ信号(MOD)のLOW時に搬送波Low信号(CARL)が出力されます。

この図の出力波形は、同期が無効かされているので出力切り替え時に
搬送波のパルス幅が狭くなったりスプリアスが発生したりします、
それが嫌な場合は同期を有効(CxSYNC=1)にしましょう。

このDSM機能は、16F18313だけでなく12F1822/16F18xx系統にも搭載されています、
なので他のPICも参考になるでしょう。

16F18313の場合は入出力(MDCIN1/NDCIN2/MDMIN/MDOUT)するピンはPPS機能で割り当てて
使いますが、(入力ピンのデフォルトはピンに割り付けられています)
他のPIC(12F1822/16F18xx)はピンに割り付けられています。

《PIC16F18313ピン構成》

ピン構成図 DSMの出力(MDOUT)するピンは、5番(RA2)ピンに
PPS機能で割り付けます。
RA2ピンにLEDでも取付ければ動作確認が出来る
でしょう。
外部入力は今回使用しません。

尚、PICの1番ピンに電源+5V、
8番ピンに電源GND(-)を接続しています。

《サンプルプログラム》

このサンプルの搬送波High信号(CARH)はCCP1からのPWM信号(37.73KHz/デューティ値は50%)を
入力し、搬送波Low信号(CARL)はVSS(GND)に接続しました。
モジュレータ信号(MOD)はMDBIT(MDCON< 0 >)をソフトウエアで約10ms毎にON/OFFさせた物を入力
しています。
尚、PICのシステムクロック(Fosc)は内蔵8MHzで行っています。

下記がプログラムソースです、
MPLAB X(V3.40)MPLAB(R) XC8 C Compiler Version 1.38コンパイラを使用しています。
 プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
#include <xc.h>

#define _XTAL_FREQ 8000000         // 使用するPIC等により動作周波数値を設定する

// コンフィギュレーション1の設定
#pragma config FEXTOSC  = OFF      // 外部クロックは無効(OFF)
#pragma config RSTOSC   = HFINT32  // 初期発振器は内部発振器(HFFRQx2倍)を選択(HFINT32)
#pragma config CLKOUTEN = OFF      // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config CSWEN    = OFF      // NOSCとNDIVへの書き込みは許可しない(OFF)
#pragma config FCMEN    = OFF      // 外部クロック監視しない(OFF)
// コンフィギュレーション2の設定
#pragma config MCLRE    = OFF      // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config PWRTE    = ON       // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config WDTE     = OFF      // ウオッチドッグタイマー無し(OFF)
#pragma config LPBOREN  = OFF      // 低消費電力ブラウンアウトリセットは無効(OFF)
#pragma config BOREN    = ON       // 電源電圧降下常時監視機能ON(ON)
#pragma config PPS1WAY  = OFF      // ロック解除シーケンスを実行すれば何度でもPPSLOCKをセット/クリアできる
#pragma config STVREN   = ON       // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
// コンフィギュレーション3の設定
#pragma config WRT      = OFF      // Flashメモリーを保護しない(OFF)
#pragma config LVP      = OFF      // 低電圧プログラミング機能使用しない(OFF)
// コンフィギュレーション4の設定
#pragma config CP       = OFF      // プログラムメモリーを保護しない(OFF)
#pragma config CPD      = OFF      // EEPROMデータメモリーを保護しない(OFF)

/*******************************************************************************
*  メインの処理                                                                *
*******************************************************************************/
void main()
{
     OSCFRQbits.HFFRQ = 0b011 ;    // 4MHzをx2で8MHzの周波数(Fosc)を生成
     ANSELA = 0b00000000 ;         // アナログは使用しない(すべてデジタルI/Oに割当てる)
     TRISA  = 0b00000000 ;         // ピンは全て出力に割当てる(RA3は入力専用)
     PORTA  = 0b00000000 ;         // 出力ピンの初期化(全てLOWにする)

     // CCP1の設定(タイマーはTIMER2のみ使用可能)
     CCP1CON = 0b10001111 ;        // PWM機能を使用する(データは右詰で設定)
     CCPR1L  = 0x69 ;              // デューティ値は50%で初期化
     CCPR1H  = 0x00 ;
     T2CON   = 0b00000000 ;        // TMR2プリスケーラ/ポストスケーラを1:1に設定
     TMR2    = 0 ;                 // タイマー2カウンターを初期化
     PR2     = 52 ;                // PWMの周期を設定(37.73KHzで設定)
     TMR2ON  = 1 ;                 // TMR2(PWM)スタート
     // DSMの設定
     RA2PPS = 0b00011111 ;         // RA2(5)ピンをDSM出力に割り当てる
     MDCARH = 0b00000100 ;         // 搬送波HIGHは反転しない、同期無、CCP1から入力
     MDCARL = 0b00000000 ;         // 搬送波LOWは反転しない、同期無、VSSから入力
     MDSRC  = 0b00000000 ;         // MDBIT(MDCON<0>)を使う手動変調
     MDCON  = 0b10000000 ;         // DSM有効、出力は反転しない

     while(1) {
          MDCONbits.MDBIT=1 ;      // MOD ON(HIGH)
          __delay_ms(10) ;
          MDCONbits.MDBIT=0 ;      // MOD OFF(LOW)
          __delay_ms(10) ;
     }
}
---------------------------------------------------------------------

実行結果

下記が実行結果の波形です、MDOUTはMODがHIGHの時にCCP1(PWM:37KHz)が出力されているのが
解るかと思います、でぇ、MODがLOW時はCARL=Vssなので出力されていないですね。

実行結果1

MODOUTピン(RA2)にLEDを取り付ければ点灯すると思います、delay(10)を100ms程にすれば点滅する
事でしょう。
尚、赤外線通信は38KHzの搬送波変調通信なのでDSM機能を使えば良いかもね?

《レジスタの設定》

CCP1の設定

CCP1の設定方法はここでは省きますが、こちらの覚書を参考にして下さい。

DSMの設定

DSMにて出力するピン(MDOUT)を決めるには
     RA2PPS = 0b00011111 ;         // RA2(5)ピンをDSM出力に割り当てる
 もちろんANSEL/TRISにて使用するピンはデジタル出力に設定します。
 他のピンRA0/RA1/RA4/RA5にも割り付けは可能です。

MDCONの構成
ビット
機能 MDEN MDOPOL MDOUT MDBIT

Bit 7:MDEN    DSMモジュールの有効無効指定ビット
            1:モジュールを使用する
            0:モジュールを使用しない

Bit 4:MDOPOL  出力極性選択ビット
            1:モジュレータ出力信号を反転する
            0:モジュレータ出力信号を反転しない

Bit 3:MDOUT   モジュール出力の現在の状態を示します(読込みのみ)
            このレジスタビットの更新レートに対して変調出力の方が周波数が高く
            かつ非同期である場合、出力の状態を正しく反映しない可能性有ります。

Bit 0:MDBIT   手動(ソフトウエア)による変調入力ビット
            1:搬送波の変調を有効にする
            0:搬送波の変調を無効にする
            この機能を利用する場合は、”MDMS=0000”に設定を行います。

MDSRCの構成
ビット
機能 MDMS

Bit 3-0:MDMS  モジュレータ信号(MOD)源の選択ビット
            1101:CLC2の出力
            1100:CLC1の出力
            1011:NCOの出力
            1010:USARTのTX出力
            1000:MSSP1のSDO1出力
            0111:C2の出力
            0110:C1の出力
            0101:PWM6の出力
            0100:PWM5の出力
            0011:CCP2の出力(PWMモードのみ)
            0010:CCP1の出力(PWMモードのみ)
            0001:MDMINPPSからの外部ピン入力
            0000:MDBIT (MDCON<0>) を使う手動変調

MDCARHの構成
ビット
機能 MDCHPOL MDCHSYNC MDCH

Bit 6:MDCHPOL   モジュレータ搬送波Highの極性選択ビット
              1:選択した搬送波High 信号を反転する
              0:選択した搬送波High 信号を反転しない

Bit 5:MDCHSYNC  モジュレータ搬送波Highの同期イネーブルビット
              1:モジュレータは搬送波High信号の立ち下がりエッジまで待ってから
                出力を搬送波Low信号に切り換える
              0:モジュレータ出力を搬送波High 信号に同期させない

Bit 3-0:MDCH     モジュレータデータ搬送波High(CARH) 選択ビット
              1101:CLC2の出力
              1100:CLC1の出力
              1011:HFINTOSC
              1010:Fosc
              1000:NCOの出力
              0111:PWM6の出力
              0110:PWM5の出力
              0101:CCP2の出力(PWMモードのみ)
              0100:CCP1の出力(PWMモードのみ)
              0010:MDCIN2PPSからの外部ピン入力
              0001:MDCIN1PPSからの外部ピン入力
              0000:Vss(GND)

MDCARLの構成
ビット
機能 MDCLPOL MDCLSYNC MDCL

Bit 6:MDCLPOL   モジュレータ搬送波Lowの極性選択ビット
              1:選択した搬送波Low 信号を反転する
              0:選択した搬送波Low 信号を反転しない

Bit 5:MDCLSYNC  モジュレータ搬送波Lowの同期イネーブルビット
              1:モジュレータは搬送波Low信号の立ち下がりエッジまで待ってから
                出力を搬送波High信号に切り換える
              0:モジュレータ出力を搬送波Low 信号に同期させない

Bit 3-0:MDCL     モジュレータデータ搬送波Low(CARL) 選択ビット
              1101:CLC2の出力
              1100:CLC1の出力
              1011:HFINTOSC
              1010:Fosc
              1000:NCOの出力
              0111:PWM6の出力
              0110:PWM5の出力
              0101:CCP2の出力(PWMモードのみ)
              0100:CCP1の出力(PWMモードのみ)
              0010:MDCIN2PPSからの外部ピン入力
              0001:MDCIN1PPSからの外部ピン入力
              0000:Vss(GND)


《その他》





【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.