概要
今回は、dsPIC33AKシリーズの高速コンパレータモジュールの使い方を解説します。
このコンパレータは、主にスイッチング電源やモータ制御に使用されることを想定して設計されています。従来のdsPIC33Cシリーズに比べ、応答速度が15nsecから5nsecへと高速化されており、より迅速な動作が可能です。
dsPIC33Cシリーズからの強化ポイント
・応答速度が15nsecから5nsecへ高速化
・リップルリダクション機能の追加 (DACCTRL1bits.RREN)
・INL/DNLの補正機能追加(DACCTRL1bits.POSINLADJ,DACCTRL1bits.NEGINLADJ,DACCTRL1bits.DNLADJ)
・外部トリガデータ更新機能の追加(DACxCONbits.EXTUPD)
・DAC値遷移モードの追加(DACxCONbits.UPDTMDIS)
関連記事
| 関連記事 | リンク |
| DACモジュールの使い方(三角波出力編) | DACモジュールの使い方(三角波出力編) – ぴくおの電子工作的な何かWP (electricpico.com) |
開発環境
開発環境を以下に示します。
今回はCPUボード(EV02G02A)で動作確認を行います。
| 項目 | 値 | リンク |
| ベースボード | dsPIC33A CURIOSITY PLATFORM DEVELOPMENT BOARD | dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com) |
| CPUボード(EV68M17A) | EV68M17A – dsPIC33AK128MC106 Motor Control DIM | dsPIC33AK128MC106 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.20 | MPLAB® X IDE | Microchip Technology |
| コンパイラ | MPLAB XC DSC v3.10 | MPLAB® XC DSC Compiler | Microchip Technology |

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

レジスタ
高速アナログコンパレータモジュールのレジスタとその説明を以下に示します。
| レジスタ名(xは1~3) | 機能 | 説明 |
| DACCTRL1 | DAC制御レジスタ1 | DAC全体の補正や設定を行う |
| DACCTRL2 | DAC制御レジスタ2 | 遷移状態の設定を行う |
| DACxCON | DACx制御レジスタ | DACxモジュールの設定レジスタ |
| DACxDAT | DACデータレジスタ | DACHIGHとDACLOWの設定を行う |
| SLPxCON | スロープ制御レジスタ | スロープの制御設定を行う |
| SLPxDAT | スロープデータレジスタ | スロープデータの設定する |
動作説明
ブロック図
今回は、ポテンショメータの値が閾値を上回るか下回るかをコンパレータで比較し、LED0をハードウェアのみで点灯・消灯させます。

ソースコード
コンフィグレーションファイル
コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。
■コンフィグレーションファイル
■クロック設定ソースファイル
■クロックヘッダーファイル
ソースコード全体
#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が点灯・消灯することが確認できたかと思います。
記事についての注意点
本記事は慎重に内容を検討し正確さに努めておりますが、内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント