DACモジュールの使い方(三角波出力編)

DACモジュールの使い方

概要

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

DACとは

デジタルデータをアナログ電圧に変換するコンバータのこと

(fig.1)アナログコンパレータブロック DS70005280A_JP-p.3より抜粋

前回の記事にも触れましたが4chのD-Aコンバータにはそれぞれスロープ補償モジュールが搭載されています。

スロープ補償とは

スイッチング電源をピーク電流モードで駆動させ、且つPWMのDutyが50%以上の場合に発生する低調波発振という現象を防止する役目。

PWMのON後上昇するインダクタ電流 i が閾値 iREFを超えた時にPWMをOFFするピーク電流モードにおいて、スロープ補償を使わないとPWMが低調波で発振します(fig.2)

このiREFをPWM開始から徐々に下降させる事で、低調波発振を防止します(fig.3)

(fig.2)スロープ補償を使わないピーク電流モード波形  DS70005280A_JP-p.22より抜粋
(fig.3)スロープ補償を使ったピーク電流モード波形   DS70005280A_JP-p.22より抜粋

スロープモジュールはDACモジュールに対し加算もしくは減算の制御を行い、DACの出力を自動で可変させます。

今回は三角波出力モードとして動作させます。

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

周辺モジュールはSLP1とDAC1を使用します。三角波出力モードの場合、SLP1モジュールがDACxHとDACxL間を交互に自動でスイープしてくれるため、ソフトウェアの介在は必要ありません。

(fig.4)全体ブロック図

ソースコード

DAC1DATH(上限値),DAC1DATL(下限値),SLP1DAT(速度)を変更し実験しました。DACxDATHとDACxDATL、SLPxDATの関係式は

$$SLPxDAT=((DACxDATH – DACxDATL)・16)/(SlopeSpeed / (2/500MHz)) $$

マクロ名機能範囲
DACxDATH DACの上限値設定0~4095
DACxDATL DACの下限値設定 0~4095
SLP1DAT スロープ速度0~65535
(fig.5)調整レジスタ
コンフィグレーション設定について

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

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

クロック設定について

クロック設定用関数 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)
        {
            /*-----------------------------------------------------------------*/
            /*【****】何もなし*/
            /*-----------------------------------------------------------------*/ 
        }
}

結果

前述の計算式通りの波形が出力されています。

(fig.6)DAC1DATH = 0x0FFFu; DAC1DATL = 0x0000u; SLP1DAT = 0x0001u;
(fig.7)DAC1DATH = 0x0FFFu; DAC1DATL = 0x0000u; SLP1DAT = 0x0010u;
(fig.8)DAC1DATH = 0x07FFu; DAC1DATL = 0x0300u; SLP1DAT = 0x0001u;

コメント

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