
RP0-RP11/RP13-RP15のどこでも自由に割り付け可能
#include <xc.h>
#include <PPS.h> // Pin Re-Mapping peripheral library
#pragma config IOL1WAY = OFF // 周辺機器のピン割り付けは何度でも変更出来る様に許可
PPSUnLock ;
iPPSOutput(OUT_PIN_PPS_RP8,OUT_FN_PPS_OC2) ; // RB8(OC2)
iPPSOutput(OUT_PIN_PPS_RP7,OUT_FN_PPS_OC1) ; // RB7(OC1)
PPSLock ;
※ "#include <PPS.h>"のライブラリを使う場合はこちらを参照し、インストールを行います。
左が実験回路で、電源は3.3Vです。
#define F_CYCLE 15999 // OC1RSのサイクル(1周期)
// OC1機能をエッジ整列PWMモードで初期化
OC1CON1 = 0b0001110000000110 ; // FCY使用、エッジ整列PWMモード
OC1CON2 = 0b0000000000011111 ; // 16bit、同期イベントはOC1(OC1RS))
OC1R = 0 ; // デュティ比は0%で初期化
OC1RS = F_CYCLE ; // 16000(0x3E80)=1ms(1000Hz)が1周期
OC1R にデュティ比を設定しますが、値は"F_CYCLE"が1周期なので0〜F_CYCLE(100%)です。
#define F_CYCLE 15999 // Timer2のサイクル(1周期)
// OC1機能をエッジ整列PWMモードで初期化
OC1CON1 = 0b0000000000000110 ; // Timer2使用、エッジ整列PWMモード
OC1CON2 = 0b0000000000001100 ; // 16bit、同期イベントはTimer2
OC1R = 0 ; // デュティ比は0%で初期化
// タイマー2の設定
T2CON = 0b0000000000000000 ; // プリスケーラカウント値 1:1、内部クロック(FCY)で使用、16ビット動作
TMR2 = 0 ; // タイマー2のカウンターを初期化する
PR2 = F_CYCLE ; // 16000(0x3E80)=1ms(1000Hz)が1周期
T2CONbits.TON = 1 ; // タイマー2開始
OC1R にデュティ比を設定しますが、値は"F_CYCLE"が1周期なので0〜F_CYCLE(100%)です。
#define F_CYCLE 15999 // Timer2のサイクル(1周期)
// OC1機能をエッジ整列PWMモードで初期化
OC1CON1 = 0b0000000000000110 ; // Timer2使用、エッジ整列PWMモード
OC1CON2 = 0b0000000000001100 ; // 16bit、同期イベントはTimer2
OC1R = F_CYCLE/2 ; // デュティ比は50%で初期化
// OC2機能をエッジ整列PWMモードで初期化
OC2CON1 = 0b0000000000000110 ; // Timer2使用、エッジ整列PWMモード
OC2CON2 = 0b0001000000001100 ; // 16bit、同期イベントはTimer2、出力は反転
OC2R = F_CYCLE/2 ; // デュティ比は50%で初期化
// タイマー2の設定
T2CON = 0b0000000000000000 ; // プリスケーラカウント値 1:1、内部クロック(FCY)で使用、16ビット動作
TMR2 = 0 ; // タイマー2のカウンターを初期化する
PR2 = F_CYCLE ; // 16000(0x3E80)=1ms(1000Hz)が1周期
T2CONbits.TON = 1 ; // タイマー2開始
OC1RとOC2Rにデュティ比を設定しますが、50%固定デュティ比なのでF_CYCLE/2としています。

#define F_CYCLE 15999 // Timer2のサイクル(1周期)
// OC1機能をセンター整列PWMモードで初期化
OC1CON1 = 0b0000000000000111 ; // Timer2使用、センター整列PWMモード
OC1CON2 = 0b0000000000001100 ; // 16bit、同期イベントはTimer2
OC1R = 5000 ; // TMR2=OC1Rで出力HIGH、50%のデュティ比
OC1RS = 13000 ; // TMR2=OC1RSで出力LOW、50%のデュティ比
// OC2機能をセンター整列PWMモードで初期化
OC2CON1 = 0b0000000000000111 ; // Timer2使用、センター整列PWMモード
OC2CON2 = 0b0000000000001100 ; // 16bit、同期イベントはTimer2
OC2R = 5000 + 500 ; // TMR2=OC2Rで出力HIGH、30us立ち上げを遅くしている
OC2RS = 13000 - 500 ; // TMR2=OC2RSで出力LOW、30us立ち下げを早くしている
// タイマー2の設定
T2CON = 0b0000000000000000 ; // プリスケーラカウント値 1:1、内部クロック(FCY)で使用、16ビット動作
TMR2 = 0 ; // タイマー2のカウンターを初期化する
PR2 = F_CYCLE ; // 16000(0x3E80)=1ms(1000Hz)が1周期
T2CONbits.TON = 1 ; // タイマー2開始
センター整列PWMモードでは、1周期内のどこでパルスを作成するのかを決めます、
0 15999 0
|←―(PR2)―→|←―(PR2)―→|
┌――┐ ┌――┐
―――┘ └―――┘ └――――
↑ ↑ ↑ ↑
OCxR OCxRS OCxR OCxRS
(5000) (13000)
とセットすれば50%のデュティ比が生成出来るでしょう。
でぇ、OC2にデッドバンドを作成する為に、

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