忍者ブログ

[PR]

×

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

2025/05/23

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

外部のPWMパルスの周期やDutyを計測したい場合、インプットキャプチャを使用すると簡単に計測できます。

  ハードウェア構成

今回はダミーとしてSCCP1をPWM出力とし、他のSCCPモジュールはインプットキャプチャモジュールとして動作させます。通常のインプットキャプチャの動作ですと(fig.2-3-5-A)のSCCP2のようにエッジイベントごとにフリーランタイマ値を取得することになります。この場合周期を得る為には、今回の値と前回の値の差分をCPUで演算する必要が発生します。また0xFFFFを跨いだ場合はさらに面倒です。 そこでSCCP3のインプットキャプチャイベントを同期出力イベントにしてSCCP3、SCCP4の同期入力に入力させます。こうすることで(fig.2-3-5-A)のSCCP3のように立ち上がりイベントでタイマがクリアされるので、周期やDuty(幅)を直接取得可能となります。 

   
 
  

  ソースコード

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

/*----------------------------------------------------------------------------------*/
/*【INC】インクルードファイル*/
/*----------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
/*----------------------------------------------------------------------------------*/
/*【VARI】変数定義*/
/*----------------------------------------------------------------------------------*/
unsigned int u2g_Cap2[256];
unsigned int u2g_Cap3[256];
unsigned int u2g_Cap4[256];
unsigned int u2g_CapCnt2;
unsigned int u2g_CapCnt3;
unsigned int u2g_CapCnt4;

/*----------------------------------------------------------------------------------*/
/* Main関数 */
/*----------------------------------------------------------------------------------*/
int main(int argc, char** argv) 
{
    /*------------------------------------------------------------------------------*/
    /* リマッパブルピン初期化*/
    /*------------------------------------------------------------------------------*/
        RPOR18bits.RP69R = 15u;       /* RGB LED RED [SCCP1] */
        RPINR4bits.ICM2R = 69u;       /* IC[SCCP2] */
        RPINR5bits.ICM3R = 69u;       /* IC[SCCP3] */
        RPINR6bits.ICM4R = 69u;       /* IC[SCCP4] */
    /*-----------------------------------------------------------------------------*/
    /* CCP1初期化*/
    /*-----------------------------------------------------------------------------*/
        CCP1CON1L = 0x0000u;
            CCP1CON1Lbits.MOD	= 4u;	/* PWMモード*/
            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	= 1u;	/* 立ち上がり間 */
            CCP2CON1Lbits.CCSEL	= 1u;	/* キャプチャモード*/
        CCP2CON1H = 0x0000u;
            CCP2CON1Hbits.SYNC = 0u;    /* 同期無し */	
        CCP2CON2H = 0x0000u;
            CCP2CON2Hbits.ICS = 0u;     /* ICxPIN(PPS) */
        CCP2CON3H = 0x0000u;
        CCP2PRL	= 0x0000u;    
        CCP2RA	= 0x0000u;
        CCP2RB	= 0x0000u;
    /*-----------------------------------------------------------------------------*/
    /* CCP3初期化*/
    /*-----------------------------------------------------------------------------*/
        CCP3CON1L = 0x0000u;
            CCP3CON1Lbits.MOD	= 1u;	/* 立ち上がり間 */
            CCP3CON1Lbits.CCSEL	= 1u;	/* キャプチャモード */
        CCP3CON1H = 0x0000u;
            CCP3CON1Hbits.SYNC = 4u;    /* [重要]SCCP3に同期 */
            CCP3CON1Hbits.ALTSYNC = 1u; /* [重要]代替同期出力有効 */
        CCP3CON2H = 0x0000u;
            CCP3CON2Hbits.ICS = 0u;     /* ICxPIN(PPS) */
            CCP3CON2Hbits.AUXOUT = 3u;  /* [重要]キャプチャイベントで同期出力 */
        CCP3CON3H = 0x0000u;
        CCP3PRL	= 0x0000u;     
        CCP3RA	= 0x0000u;
        CCP3RB	= 0x0000u;
    /*-----------------------------------------------------------------------------*/
    /* CCP4初期化*/
    /*-----------------------------------------------------------------------------*/
        CCP4CON1L = 0x0000u;
            CCP4CON1Lbits.MOD	= 2u;	/* 立下り間 */
            CCP4CON1Lbits.CCSEL	= 1u;	/* キャプチャモード */
        CCP4CON1H = 0x0000u;
            CCP4CON1Hbits.SYNC = 4u;    /* SCCP3に同期 */
            CCP4CON1Hbits.ALTSYNC = 1u; /* [重要]代替同期出力有効 */
        CCP4CON2H = 0x0000u;
            CCP4CON2Hbits.ICS = 0u;     /* ICxPIN(PPS) */
            CCP4CON2Hbits.AUXOUT = 3u;  /* [重要]キャプチャイベントで同期出力 */
        CCP4CON3H = 0x0000u;
        CCP4PRL	= 0x0000u;     
        CCP4RA	= 0x0000u;
        CCP4RB	= 0x0000u;
    /*-----------------------------------------------------------------------------*/
    /* CCP2,3,4の有効化*/
    /*-----------------------------------------------------------------------------*/ 
        CCP4CON1Lbits.CCPON = 1u ;
        CCP2CON1Lbits.CCPON = 1u ;
        CCP3CON1Lbits.CCPON = 1u ;
        CCP1CON1Lbits.CCPON = 1u ;
        
    while(1)
    {
        if (CCP2STATLbits.ICBNE == 1u)
        {
            u2g_Cap2[u2g_CapCnt2 ++] = CCP2BUFL;
            u2g_CapCnt2 &= 0xFF;
        }
    
        if (CCP3STATLbits.ICBNE == 1u)
        {
            u2g_Cap3[u2g_CapCnt3 ++] = CCP3BUFL;
            u2g_CapCnt3 &= 0xFF;
        }
        
        if (CCP4STATLbits.ICBNE == 1u)
        {
            u2g_Cap4[u2g_CapCnt4 ++] = CCP4BUFL;
            u2g_CapCnt4 &= 0xFF;
        }
    } 
}

結果

各SCCPモジュールのICxBUF値です。SCCP2はフリーランタイマの値が取得できており、SCCP3は周期、SCCP4はDutyの値が直接測定できています。


(20.9.2 加筆) インプットキャプチャイベントで自己同期する場合、プリスケーラ(TMRPS)の値が0以外では上手く動作しない模様。クロックを遅くしたい場合はREFCLK等で回避する手段なら大丈夫と思われる


PR

2020/08/14 dsPIC33C Comment(0)

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