[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
一つのパルス出力に他のパルス出力を同期させたいシーンが有る場合、「SYNC」機能を使えば簡単に実現できます。
/*----------------------------------------------------------------------------------*/
/*【INC】インクルードファイル*/
/*----------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
/*----------------------------------------------------------------------------------*/
/* Main関数 */
/*----------------------------------------------------------------------------------*/
int main(int argc, char** argv)
{
/*------------------------------------------------------------------------------*/
/* リマッパブルピン初期化*/
/*------------------------------------------------------------------------------*/
RPOR18bits.RP69R = 15u; /* RGB LED RED [SCCP1] */
RPOR19bits.RP71R = 16u; /* RGB LED GREEN[SCCP2] */
RPOR7bits.RP46R = 17u; /* RGB LED BLUE [SCCP3] */
/*-----------------------------------------------------------------------------*/
/* CCP1初期化*/
/*-----------------------------------------------------------------------------*/
CCP1CON1L = 0x0000u;
CCP1CON1Lbits.MOD = 4u; /* CCPx モード選択ビット */
CCP1CON1Lbits.CCSEL = 0u; /* キャプチャ / コンペア モード選択ビット */
CCP1CON1H = 0x0000u;
CCP1CON1Hbits.SYNC = 0u; /* 同期無し */
CCP1CON2H = 0x0000u;
CCP1CON2Hbits.OCAEN = 1u; /* 出力イネーブル / ステアリング制御ビット */
CCP1CON3H = 0x0000u;
CCP1CON3Hbits.POLACE = 1u; /* CCPx 出力ピン極性制御ビット */
CCP1PRL = 6250;
CCP1RB = 400u;
/*-----------------------------------------------------------------------------*/
/* CCP2初期化*/
/*-----------------------------------------------------------------------------*/
CCP2CON1L = 0x0000u;
CCP2CON1Lbits.MOD = 4u; /* CCPx モード選択ビット */
CCP2CON1Lbits.CCSEL = 0u; /* キャプチャ / コンペア モード選択ビット */
CCP2CON1H = 0x0000u;
CCP2CON1Hbits.SYNC = 2u; /* SCCP2に同期 */
CCP2CON2H = 0x0000u;
CCP2CON2Hbits.OCAEN = 1u; /* 出力イネーブル / ステアリング制御ビット */
CCP2CON3H = 0x0000u;
CCP2CON3Hbits.POLACE = 1u; /* CCPx 出力ピン極性制御ビット */
CCP2PRL = 65535;
CCP2RA = 450u;
CCP2RB = 850u;
/*-----------------------------------------------------------------------------*/
/* CCP3初期化*/
/*-----------------------------------------------------------------------------*/
CCP3CON1L = 0x0000u;
CCP3CON1Lbits.MOD = 4u; /* CCPx モード選択ビット */
CCP3CON1Lbits.CCSEL = 0u; /* キャプチャ / コンペア モード選択ビット */
CCP3CON1H = 0x0000u;
CCP3CON1Hbits.SYNC = 2u; /* SCCP2に同期 */
CCP3CON2H = 0x0000u;
CCP3CON2Hbits.OCAEN = 1u; /* 出力イネーブル / ステアリング制御ビット */
CCP3CON3H = 0x0000u;
CCP3CON3Hbits.POLACE = 1u; /* CCPx 出力ピン極性制御ビット */
CCP3PRL = 65535;
CCP3RA = 900u;
CCP3RB = 1300u;
/*-----------------------------------------------------------------------------*/
/* CCP2,3,4の有効化*/
/*-----------------------------------------------------------------------------*/
CCP2CON1Lbits.CCPON = 1u ;
CCP3CON1Lbits.CCPON = 1u ;
CCP1CON1Lbits.CCPON = 1u ; //基準を最後に有効化
while(1){}
}
COMMENT
秀さん、はじめまして。
問い合わせの件に答えていきますね。
まずCCPxRAとCCPxRBの差はOnDutyの幅を指定します。(RAのタイミングで立ち上がって、RBのタイミングで立ち下がる)但し今回のソースでは「CCPxCON3Hbits.POLACE = 1u」で極性を反転していますので、RAのタイミングで立ち下がって、RBのタイミングで立ち上がるため、Low幅の時間です。
クロックは全ての実験で90MHzとしていたつもりだったのですが、今回実験していた時はクロックを80MHzに設定していたためオシロ画像ではチャンネル1の周波数が1/(6250/(80*10^6)) ≒12kHzとなっています。またLow幅は400/(80*10^6) = 5usecです。
誤解を招くコードで申し訳ないのですが、今回SCCP2とSCCP3は同期モードで動作していますので、SCCP1のCCPxPRLだけ効果を持っていまして、SCCP2とSCCP3のCCPxPRLは効果を持っていません。すなわち0でも65535でも何でも良いです。
Clock = 90MHz
CCP1CON1Lbits. TMRPS = 0
CCP2CON1Lbits. TMRPS = 0
CCP3CON1Lbits. TMRPS = 0
CCP1PRL = 65535
と設定した場合は、全体の周期は 1 * 65535/(90*10^6) = 728secになります。
Clock = 90MHz
CCPxCON1Lbits. TMRPS = 3
CCPxCON2Lbits. TMRPS = 3
CCPxCON3Lbits. TMRPS = 3
CCP1PRL = 65535
と設定した場合は、全体の周期は 64 * 65535/(90*10^6) = 46.6msになります。
以上ですが、回答になっていますでしょうか?
COMMENT FORM
CCP, RAとRBでの設定
ありがとうございます。MCPマニアさんのお陰様ですごく良い工夫できています。
質問ですが、
CCP2RA = 450u;
CCP2RB = 850u;
これを見ると400の差がみえています、
CCP3RA = 900u;
CCP3RB = 1300u;
こちらにも400の差がみえていますがこのカウンター値はOnのデュティのためか知りたいです。
CCP3PRL = 65535;
そしてこの周期カウンターですが、65535をすべてカウンタすると実際時間としてはどれくらいになるかも知りたいです。CCPCLKに提供している周期にこの65535をかけて計算するのかしりたいんです。でもSCCP2とSCCP3はSCCP1に動機するのですが、そしたらSCCP1の周期に合わせて周期がなるわけですが、PRLを別途で設定するわけがしりたいんです。
明けましておめでとうございます。コロナ気をつけてください~
秀 2022/01/17 16:28 EDIT RES