忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2025/05/22

dsPIC33CH Curiosity Development Board(SCCPモジュールの使い方2)

一つのパルス出力に他のパルス出力を同期させたいシーンが有る場合、「SYNC」機能を使えば簡単に実現できます。

  ハードウェア構成

今回はSCCP1を基準とします。SCCP1で周期を決定し、自己はSYNC機能を使用しない設定にします。また他のSCCP2、SCCP3はSYNC入力にSCCP1出力を指定します。この様に設定すると、SCCP1のコンペアマッチのタイミングでSCCP2、SCCP3のタイマがクリアされます。CCPxRAで最初の変化、CCPxRBで次の変化のタイミングを設定します。上記例では出力を反転させていますので、最初の変化がH→Lと遷移します。 同期を行う場合の注意点としては、クロック入力を全て同一のクロック源とする必要が有ります。 


 
  

  ソースコード

コンフィグレーション設定やクロック設定の関数に関して記述を省略していますが「dsPIC33CH Curiosity Development Board(準備編)」と同じです。

/*----------------------------------------------------------------------------------*/
/*【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){} 
}

結果

SCCP1(Ch1/黄色)を基準にSCCP2、SCCP3のパルスが出力されています。
PR

2020/08/14 dsPIC33C Comment(3)

COMMENT

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

SCCPの設定に関して

秀さん、はじめまして。

問い合わせの件に答えていきますね。

まず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になります。

以上ですが、回答になっていますでしょうか?

ぴくお 2022/01/17  22:32 EDIT RES

無題

親切なご説明ありがとうございます。やっと理解できました。

2022/01/25  20:25 EDIT RES

COMMENT FORM

NAME
MAIL
WEB
TITLE
COMMENT
PASSWORD

プロフィール
 
HN:
ぴくお
性別:
非公開
 
 
カテゴリー
 
 
 
最新記事
 
(10/03)
(09/05)
(08/23)
(08/17)
(08/16)
 
 
RSS
 
 
 
リンク
 
 
 
免責事項
当サイトに掲載の回路図やプログラム等は動作する事を期待して掲載しておりますが、その動作の保証、性能の保証は致しません。 また掲載されているソフトウェアの使用により生じたいかなる損害に関しまして作者は一切責任を負いません。