高分解能PWMモジュールの使い方2

dsPIC33C

概要

dsPIC33Cシリーズの高分解能PWMモジュールは様々なスイッチングアプリケーションに対応できるようなペリフェラル構成となっています。

前回の記事→高分解能PWMモジュールの使い方1 – ぴくおの電子工作的な何かWP (electricpico.com)

今回は以下のようなフルブリッジ方式の電源回路を駆動させる時に用いられるフェーズシフト波形を生成します。

(fig.1)フルブリッジ方式電源回路

フェーズシフト波形とは大まかに説明しますと
・周波数固定
・Duty50%固定
・どちらかのLegを基準として、もう片方のLegのPhaseを制御
・上下(AとB,CとD)アームは貫通電流が起こらないようにデッドタイム(DTA,DTB,DTC,DTD)を設ける

といった駆動波形になります。

(fig.2)フェーズシフト波形

フルブリッジ・フェーズシフトの詳細は下記のようなサイト様を参考にして下さい。

■位相シフトフルブリッジコンバータ(PSFB)の動作原理(かきエレ)
https://kakitamablog.com/phase-shift-full-bridge-topology/

■PSFB回路の基本構成(Tech Web)
https://techweb.rohm.co.jp/product/power-device/si/si-evaluation/9717/

■位相シフト・フルブリッジCCS ユーザー・ガイド
https://www.ti.com/jp/lit/ug/jaju166/jaju166.pdf?ts=1671367615325&ref_url=https%253A%252F%252Fwww.google.com%252F

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

今回のプログラムはPG2、PG3から相補PWMを出力します。(PG2 = RB12,RB13,PG3 = RB10,RB11ピン)

(fig.3) dsPIC33CH Curiosityボード外観

レジスタ

関連レジスタに関しては非常に多いため、今回の動作に関係する部分だけ抜粋します。

レジスタ名機能説明
PCLKCONPWM CLOCK CONTROL REGISTERPWMクロックを制御
PGxCONLGENERATOR x CONTROL REGISTER LOWPGxのクロックや動作モードの設定を行います
PGxIOCONHPWM GENERATOR x I/O CONTROL REGISTER LOWPGxの出力ピンに関する設定を行います
PGxPERPWM GENERATOR x PERIOD REGISTERPGxの周期を設定します
PGxPHASEPWM GENERATOR x PHASE REGISTERPGxの位相を設定します
PGxDCPWM GENERATOR x DUTY CYCLE REGISTERPGxのデューティを設定します
PGxDTH
PGxDTL
PWM GENERATOR x DEAD-TIME REGISTERPGxのデッドタイムを設定します
PGxEVTLPWM GENERATOR x EVENT REGISTER LOWPGxのイベントに関する設定を行います
(fig.3)高分解能PWM関連レジスタ

ソースコード

コードに関しては特段説明する部分は有りませんが、下記のPG3PHASEレジスタで位相を設定します。

PG3PHASE = 500;

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

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

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

クロック設定について

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

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

/*----------------------------------------------------------------------------*/
/* <Chapter>        CHAPTER_2_8_2_HRPWM */
/* <Function>       フェーズシフト信号を出力 */
/* <Peripharal>     PWM関連 */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* コンフィグレーション設定*/
/*----------------------------------------------------------------------------*/
//ここにコンフィグレーション設定を挿入する//
/*----------------------------------------------------------------------------*/
/* インクルードファイル*/
/*----------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
/*----------------------------------------------------------------------------*/
/* 定数定義*/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* 変数定義*/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* クロック設定 */
/*----------------------------------------------------------------------------*/
//ここにクロック設定ソースを挿入する//
/*----------------------------------------------------------------------------*/
/* Main関数 */
/*----------------------------------------------------------------------------*/
int main(int argc, char** argv) 
{
    /*------------------------------------------------------------------------*/
    /* クロック初期化*/
    /*------------------------------------------------------------------------*/
        vds_Main_Init_Clock_Register();     /* クロック初期化 */
    /*------------------------------------------------------------------------*/
    /* GPIO初期化*/
    /*------------------------------------------------------------------------*/
    /*------------------------------------------------------------------------*/
    /* PWM初期化*/
    /*------------------------------------------------------------------------*/
        PG2CONLbits.ON = 0u;
        PG3CONLbits.ON = 0u;
    /*------------------------------------------------------------------------*/
    /* PWMクロックの設定*/
    /*------------------------------------------------------------------------*/
        PCLKCONbits.MCLKSEL = 3u;    /* Auxiliary PLL post-divider output*/
    /*------------------------------------------------------------------------*/
    /* PGx制御レジスタLの設定*/
    /*      周期はマスターピリオドレジスタ(MPER)を使用*/
    /*------------------------------------------------------------------------*/
        PG2CONLbits.CLKSEL = 1u;
        PG2CONLbits.MODSEL = 1u;
        PG3CONLbits.CLKSEL = 1u;
        PG3CONLbits.MODSEL = 1u;
    /*------------------------------------------------------------------------*/
    /* PGx制御レジスタHの設定*/
    /*      周期はマスターピリオドレジスタ(MPER)を使用*/
    /*------------------------------------------------------------------------*/
        PG2CONH = 0x4000;
        PG3CONH = 0x4000;
    /*------------------------------------------------------------------------*/
    /* PGxIOレジスタHの設定*/
    /*      PWMジェネレータがピンを使用する*/
    /*------------------------------------------------------------------------*/
        PG2IOCONH = 0x000C;
        PG3IOCONH = 0x000C;
    /*------------------------------------------------------------------------*/
    /* PGxIOレジスタLの設定*/
    /*      PCI電流リミットが発生した時にCLDATの値を使用*/
    /*      CLDAT = PWMxHがLow,PWMxLがHigh*/
    /*------------------------------------------------------------------------*/
        PG2IOCONL = 0x0010;
        PG3IOCONL = 0x0010;
    /*------------------------------------------------------------------------*/
    /* 周期/Duty/フェーズの設定*/
    /*------------------------------------------------------------------------*/
        MPER = 5000;        /* 周期レジスタ */
        PG2DC = MPER >> 1u; /* PG2 Dutyレジスタ*/
        PG2PHASE = 0;
        PG3DC = MPER >> 1u; /* PG3 Dutyレジスタ*/
        PG3PHASE = 500;
        
    /*------------------------------------------------------------------------*/
    /* デッドタイムの設定*/
    /*------------------------------------------------------------------------*/
        PG2DTH = 100;
        PG2DTL = 100;
        PG3DTH = 100;
        PG3DTL = 100;
    /*------------------------------------------------------------------------*/
    /* ブランキングの設定*/
    /*      PWMxHの立ち上がりでLEBカウンタをクリアする*/
    /*------------------------------------------------------------------------*/
        PG2LEBH = 0x0008u;
        PG2LEBL = 200u;
        PG3LEBH = 0x0008u;
        PG3LEBL = 200u;
    /*------------------------------------------------------------------------*/
    /* PCI電流制御レジスタHの設定*/
    /*------------------------------------------------------------------------*/
        PG2CLPCIH = 0x0300;
        PG3CLPCIH = 0x0300;
    /*------------------------------------------------------------------------*/
    /* PWMの有効化*/
    /*------------------------------------------------------------------------*/
        PG2CONLbits.ON = 1u;
        PG3CONLbits.ON = 1u;
    /*------------------------------------------------------------------------*/
    /* メインルーチン*/
    /*------------------------------------------------------------------------*/
        while(1)
        {
        }
}

結果

PG2(Ach,Bch)に対しPG3(ChC,ChD)の位相が約1usecずれている事が確認できます。

(fig.4)フェーズシフト波形

参考

コメント

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