概要
dsPIC33CHシリーズにはハードウェアでアナログ電圧を比較するアナログコンパレータがマスターコアに1ch、スレーブコアに3ch搭載されております。このアナログコンパレータの正極は入力ピンに、負極は内部DACモジュールに接続されています。またマスターとスレーブで4chある中1chだけDACの電圧が外部に出力可能です。(fig.1)
デジタルデータをアナログ電圧に変換するコンバータのこと

前回の記事にも触れましたが4chのD-Aコンバータにはそれぞれスロープ補償モジュールが搭載されています。
スイッチング電源をピーク電流モードで駆動させ、且つPWMのDutyが50%以上の場合に発生する低調波発振という現象を防止する役目。
PWMのON後上昇するインダクタ電流 i が閾値 iREFを超えた時にPWMをOFFするピーク電流モードにおいて、スロープ補償を使わないとPWMが低調波で発振します(fig.2)
このiREFをPWM開始から徐々に下降させる事で、低調波発振を防止します(fig.3)


スロープモジュールはDACモジュールに対し加算もしくは減算の制御を行い、DACの出力を自動で可変させます。
今回は三角波出力モードとして動作させます。
ハードウェア構成と制御ブロック
周辺モジュールはSLP1とDAC1を使用します。三角波出力モードの場合、SLP1モジュールがDACxHとDACxL間を交互に自動でスイープしてくれるため、ソフトウェアの介在は必要ありません。

ソースコード
DAC1DATH(上限値),DAC1DATL(下限値),SLP1DAT(速度)を変更し実験しました。DACxDATHとDACxDATL、SLPxDATの関係式は
$$SLPxDAT=((DACxDATH – DACxDATL)・16)/(SlopeSpeed / (2/500MHz)) $$
| マクロ名 | 機能 | 範囲 |
| DACxDATH | DACの上限値設定 | 0~4095 |
| DACxDATL | DACの下限値設定 | 0~4095 |
| SLP1DAT | スロープ速度 | 0~65535 |
コンフィグレーション設定についてはコンフィグレーション設定に記載しております。
コピーして下記のソースコードの「 //ここにコンフィグレーション設定を挿入する// 」の位置に挿入してください。
クロック設定用関数 vds_Main_Init_Clock_Register(); のソースコードはクロック設定のページに記載しております。
コピーして下記のソースコードの「 //ここにクロック設定ソースをコピペする// 」の位置に挿入してください。
/*------------------------------------------------------------------------------*/
/* @file CMP_DAC_TRI.c */
/* @brief DACOUTから三角波を出力 */
/* @details GPIO(TRIS,LAT) */
/* DAC(DACCTRL1L,DACCTRL2H,DACCTRL2L,DAC1CONL,DAC1DATH) */
/* DAC(DAC1DATH,DAC1DATL,SLP1CONH,SLP1DAT) */
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/* コンフィグレーション設定*/
/*------------------------------------------------------------------------------*/
//ここにコンフィグレーション設定を挿入する//
/*------------------------------------------------------------------------------*/
/* インクルードファイル*/
/*------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
/*------------------------------------------------------------------------------*/
/* 定数定義*/
/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/
/* クロック設定 */
/*------------------------------------------------------------------------------*/
//ここにクロック設定ソースを挿入する//
/*------------------------------------------------------------------------------*/
/* Main関数 */
/*------------------------------------------------------------------------------*/
int main(int argc, char** argv)
{
/*-----------------------------------------------------------------------------*/
/* クロック初期化*/
/*-------------------------------------------------------------------------*/
vds_Main_Init_Clock_Register(); /* クロック初期化 */
/*-------------------------------------------------------------------------*/
/* GPIO初期化*/
/*-------------------------------------------------------------------------*/
ANSELBbits.ANSELB2 = 1u; /* RB2ピンはアナログピン(DACOUT1) */
/*-------------------------------------------------------------------------*/
/* CMP初期化*/
/*-------------------------------------------------------------------------*/
DACCTRL1L = 0x0000u;
DACCTRL1Lbits.CLKSEL = 0u; /* DACクロック源( 0 = AFVCO/2 = 500MHz) */
DACCTRL1Lbits.CLKDIV = 0u; /* DACクロックディバイダ (0 = 1/1) */
DACCTRL1Lbits.FCLKDIV = 7u; /*コンパレータフィルタクロックディバイダ*/
DACCTRL1Lbits.DACON = 1u; /* モジュール有効化(0 = 無効,1 = 有効) */
DACCTRL2H = 0x001Au; /* 移行開始からの時間 */
DACCTRL2L = 0x0055u; /* 遷移モードの継続時間 */
DAC1CONH = 0x0000u;
DAC1CONL = 0x0000u;
DAC1CONLbits.INSEL = 0u; /* コンパレータソース*/
DAC1CONLbits.HYSSEL = 1u; /* コンパレータヒステリシス (1 = 15mV) */
DAC1CONLbits.DACOEN = 1u; /* DAC外部出力 (0 = 無効,1 = 有効) */
DAC1DATH = 0x07FFu; /* コンパレータ比較値上限 */
DAC1DATL = 0x0300u; /* コンパレータ比較値下限 */
/*-------------------------------------------------------------------------*/
/* SLOPE初期化*/
/*-------------------------------------------------------------------------*/
SLP1CONH = 0x0000u;
SLP1CONHbits.TWME = 1u; /* 三角波出力モード有効 */
SLP1CONL = 0x0000u;
SLP1DAT = 0x0001u; /* スロープ速度 */
/*-------------------------------------------------------------------------*/
/* DAC1の有効化*/
/*-------------------------------------------------------------------------*/
DAC1CONLbits.DACEN = 1u; /* DAC1の有効化 */
/*-------------------------------------------------------------------------*/
/* メインルーチン*/
/*-------------------------------------------------------------------------*/
while(1)
{
/*-----------------------------------------------------------------*/
/*【****】何もなし*/
/*-----------------------------------------------------------------*/
}
}
結果
前述の計算式通りの波形が出力されています。





コメント