top of page

PICのPSMCを試してみる 相補PWM

投稿日 2017/01/04

新しいPICマイコンに搭載されているPSMC(Programmable Switch Mode Controller)を試してみました。PSMCは多機能な16ビットのパルス幅変調器(PWM)です。今回はPSMCがサポートする12種類のPWMのうち、前回の単相PWMに続き、相補PWM信号を作ってみました。前回の単相PWMについては以下をご覧ください。

 

関連記事:PICのPSMCを試してみる 単相PWM 

 

なお、PSMCにはマイクロチップ社から日本語訳のアプリケーションノートAN1468が公開されています。(ただしほとんどモードの説明だけです)

 

相補PWMは、同期整流型のDC-DCコンバータで使用されます。同期整流では、2つのパワーMOSFETを交代でON/OFFしますが、タイミング的に同時にONになる時間があるとまずいので、デッドバンドという、両方がOFFの時間を設けることが特徴です。

 

PSMCのブロック図を以下に示します。

PSMC_01.jpg

PSMCのブロック図

Microchip社 PIC 16F1783のデータシートより抜粋

 

相補PWMでは、AからFまでの6本の出力端子のうち、2つずつを割り当てます。それらを直接パワーMOSFETのゲートに接続するわけにはいきませんので、実際にはドライバーを介します。

 

単相‘PWMと同じようにPWM信号の周期(period)を決め、その中で立ち上がり、立下りタイミングを決めます。各レジスタの設定方法は単相PWMと似ていますので、単相PWMの設定を相補PWMに切り替える形で変更してみました。

 

単相PWMから相補PWMの変更箇所は、

 

PSMCxCONレジスタのPxMODEを1(相補PWM)にする

PSMC1CONbits.P1MODE = 1;  //相補PWM

 

立ち上がり、立ち下がりのデッドバンドを有効にする

PSMC1CONbits.P1DBFE = 1; //立ち下がりのデッドバンド有効

PSMC1CONbits.P1DBRE = 1; //立ち上がりのデッドバンド有効

 

PSMCxAピンとPSMCxBピンを有効にする

PSMC1OENbits.P1OEA = 1; //PSMC1Aピン有効

PSMC1OENbits.P1OEB = 1; //PSMC1Bピン有効

 

論理を決める(この場合A/Bピンとも正論理(アクティブ・ハイ)

PSMC1POLbits.P1POLA = 0; //PSMC1A アクティブ・ハイ

PSMC1POLbits.P1POLB = 0; //PSMC1B アクティブ・ハイ

 

デッドバンドの時間を指定する( 1 / 64000000 x 10) ns

PSMC1DBR = 10; //約160ns

PSMC1DBF = 10;

 

AからFピンの担当出力を設定する

PSMC1STR0bits.P1STRA = 1; //PSMC1A 単一PWM出力

PSMC1STR0bits.P1STRB = 1; //PSMC1B 相補PWM出力

 

相補PWMはこのように2つのピンをペアにして使いますが、CとD、EとFも同じように設定すれば同時に相補PWM信号を出力することができます。

 

相補PWMの設定例

 

    PSMC1CONbits.P1MODE = 1; //相補PWM

 

    PSMC1CONbits.P1DBFE = 1; //立ち下がりのデッドバンド有効

    PSMC1CONbits.P1DBRE = 1; //立ち上がりのデッドバンド有効

    PSMC1CLKbits.P1CPRE = 0; //プリスケーラ1:1
    PSMC1CLKbits.P1CSRC = 1; //Clock source 64MHz

    PSMC1OENbits.P1OEA = 1; //PSMC1Aピン有効

    PSMC1OENbits.P1OEB = 1; //PSMC1Bピン有効

    PSMC1POLbits.P1POLA = 0; //PSMC1A アクティブ・ハイ

    PSMC1POLbits.P1POLB = 0; //PSMC1B アクティブ・ハイ

 

    PSMC1STR0bits.P1STRA = 1; //PSMC1A 単一PWM出力

    PSMC1STR0bits.P1STRB = 1; //PSMC1B 相補PWM出力

    PSMC1PRSbits.P1PRST = 1; //PSMC1PRH/Lとの比較でタイマリセット
    PSMC1PHSbits.P1PHST = 1; //PSMC1PHH/Lとタイマとの比較で立ち上げ
    PSMC1DCSbits.P1DCST = 1; //PSMC1DCH/Lとタイマとの比較で立ち下げ


    //Period

    period = 100; //100KHz

  PSMC1PRH = (64000 / period - 1) >> 8;
    PSMC1PRL = (64000 / period - 1) & 0xFF;

 

    //Phase

    PSMC1PHH = 0;

    PSMC1PHL = 0;


    //Duty
    PSMC1DCH = (( 64000 / period - 1) / 2 ) >> 8; //Duty = 50%
    PSMC1DCL = (( 64000 / period - 1) / 2 ) & 0xFF;  
  

    //Deadband

    PSMC1DBR = 10; //156nS

    PSMC1DBF = 10;

 

    PSMC1INT = 0;
     
    PSMC1CONbits.PSMC1EN = 1;
    PSMC1CONbits.PSMC1LD = 1;

PSMC_03.jpg

上記の設定で観測した相補PWMの波形 3.3Vpp

Period=10uS(100KHz), Phase=0, Duty=50%

PSMC_04.jpg

上記の設定で観測した相補PWMの波形 3.3Vpp

デッドバンドを観測

AとBの間に約160nSのOFF期間(デッドバンド)が確認できる

 

 

相補PWMによって、同期整流型のDC-DCコンバータを制御する場合、2つのパワーMOSFETが同時にONになることがないようデッドバンドを設けます。パワーMOSFETのゲートドライバの中には単一のPWM信号を入力すれば相補PWM信号にして、デッドバンドも自動的に入れてくれるものがありますが、このようにマイコン制御で細かく設定が変えられるのは便利です。

 

 

 

 

(JF1VRR)

jf1vrr(AT)jarl.com

本サイトの文章や写真などには、一部の引用を除いてすべてに著作権が設定されています。

Copyright (C) 2007 - 2024 Kumagoro & JF1VRR All Rights Reserved.

​このサイトはWixを使用して作られています。

bottom of page