PSMC機能を動作させて見ます(基本編)

〔単相PWM〕 〔相補PWM〕 〔相補PWM-同期〕 〔可変周波数PWM〕 〔PICの動かせ方入門に戻る〕


PSMC(Programmablse Switch Mode Control)モジュールは高性能な16ビットPWM生成器です。
従来の8ビットPWMのECCPやCWG/COG機能と同じ様な物と思って下さい。
「各種スイッチングモード電源、照明アプリケーション、モータ駆動アプリケーションの
 MOSFETスイッチングを、インテリジェントかつ効率的に駆動する為に設計されました。」
だそうです。

PSMCモジュールは以下12種類のPWM波形を生成できます。
単相PWM
相補PWM
・プッシュプルPWM
・相補出力を備えたプッシュプルPWM
・4 系統フルブリッジ出力を備えたプッシュプルPWM
・4 系統フルブリッジ出力と相補出力を備えたプッシュプルPWM
・パルス スキッピングPWM
・相補出力を備えたパルス スキッピングPWM
・ECCP 互換フルブリッジPWM(逆方向)(順方向)
可変周波数 - 固定デューティ サイクルPWM
・相補出力を備えた可変周波数 - 固定デューティ サイクルPWM
・3 相PWM
このなかから紫色の項目についてのみ記載して置きます。
尚、各モードの説明は、こちら(日本語)に概要が有ります。

※ PSMCクロックの64MHzはシステムクロックとは別に、個別に64MHzで動作するクロックです。
※ PSMCクロック=16MHz(Fosc)/8 で最低35Hz辺りから、PSMCクロック=64MHz/1 なら最高8MHz
  まで生成出来そうです。

《PSMC Designer Tool》

PSMCはレジスタに設定して終えば後はハードが行ってくれますがぁ、なんとぉ、レジスタの数が30個。
チョットぉこれじゃ設定作業がもぉ大変ですよね、|||||/ ( ̄ロ ̄;)\|||||||
そこでぇ、この作業を簡単にする為の、PSMC Designer GUIがMICROCHIPからでていましてぇ、
こちらからダウンロード出来ます、ですがぁのちにはMCC機能に統合されると思います。
[Downloads]タブからダウンロードした後、解凍して"PSMCDesigner.exe" を実行するだけです。
尚、PSMC Designer Tool のユーザーズガイドはこちら(日本語)です。
ですのでぇここの記事はこのToolを使った方法で書いて置きます、その方が簡単なのでぇ。
PS. *1)
ツールはMicrochipの16F1786ページからダウンロード出来ます。
ページの「Documents」をクリックし、"User Guides"の項からダウンロード可です。
尚、ユーザーズガイドはここのが最新でしょう英語ですがぁ。

PSMC-Designer
PSMC Designer メイン表示の起動画面

《PSMCピン構成図》

PSMCピン構成図PSMCモジュールは3個です。
PSMC1が6ピン(A/B/C/D/E/F)
PSMC2/PSMC3が2ピン(A/B)
から其々出力できます。

PSMCxIN
ブランキング入力で使用する外部入力ピンです
PSMCxCLK
クロックのソースを外部から入力するピンです



《レジスタ》

ここで記載する”単相PWM”・”相補PWM”・”可変周波数 - 固定デューティ サイクルPWM”に関係する
レジスタのみ説明して置きます。

PWMの概要波形図
PSMCの概要波形の図(単相PWM)
図は、データシートの物を少し手を加えています。
PSMCのクロック(16Bit)に同期して、指定したクロック値で各3種のイベントが発生します。

PSMC 制御レジスタ
PSMCxCONレジスタ構成
ビット








機能
PSMCxEN
PSMCxLD
PxDBFE
PxDBRE
PxMODE
PSMCxEN[7]  :PSMCモジュール使用の有無ビット(全設定が終わった最後に有効にします)
                        0=使用しない  1=使用する
PSMCxLD[6] :PSMCレジスタ更新(転送)ビット
        (レジスタ内容を確実に更新して欲しい時に使用する物だと思ふ)
                        1=PSMCxレジスタは、適切なレジスタの内容で更新する準備が出来ています
                        0=PSMCx バッファ更新完了(ハード側が更新完了後リセットする)
PxDBFE[5]     :PSMC立ち下がりエッジデッドバンドイネーブルビット
                            1=デッドバンド有効  0=デッドバンド無効
PxDBRE[4]     :PSMC立ち上がりエッジデッドバンドイネーブルビット
                            1=デッドバンド有効  0=デッドバンド無効
PxMODE[0:3]:PSMCの動作モードビット
                        0000=単相PWM
                        0001=相補PWM
                        0010=プッシュプルPWM
                        0011=相補出力を備えたプッシュプルPWM
                        0100=4 系統フルブリッジ出力を備えたプッシュプルPWM
                        0101=4 系統フルブリッジ出力と相補出力を備えたプッシュプルPWM
                        0110=パルス スキッピングPWM
                        0111=相補出力を備えたパルス スキッピングPWM
                        1000=ECCP 互換フルブリッジPWM(逆方向)
                        1001=ECCP 互換フルブリッジPWM(順方向)
                        1010=可変周波数 - 固定デューティ サイクルPWM
                        1011=相補出力を備えた可変周波数 - 固定デューティ サイクルPWM
                        1100=3 相PWM

PSMCクロックレジスタ

PSMCxCLKレジスタ構成
ビット








機能


PxCPRE


PxCSRC
PxCPRE[5:4]:PSMCクロックのプリスケーラ選択ビット
                      00=PSMCクロック/1
                      01=PSMCクロック/2
                      10=PSMCクロック/4
                      11=PSMCクロック/8
PxCSRC[1:0]:PSMCクロックのソースを選択するビット
                      00=システムクロック(Fosc)
                      01=64MHzクロック
                              (16 MHzのHFINTOSC周波数を4 xPLLで動作させ、Foscとは別に生成されます)
                      10=PSMCxCLKピン(RA7)からの入力(MAX20MHzまで)

1カウントの計算
1/PSMCクロックソースの周波数) x プリスケーラ設定値
ソースクロック=32MHz、プリスケーラ1:8の場合は、
  ( 1 / 32MHz ) * 8 = 0.25us(250ns)

※ 125Hz以上を生成させるならシステムクロックとは別で動作する、64MHzクロック(01)を選択した方が
  良さげぇです。

周期イベントレジスタ
PSMCxPRレジスタ構成
PSMCxPRL :周期設定レジスタ(LOWバイト)
PSMCxPRH :周期設定レジスタ(HIGHバイト)

※ 1周期あたりに何カウントさせるか設定をします。(PSMCxTMRはこの値までカウントする事になる)
※ 1000us(1KHzの1周期)を作る場合は、1000000ns/250ns=4000カウントさせれば良い事になるが、
  オーバフローは4000カウント+1カウントで発生するので、設定値は4000-1=3999とセットします。

PSMCxPRSレジスタ構成
ビット








機能
PxPRSIN


PxPRSC4 PxPRSC3 PxPRSC2 PxPRSC1 PxPRST
PxPRSIN[7]:PSMCxIN ピン(RB0)でPSMCx周期イベントが発生する
PxPRSC4[4]:sync_C4OUT 出力でPSMCx周期イベントが発生する
PxPRSC3[3]:sync_C3OUT 出力でPSMCx周期イベントが発生する
PxPRSC2[2]:sync_C2OUT 出力でPSMCx周期イベントが発生する
PxPRSC1[1]:sync_C1OUT 出力でPSMCx周期イベントが発生する
PxPRST[0]  :タ イムベースマッチでPSMCx周期イベントが発生する
                     0=Trmeベースは周期イベントを発生させない
                          1=
周期イベントが発生し、PSMCxTMR=PSMCxPRH/Lの時にリセットされます。
複数のソースが周期イベントを強制してPSMCxTMRをリセットする事が出来ます。

立ち上がりイベントレジスタ
PSMCxPHレジスタ構成
PSMCxPHL :位相設定レジスタ(LOWバイト)
PSMCxPHH :位相設定レジスタ(HIGHバイト)

※ 出力パルスの立ち上がりエッジを指定、 1周期の何カウント目で立ち上げるか設定します。

PSMCxPHSレジスタ構成
ビット








機能
PxPHSIN


PxPHSC4 PxPHSC3 PxPHSC2 PxPHSC1 PxPHST
PxPHSIN[7]:PSMCxIN ピン(RB0)でPSMCx立 上がりエッジイベントが発生する
PxPHSC4[4]:sync_C4OUT 出力でPSMCx立上がりエッジイベントが発生する
PxPHSC3[3]:sync_C3OUT 出力でPSMCx立上がりエッジイベントが発生する
PxPHSC2[2]:sync_C2OUT 出力でPSMCx立上がりエッジイベントが発生する
PxPHSC1[1]:sync_C1OUT 出力でPSMCx立上がりエッジイベントが発生する
PxPHST[0]  :タ イムベースマッチでPSMCx立上がりエッジイベントが発生する
                     0=Trmeベースは立上がりエッジイベントを発生させない
                          1=
立上がりエッジイベントがPSMCxTMR=PSMCxPHH/Lの時に発生する
複数のソースが立上がりエッジイベントを強制する事が出来ます。

立ち下がりイベントレジスタ
PSMCxDCレジスタ構成
PSMCxDCL :デュティサイクル設定レジスタ(LOWバイト)
PSMCxDCH :デュティサイクル設定レジスタ(HIGHバイト)

※ 出力パルスの立ち下がりエッジを指定、 1周期の何カウント目で立ち下げるか設定します。

PSMCxDCSレジスタ構成
ビット








機能
PxDCSIN


PxDCSC4 PxDCSC3 PxDCSC2 PxDCSC1 PxDCST
PxDCSIN[7]:PSMCxIN ピン(RB0)でPSMCx立 下がりエッジイベントが発生する
PxDCSC4[4]:sync_C4OUT 出力でPSMCx立下がりエッジイベントが発生する
PxDCSC3[3]:sync_C3OUT 出力でPSMCx立下がりエッジイベントが発生する
PxDCSC2[2]:sync_C2OUT 出力でPSMCx立下がりエッジイベントが発生する
PxDCSC1[1]:sync_C1OUT 出力でPSMCx立下がりエッジイベントが発生する
PxDCST[0]  :タイムベースマッチでPSMCx立下がりエッジイベントが発生する
                     0=Trme ベースは立下がりエッジイベントを発生させない
                          1=
立下がりエッジイベントがPSMCxTMR=PSMCxDCH/Lの時に発生する
複数のソースが立下がりエッジイベントを強制する事が出来ます。

デッドバンドレジスタ
デッドバンドは、相補PWM出力モードのみ適用です。
PSMCxDBRレジスタ
立ち上がりエッジのデッドバンド値を8ビットで設定します。
例えば5us遅延させるには、5000ns/250ns(1カウント時間)=20(0x14)を設定します。
※ PSMCxCONのPxDBREビットを有効にします。

PSMCxDBFレジスタ
立ち下がりエッジのデッドバンド値を8ビットで設定します。
※ PSMCxCONのPxDBFEビットを有効にします。

分数周波数調整レジスタ
可変周波数PWM/相補可変周波数PWMモードのみ適用です。
PSMCxFFAレジスタ
PSMCxFFA[3:0]:0-15カウント内で調整する事になります。
          1カウントは周期レジスタ値と同じです。
※ 出力周波数が高くなる程に微調整は出来なくなります。

出力制御レジスタ
PSMCxSTR0レジスタ構成
ビット








機能


PxSTRF
PxSTRE PxSTRD PxSTRC PxSTRB PxSTRA
PxSTRF[5]:PWM ステアリングPSMCxF出力イネーブルビット(PSMC2/PSMC3は無し)
                   PxMODE[3:0] = 0000(単相PWM)の場合:
                     1 =PSMCxFピン(RC5)単 相PWM 出力がアクティブ
                          0=単 相PWM 出力はPSMCxFピン(RC5)で アクティブではありません
                   PxMODE[3:0] = 0001(相補PWM)の 場合:
                     1 =PSMCxFピン(RC5)相 補PWM 出力がアクティブ
                          0=相 補PWM 出力はPSMCxFピン(RC5)で アクティブではありません
                   PxMODE[3:0] = 1100(3 相PWM)の 場合:
                     1 =PSMCxD及びPSMCxEがHIGH。PSMCxA、 PMSCxB、PSMCxC及びPMSCxFはLOW
                          0=3相出力の組み合わせがアクティブではない

PxSTRE[4]:PWM ステアリングPSMCxE出力イネーブルビット(PSMC2/PSMC3 は無し)
                   PxMODE[3:0] = 000x(単相PWM/相補PWM) の場合:
                     1 =PSMCxEピン(RC4)PWM 出力がアクティブ
                          0=PWM 出力はPSMCxEピン(RC4)で アクティブではありません
                   PxMODE[3:0] = 1100(3 相PWM)の 場合:
                     1 =PSMCxB及びPSMCxEがHIGHPSMCxA、 PMSCxC、PSMCxD及びPMSCxFはLOW
                          0=3相出力の組み合わせがアクティブではない

PxSTRD[3]:PWM ステアリングPSMCxD出力イネーブルビット(PSMC2/PSMC3 は無し)
                   PxMODE[3:0] = 0000(単相PWM)の場合:
                     1 =PSMCxDピン(RC3)単 相PWM 出力がアクティブ
                          0=単 相PWM 出力はPSMCxDピン(RC3)で アクティブではありません
                   PxMODE[3:0] = 0001(相補PWM)の 場合:
                     1 =PSMCxDピン(RC3)相 補PWM 出力がアクティブ
                          0=相 補PWM 出力はPSMCxDピン(RC3)で アクティブではありません
                   PxMODE[3:0] = 1100(3 相PWM)の 場合:
                     1 =PSMCxB及びPSMCxCがHIGHPSMCxA、 PMSCxD、PSMCxE及びPMSCxFはLOW
                          0=3相出力の組み合わせがアクティブではない

PxSTRC[2]:PWM ステアリングPSMCxC出力イネーブルビット(PSMC2/PSMC3 は無し)
                   PxMODE[3:0] = 000x(単相PWM/相補PWM) の場合:
                     1 =PSMCxCピン(RC2)PWM 出力がアクティブ
                          0=PWM 出力はPSMCxCピン(RC2)で アクティブではありません
                   PxMODE[3:0] = 1100(3 相PWM)の 場合:
                     1 =PSMCxC及びPSMCxFがHIGHPSMCxA、 PMSCxB、PSMCxD及びPMSCxEはLOW
                          0=3相出力の組み合わせがアクティブではない

PxSTRB[1]:PWM ステアリングPSMCxB出力イネーブルビット
                   PxMODE[3:0] = 0000(単相PWM)の場合:
                     1 =PSMCxBピン(RC1)単 相PWM 出力がアクティブ
                          0=単 相PWM 出力はPSMCxBピン(RC1)で アクティブではありません
                   PxMODE[3:0] = 0001(相補PWM)の 場合:
                     1 =PSMCxBピン(RC1)相 補PWM 出力がアクティブ
                          0=相 補PWM 出力はPSMCxBピン(RC1)で アクティブではありません
                   PxMODE[3:0] = 1100(3 相PWM)の 場合:
                     1 =PSMCxA及びPSMCxFがHIGHPSMCxB、 PMSCxC、PSMCxD及びPMSCxEはLOW
                          0=3相出力の組み合わせがアクティブではない

PxSTRA[0]:PWM ステアリングPSMCxA出力イネーブルビット
                   PxMODE[3:0] = 000x(単相PWM/相補PWM) の場合:
                     1 =PSMCxAピン(RC0)PWM 出力がアクティブ
                          0=PWM 出力はPSMCxAピン(RC0)で アクティブではありません
                   PxMODE[3:0] = 1100(3 相PWM)の 場合:
                     1 =PSMCxA及びPSMCxDがHIGHPSMCxB、 PMSCxC、PSMCxE及びPMSCxFはLOW
                          0=3相出力の組み合わせがアクティブではない

3相ステアリングモードでは、一度に1つのPxSTRビットのみを設定する必要があります。

     複数のビットがセットされている場合は、最下位ビットのステアリングの組み合わせが優先されます。

PSMCxOENレジスタ構成
ビット








機能


PxOEF PxOEE PxOED PxOEC PxOEB PxOEA
PxOEF[5]:PSMCxF出力ピン(RC5)の指定ビット
                 1=PSMCxF出力ピンをアクティブにする
                 0=PSMCxF出力ピンはデジタルI/Oで使用する
PxOEE[4]:PSMCxE出力ピン(RC4)の指定ビット
                 1=PSMCxE出力ピンをアクティブにする
                 0=PSMCxE出力ピンはデジタルI/Oで使用する
PxOED[3]:PSMCxD出力ピン(RC3)の指定ビット
                 1=PSMCxD出力ピンをアクティブにする
                 0=PSMCxD出力ピンはデジタルI/Oで使用する
PxOEC[2]:PSMCxC出力ピン(RC2)の指定ビット
                 1=PSMCxC出力ピンをアクティブにする
                 0=PSMCxC出力ピンはデジタルI/Oで使用する
PxOEB[1]:PSMCxB出力ピン(RC1)の指定ビット
                 1=PSMCxB出力ピンをアクティブにする
                 0=PSMCxB出力ピンはデジタルI/Oで使用する
PxOEA[0]:PSMCxA出力ピン(RC0)の指定ビット
                 1=PSMCxA出力ピンをアクティブにする
                 0=PSMCxA出力ピンはデジタルI/Oで使用する

(スルーレート制御)

SLRCONxレジスタ(X=A or B or C)
レジスタの各ピンに該当するビットをONにする事により、その対応するポートピンの駆動スルーレートを
変更できます。
立ち上がり時間の速い矩形波をオペアンプに入力し増幅すると出力波形は変化速度が追いつかず傾いた波形
になる事が有るのでこのような時にスルーレートを変更出来る様になっている様です。
デフォルトは制限が掛かっているので早い立ち上がりが欲しい場合は変更しないとダメかもね。

1 = ポートピンのスルーレートを制限する(デフォルト値)
  (波形エッジの立上り/立下りが緩やかになります)
0 = ポートピンのスルーレートを最大にする




リンク切れ見直し(*1) 2020/03/22


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.