SCCPモジュールの使い方5(ワンショット機能)

SCCPモジュールの使い方

概要

入力信号をトリガにある一定時間だけパルスを出力する回路を単安定マルチバイブレータやワンショット・マルチバイブレータ(略してワンショット)回路と呼び、汎用ロジックICだと74HC123を使うのが定番となっていました。しかし外付けR・Cの値により時間を決めるため、それほど正確に時間を調整する事はできません。

同期機能とは

同期ソース(SYNC<4:0>)で選択されている入力がアサートされた時に自分のタイマカウントを0にする機能です。

(fig.1)SCCPモジュール同士の同期
(fig.2)フルカラーLED位置

ハードウェア構成と制御ブロック

SCCP1で周期を決定し、自己はSYNC機能を使用しない設定にします。また他のSCCP2、SCCP3はSYNC入力にSCCP1出力を指定します。このように設定すると、SCCP1のコンペアマッチのタイミングでSCCP2、SCCP3のタイマがクリアされます。CCPxRAで最初の変化、CCPxRBで次の変化のタイミングを設定します。上記例では出力を反転させていますので、最初の変化がH→Lと遷移します。

注意点としてはクロック入力を全て同一のクロック源とする必要が有ります。

(fig.3) ハードウェア構成

ソースコード

以下の6つの値を変更することで、出力波形が変わります。

  • CCP1PRL 全体周期
  • CCP1RB CCP1パルスの立ち上がりタイミング
  • CCP2RA CCP2パルスの立ち下がりタイミング
  • CCP2RB CCP2パルスの立ち上がりタイミング
  • CCP3RA CCP3パルスの立ち下がりタイミング
  • CCP3RB CCP3パルスの立ち上がりタイミング

同期ソースレジスタ「 CCPxCON1Hbits.SYNC 」の設定は以下のようにします。

条件1条件2条件3条件4
CCP1PRL50005000500500
CCP1RAL1000100010001000
CCP2CON1Hbits.ONESHOT1011
CCP2CON1Hbits.RTRGEN1110
CCP2PRL1500150015001500
CCP2RA1000100010001000
CCP2RB1200120012001200
コンフィグレーション設定について

コンフィグレーション設定についてはコンフィグレーション設定に記載しております。

コピーして下記のソースコードの「 //ここにコンフィグレーション設定を挿入する// 」の位置に挿入してください。

クロック設定について

クロック設定用関数 vds_Main_Init_Clock_Register(); のソースコードはクロック設定のページに記載しております。

コピーして下記のソースコードの「 //ここにクロック設定ソースをコピペする// 」の位置に挿入してください。

/*--------------------------------------------------------------------------------*/
/* @file      SCCP_ONESHOT.c */
/* @brief     SCCPモジュールの使い方5 */
/* @details   SCCP(CCPxCON1L,CCPxCON2H,CCPxPRL,CCPxRB) */
/*                  リマッパブルピン(RPOR) */
/*--------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------*/
/* コンフィグレーション設定*/
/*--------------------------------------------------------------------------------*/
//ここにコンフィグレーション設定を挿入する//
/*--------------------------------------------------------------------------------*/
/* インクルードファイル*/
/*--------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
/*--------------------------------------------------------------------------------*/
/* 定数定義*/
/*--------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------*/
/* クロック設定 */
/*--------------------------------------------------------------------------------*/
//ここにクロック設定ソースを挿入する//
/*--------------------------------------------------------------------------------*/
/* Main関数 */
/*--------------------------------------------------------------------------------*/
int main(int argc, char** argv) 
{
    /*----------------------------------------------------------------------------*/
    /* クロック初期化*/
    /*----------------------------------------------------------------------------*/
        vds_Main_Init_Clock_Register();     /* クロック初期化 */
    /*----------------------------------------------------------------------------*/
    /* GPIO初期化*/
    /*----------------------------------------------------------------------------*/
        RPOR18bits.RP69R = 15u;       /* SCCP1 / RD3*/
        RPOR19bits.RP71R = 16u;       /* SCCP2 / RB10*/
        RPINR0bits.INT1R = 69;
    /*----------------------------------------------------------------------------*/
    /* SCCP1初期化*/
    /*----------------------------------------------------------------------------*/   
        CCP1CON1L = 0x0000u;
            CCP1CON1Lbits.MOD = 4u;      /* 動作モード(3 = トグル出力) */
        CCP1CON1H = 0x0000u;
            CCP1CON1Hbits.SYNC = 1u;     /* コンペアで同期*/
        CCP1CON2H = 0x0000u;
            CCP1CON2Hbits.OCAEN	= 1u;    /* 出力イネーブル  */
        CCP1PRL = 5000;                 /* 周期(PWMモード) */
        CCP1PRH = 0;                     /* 周期(タイマーモード) */
        CCP1RAL = 1000;                  /* 立ち上がりタイミング(PWMモード) */
        CCP1RBL = 0;                     /* 立ち下がりタイミング(PWMモード) */
    /*-------------------------------------------------------------------------*/
    /* SCCP2初期化*/
    /*-------------------------------------------------------------------------*/
        CCP2CON1L = 0x0000u;
            CCP2CON1Lbits.MOD	= 4u;	/* PWMモード*/
            CCP2CON1Lbits.CCSEL	= 0u;	/* コンペアモード */	
        CCP2CON2L = 0x0000u;
        CCP2CON2H = 0x0000u;
            CCP2CON1Hbits.SYNC = 10;     /* INT1 */
            CCP2CON1Hbits.ONESHOT = 0u;  /*ワンショットモード*/
            CCP2CON1Hbits.TRIGEN = 1u;   /*トリガモード */
            CCP2CON1Hbits.RTRGEN = 1u;   /*再トリガ許可*/
        CCP2CON2H = 0x0000u;
            CCP2CON2Hbits.OCAEN	= 1u;	 /* 出力イネーブル */
        CCP2CON3H = 0x0000u;
        CCP2PRL	= 1500;
        CCP2PRH = 1500;
        CCP2RA = 1000;
        CCP2RB = 1200;
 
        CCP1CON1Lbits.CCPON = 1u;
        CCP2CON1Lbits.CCPON = 1u;
    /*--------------------------------------------------------------------------*/
    /* メインルーチン*/
    /*--------------------------------------------------------------------------*/
        while(1)
        {
            
        }
}




結果

SCCP1(Ch2/水色)の立ち上がりエッジを基準にSCCP2(Ch1/黄色)でワンショットパルスが出力されています。

(fig.x)条件1の波形

ONESHOT = 0にするとPRLに達した時に、0からカウントが開始されるのでパルスが連続して出力されています。

(fig.x)条件2の波形

CCP1PRL < CCP2PRA とした時にはリトリガが発生し、常時Lowのままとなっています

(fig)条件3の波形

CCP2CON1Hbits.RTRGEN = 0 にするとどこかの立ち上がりのタイミングでカウントとパルス出力が行われ、その間のトリガ入力は無視されます

(fig)条件4の波形

コメント

タイトルとURLをコピーしました