概要
dsPIC33Cシリーズの高分解能PWMモジュールは様々なスイッチングアプリケーションに対応できるようなペリフェラル構成となっています。
前回の記事→高分解能PWMモジュールの使い方1 – ぴくおの電子工作的な何かWP (electricpico.com)
今回は以下のようなフルブリッジ方式の電源回路を駆動させる時に用いられるフェーズシフト波形を生成します。

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

フルブリッジ・フェーズシフトの詳細は下記のようなサイト様を参考にして下さい。
■位相シフトフルブリッジコンバータ(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ピン)

レジスタ
関連レジスタに関しては非常に多いため、今回の動作に関係する部分だけ抜粋します。
| レジスタ名 | 機能 | 説明 |
| PCLKCON | PWM CLOCK CONTROL REGISTER | PWMクロックを制御 |
| PGxCONL | GENERATOR x CONTROL REGISTER LOW | PGxのクロックや動作モードの設定を行います |
| PGxIOCONH | PWM GENERATOR x I/O CONTROL REGISTER LOW | PGxの出力ピンに関する設定を行います |
| PGxPER | PWM GENERATOR x PERIOD REGISTER | PGxの周期を設定します |
| PGxPHASE | PWM GENERATOR x PHASE REGISTER | PGxの位相を設定します |
| PGxDC | PWM GENERATOR x DUTY CYCLE REGISTER | PGxのデューティを設定します |
| PGxDTH PGxDTL | PWM GENERATOR x DEAD-TIME REGISTER | PGxのデッドタイムを設定します |
| PGxEVTL | PWM GENERATOR x EVENT REGISTER LOW | PGxのイベントに関する設定を行います |
ソースコード
コードに関しては特段説明する部分は有りませんが、下記の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ずれている事が確認できます。



コメント