SCCPモジュールの使い方2(分周回路)

SCCPモジュールの使い方

概要

高速なクロックを低速なクロックに変換する回路の事を分周回路と呼び、Dフリップフロップやカウンタロジックなどを用い構成する事が一般的です。

dsPICを用いると(fig.1)の様に分周や間引き回路が自由に生成できます。

(fig.1)分周波形
(fig.2)フルカラーLED位置

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

今回はSCCP1,SCCP2をPWMモードとして構成します。まずSCCP2を分周元のクロックを生成しRP71ピンを経由しPWM出力させます。そしてそのクロックをリマッパブルピンのRP71ピン経由でSCCP1のクロックとして構成させます。

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

ソースコード

以下のマクロの値を変更すると、間引き回数や分周設定が設定可能です。

  • ORG_CLOCK クロック源周期
  • DIV_NUM 間引き回数
  • DIV_DUTY 間引きした時の出力回数

DIV_NUM = 0.5 * DIV_DUTYの場合には一般的な分周回路になり、それ以外の場合は間引き回路になります。

#define ORG_CLOCK   100000L             /*クロック源周期*/
#define ORG_DUTY    (ORG_CLOCK >> 1u)   /*クロック源Duty*/
#define DIV_NUM     10                  /*間引き回数 Min 2*/
#define DIV_DUTY    1                   /*分周時Duty */

コンフィグレーション設定について

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

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

クロック設定について

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

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

/*--------------------------------------------------------------------------------*/
/* @file      SCCP_DIVISION.c */
/* @brief     SCCPモジュールの使い方2 */
/* @details      SCCP(CCPxCON1L,CCPxCON2H,CCPxPRL,CCPxRB) */
/*                  リマッパブルピン(RPOR) */
/*--------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------*/
/* コンフィグレーション設定*/
/*--------------------------------------------------------------------------------*/
//ここにコンフィグレーション設定を挿入する//
/*--------------------------------------------------------------------------------*/
/* インクルードファイル*/
/*--------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
/*--------------------------------------------------------------------------------*/
/* 定数定義*/
/*--------------------------------------------------------------------------------*/
#define FCY         90000000L           /*90MHz*/
#define ORG_CLOCK   100000L             /*クロック源周期*/
#define ORG_DUTY    (ORG_CLOCK >> 1u)   /*クロック源Duty*/
#define DIV_NUM     10                  /*間引き回数 Min 2*/
#define DIV_DUTY    1                   /*分周時Duty */
/*--------------------------------------------------------------------------------*/
/* クロック設定 */
/*--------------------------------------------------------------------------------*/
//ここにクロック設定ソースを挿入する//
/*--------------------------------------------------------------------------------*/
/* Main関数 */
/*--------------------------------------------------------------------------------*/
int main(int argc, char** argv) 
{
    /*----------------------------------------------------------------------------*/
    /* クロック初期化*/
    /*----------------------------------------------------------------------------*/
        vds_Main_Init_Clock_Register();     /* クロック初期化 */
    /*----------------------------------------------------------------------------*/
    /* リマッパブルピン初期化*/
    /*----------------------------------------------------------------------------*/
        RPOR18bits.RP69R = 15u;       /* RGB LED RED [SCCP1] */
        RPOR19bits.RP71R = 16u;       /* RGB LED GREEN[SCCP2] */
        RPINR3bits.TCKI1R = 71;       /* SCCP1クロック */
    /*----------------------------------------------------------------------------*/
    /* CCP1初期化*/
    /*----------------------------------------------------------------------------*/
        CCP1CON1L = 0x0000u;
            CCP1CON1Lbits.MOD	= 5u;	/* CCPx モード選択ビット */
            CCP1CON1Lbits.CCSEL	= 0u;	/* キャプチャ / コンペア モード選択ビット*/
            CCP1CON1Lbits.CLKSEL = 7u;
        CCP1CON1H = 0x0000u;
        CCP1CON2H = 0x0000u;
            CCP1CON2Hbits.OCAEN	= 1u;	/* 出力イネーブル / ステアリング制御ビット*/
        CCP1CON3H = 0x0000u;
        CCP1PRL	= DIV_NUM - 1;
        CCP1PRH	= 0x0000u;	
	CCP1RA	= 0x0000u;
        CCP1RB	= DIV_DUTY;
    /*----------------------------------------------------------------------------*/
    /* CCP2初期化*/
    /*----------------------------------------------------------------------------*/
        CCP2CON1L = 0x0000u;
            CCP2CON1Lbits.MOD	= 5u;	/* CCPx モード選択ビット */
            CCP2CON1Lbits.CCSEL	= 0u;	/* キャプチャ / コンペア モード選択ビット*/
        CCP2CON1H = 0x0000u;
        CCP2CON2H = 0x0000u;
            CCP2CON2Hbits.OCAEN	= 1u;	/* 出力イネーブル / ステアリング制御ビット*/
        CCP2CON3H = 0x0000u;
        CCP2PRL	= FCY / ORG_CLOCK;
        CCP2PRH	= 0x0000u;	
	CCP2RA	= 0x0000u;
        CCP2RB	= CCP2PRL >> 1;     
    /*---------------------------------------------------------------------------*/
    /* CCP1,2の有効化*/
    /*---------------------------------------------------------------------------*/ 
        CCP1CON1Lbits.CCPON = 1u ;
        CCP2CON1Lbits.CCPON = 1u ;
        
    while(1){} 
}

結果

パルスを10分の1に間引きした出力波形です。

(fig.4)出力波形

コメント

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