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なので出力されていないですね。
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の構成
ビット |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
機能 |
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の構成
ビット |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
機能 |
|
|
|
|
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の構成
ビット |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
機能 |
|
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の構成
ビット |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
機能 |
|
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.