dsPIC33AKシリーズ㉑ 高速コンパレータモジュールの使い方1

dsPIC33Aシリーズ

概要

今回は、dsPIC33AKシリーズの高速コンパレータモジュールの使い方を解説します。
このコンパレータは、主にスイッチング電源やモータ制御に使用されることを想定して設計されています。従来のdsPIC33Cシリーズに比べ、応答速度が15nsecから5nsecへと高速化されており、より迅速な動作が可能です。

dsPIC33Cシリーズからの強化ポイント

・応答速度が15nsecから5nsecへ高速化
・リップルリダクション機能の追加 (DACCTRL1bits.RREN)
・INL/DNLの補正機能追加(DACCTRL1bits.POSINLADJ,DACCTRL1bits.NEGINLADJ,DACCTRL1bits.DNLADJ)
・外部トリガデータ更新機能の追加(DACxCONbits.EXTUPD)
・DAC値遷移モードの追加(DACxCONbits.UPDTMDIS)

関連記事

記事リンク
第1回dsPIC33AKシリーズについてdsPIC33Aシリーズに関して – ぴくおの電子工作的な何かWP (electricpico.com)
第2回開発ボード、コンフィグレーション設定、クロック設定についてdsPIC33AKシリーズ②開発ボード,コンフィグレーション設定,クロック設定について – ぴくおの電子工作的な何かWP (electricpico.com)
第3回CPU性能についてdsPIC33AKシリーズ③CPU性能について – ぴくおの電子工作的な何かWP (electricpico.com)
第4回FPU性能についてdsPIC33AKシリーズ④FPU性能について – ぴくおの電子工作的な何かWP (electricpico.com)
第5回DSPについてdsPIC33AKシリーズ⑤DSPについて – ぴくおの電子工作的な何かWP (electricpico.com)
第6回タイマー1割り込みの使い方dsPIC33AKシリーズ⑥Timer1割り込みの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第7回PMUの使い方dsPIC33AKシリーズ⑦PMUの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第8回高速ADCの使い方dsPIC33AKシリーズ⑧高速ADCの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第9回高速OPAMPの使い方dsPIC33AKシリーズ⑨高速OPAMPの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第10回DMAモジュールの使い方dsPIC33AKシリーズ⑩DMAモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第11回WDTモジュールの使い方dsPIC33AKシリーズ⑪WDTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第12回DMTモジュールの使い方dsPIC33AKシリーズ⑫DMTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第13回I/Oインテグリティモニタモジュールの使い方dsPIC33AKシリーズ⑬I/Oインテグリティモニターモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第14回QEIモジュールの使い方dsPIC33AKシリーズ⑭QEIモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第15回UARTモジュールの使い方dsPIC33AKシリーズ⑮UARTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第16回DSPの使い方1 (デジタルフィルタ)dsPIC33AKシリーズ⑯ DSPの使い方1(デジタルフィルタ) – ぴくおの電子工作的な何かWP (electricpico.com)
第17回DSPの使い方2 (FFT)dsPIC33AKシリーズ⑰ DSPの使い方2(FFT) – ぴくおの電子工作的な何かWP (electricpico.com)
第18回DSPの使い方3 (自己相関アルゴリズム)dsPIC33AKシリーズ⑱ DSPの使い方3(自己相関アルゴリズム) – ぴくおの電子工作的な何かWP (electricpico.com)
第19回DSPの使い方4(LMSアルゴリズム)dsPIC33AKシリーズ⑲ DSPの使い方4(LMSアルゴリズム) – ぴくおの電子工作的な何かWP (electricpico.com)
第20回SPIモジュールの使い方dsPIC33AKシリーズ⑳ SPIモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第21回(本記事)高速コンパレータモジュールの使い方1dsPIC33AKシリーズ㉑ 高速コンパレータモジュールの使い方1 – ぴくおの電子工作的な何かWP (electricpico.com)
(fig.1-1)dsPIC33Aシリーズ各関連記事リンク
関連記事リンク
DACモジュールの使い方(三角波出力編)DACモジュールの使い方(三角波出力編) – ぴくおの電子工作的な何かWP (electricpico.com)
(fig.1-2)各関連記事リンク

開発環境

開発環境を以下に示します。
今回はCPUボード(EV02G02A)で動作確認を行います。

項目リンク
ベースボードdsPIC33A CURIOSITY PLATFORM
DEVELOPMENT BOARD
dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com)
CPUボード(EV68M17A)EV68M17A – dsPIC33AK128MC106 Motor Control DIMdsPIC33AK128MC106 Motor Control Dual In-Line Module (DIM) Information Sheet (microchip.com)
CPUボード(EV02G02A)dsPIC33AK128MC106 General Purpose Dual In-Line Module (DIM)dsPIC33AK128MC106 General Purpose Dual In-Line Module (DIM) | Microchip Technology
統合開発環境MPLAB X IDE v6.20MPLAB® X IDE | Microchip Technology
コンパイラMPLAB XC DSC v3.10MPLAB® XC DSC Compiler | Microchip Technology
(fig.2-1)本記事の動作確認環境
(fig.2-2)動作環境

高速アナログコンパレータモジュールについて

ブロック図

高速アナログコンパレータモジュールのブロック図を以下に示します。

(fig.3-1)高速アナログコンパレータモジュールブロック図 (70005539B – p.883 より抜粋)

レジスタ

高速アナログコンパレータモジュールのレジスタとその説明を以下に示します。

レジスタ名(xは1~3)機能説明
DACCTRL1DAC制御レジスタ1DAC全体の補正や設定を行う
DACCTRL2DAC制御レジスタ2遷移状態の設定を行う
DACxCONDACx制御レジスタDACxモジュールの設定レジスタ
DACxDATDACデータレジスタDACHIGHとDACLOWの設定を行う
SLPxCONスロープ制御レジスタスロープの制御設定を行う
SLPxDATスロープデータレジスタスロープデータの設定する
(fig.3-2)高速アナログコンパレータモジュールレジスタ

動作説明

ブロック図

今回は、ポテンショメータの値が閾値を上回るか下回るかをコンパレータで比較し、LED0をハードウェアのみで点灯・消灯させます。

(fig.4-1)ブロック図

ソースコード

コンフィグレーションファイル

コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。

■コンフィグレーションファイル 

■クロック設定ソースファイル

■クロックヘッダーファイル

ソースコード全体

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "config.h"
#include "clock_driver.h"

/*----------------------------------------------------------------------------*/
/* 定数定義*/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*変数定義*/
/*----------------------------------------------------------------------------*/


/*----------------------------------------------------------------------------*/
/**
* @fn          main(int argc, char** argv) 
* @brief       PROJECT_2_5_1_CMPDAC_POTANTION
* @param[in]   argc argument count
* @param[in]   argv argument vector
* @retval      EXIT_SUCCESS 成功
* @retval      EXIT_FAILURE 失敗
* @detail      コンパレータの使い方
* @note        
 */
/*----------------------------------------------------------------------------*/
int main(int argc, char** argv) 
{
     /*-----------------------------------------------------------------------*/
    /*初期化*/
    /*-----------------------------------------------------------------------*/
        vdg_Clock_Set_Register();
    /*-----------------------------------------------------------------------*/
    /*ピン設定*/
    /*-----------------------------------------------------------------------*/
	ANSELAbits.ANSELA4 = 1u;	//PortA4をアナログ入力に設定
	RPOR8bits.RP36R = 32;	       //CMP1 Out
		
    /*-----------------------------------------------------------------------*/
    /* DACCTRL1レジスタ */
    /*-----------------------------------------------------------------------*/
	DACCTRL1 = 0x00000000u;
	DACCTRL1bits.ON = 0u;
	DACCTRL1bits.FCLKDIV = 0u;
	DACCTRL1bits.DNLADJ = 0u;
	DACCTRL1bits.SIDL = 0u;
	DACCTRL1bits.NEGINLADJ = 0x7Fu;
	DACCTRL1bits.POSINLADJ = 0x3Fu;
	DACCTRL1bits.RREN = 0u;

    /*-----------------------------------------------------------------------*/
    /* DACCTRL2レジスタ */
    /*-----------------------------------------------------------------------*/
	DACCTRL2 = 0x00000000u;
	DACCTRL2bits.TMODTIME = 0x01u;
	DACCTRL2bits.SSTIME = 0x8Au;

    /*-----------------------------------------------------------------------*/
    /* DAC1CONレジスタ */
    /*-----------------------------------------------------------------------*/
	DAC1CON = 0x00000000u;

	DAC1CONbits.HYSSEL = 0u;
	DAC1CONbits.HYSPOL = 0u;
	DAC1CONbits.INSEL = 1u;  //CMP1B
	DAC1CONbits.CMPPOL = 0u;
	DAC1CONbits.CMPSTAT = 0u;
	DAC1CONbits.FLTREN = 0u;
	DAC1CONbits.DACOEN = 0u;
	DAC1CONbits.CBE = 0u;
	DAC1CONbits.UPDTMDIS = 0u;
	DAC1CONbits.EXTUPD = 0u;
	DAC1CONbits.IRQM = 0u;
	DAC1CONbits.DACEN = 0u;
	DAC1CONbits.TMCB = 0u;

    /*-----------------------------------------------------------------------*/
    /* DAC1DATレジスタ */
    /*-----------------------------------------------------------------------*/
	DAC1DAT = 0x00000000u;

	DAC1DATbits.DACLOW = 0u;
	DAC1DATbits.DACDAT = 0x7FFu;

    /*-----------------------------------------------------------------------*/
    /* DAC1SLPCONレジスタ */
    /*-----------------------------------------------------------------------*/
	DAC1SLPCON = 0x00000000u;
	SLP1CON = 0x00000000u;
	DAC1SLPDAT = 0x00000000u;
	SLP1DAT = 0x00000000u;

	DAC1CONbits.DACEN = 1u;
	DACCTRL1bits.ON = 1u;
    /*-----------------------------------------------------------------------*/
    /*メインルーチン*/
    /*-----------------------------------------------------------------------*/
        while(1)
        {

	}

    return EXIT_SUCCESS;
}

結果

ポテンションの回転によりLED0が点灯・消灯することが確認できたかと思います。

記事についての注意点

本記事は慎重に内容を検討し正確さに努めておりますが、内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント

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