PSMC機能を動作させて見ます(可変周波数PWM)

〔基本編〕 〔単相PWM〕 〔相補PWM〕 〔相補PWM-同期〕   〔PICの動かせ方入門に戻る〕


"PSMC Designer Tool"の話とPSMC関連ピン構成にレジスタ説明は基本編にて記載しました。
このページでは、"PSMC Designer Tool"を使った可変周波数PWM(固定デューティ サイクル モード)の
生成方法を説明します。

《可変周波数PWM》

設定は、PSMCクロックソース=64MHz、プリスケーラ=1:1なので1カウントは16nsとなります。
可変周波数PWMは、PWM出力に分数周波数調整機能(FFA)が有り周波数を微調整する事が出来ます。
「分数周波数調整は、デューティサイクルが50%固定の信号に対してPWM分解能を向上できる手法です。
 計算で求めたインターバル毎にPWM周期を1カウントずつ変更する事で、より高い分解能が得られます。
 分解能が向上するのは、多数のPWM周期にわたってPWM周波数が平均化される為です。」
とデータシートに有るがぁ、チンプンカンプンで〜すぅ。
PSMCモジュールはPSMC1として、PWM出力ピンはRC0(PSMC1A)ピンのみとなっています。

可変周波数PWM波形
データシートから拝借しました。
可変周波数PWMの場合は、周期イベントのみ使用します
PSMCクロックの2サイクルを1周期とした50%固定デューティ比です。
なのでぇ、周期レジスタに10KHzと設定した場合、実際の出力は5KHzとなります。

※ PSMCクロックソース=Fosc を選択した場合で、周期レジスタに10KHzと設定したら10KHzで出力
  したぞぉ? なんだべさぁ。

@ 使用するデバイスとモジュール(PSMC1)を選択します。
Toolのデバイス設定

PSMC-EnablePSMCモジュールの "Enable"にチェックを入れます。


A PSMCクロックのソースを設定します。
  Toolのメイン画面表示から【Clock】をクリックします。
ClockClockSource=64MHz
Prescale=1:1
(高速PWMにしてみた)

設定完了なら[Hide]ボタンを
クリック


1カウントの計算
(1/PSMCクロックソースの周波数) x プリスケーラ設定値
  (1/64MHz)*1=15.625ns(16ns)

※ 外部ピン(PSMCxCLK)から入力可能最高周波数は20MHzまでらしい。
※ 設定されるレジスタはPSMCxCLKです。

B 周期イベントの設定を行います。
  Toolのメイン画面表示から【Period Event】をク リックします。
PeriodEvent
・生成する周波数(Period Freq)を入力します、ここでは10KHz(Freq)を作成します。
なのでぇ、20KHzと入力します。
ですがぁ、テスタで測定したら"9.985Hz"で[FFA]で調整して見たが上手く行かず、
でぇ、20.031KHzと入力したらテスター表示10.00KHz。
PSMCxPRH/PSMCxPRL=3194と設定される、
((3194+1)*16ns)*2=102.240us」
赤線枠内のXをクリックし配線します。
設定されるレジスタはPSMCxPRSです。
 設定完了なら[Hide]ボタンをクリックします。
※ 周波数を入力して[Enter]を押すと設定出来なければ、近場の周波数で表示される。

C PSMCの使用するモード(可変周波数PWM)を選択します。
  Toolのメイン画面表示から【Mode Control】をクリックします。
ModeControl
FDC」のタブを選択して[Hide]ボタンをクリックします。
設定されるレジスタはPSMCxCONです。
可変周波数PWMはチャンネルAのみとなります。
相補可変周波数PWM(FDCC)時はチャンネルA/Bでデッドバンド設定ありです。

 分数周波数調整について

 可変周波数PWMは出力周波数の微調整が出来ます。

上図画面の上側 [FFA] をクリックすると周波数の調整設定画面です。
FFA設定画面
・[Freq]か[Time]の調整したい設定方法を選びます。
赤線枠をクリックして調整値リストを表示させます。

FFA(Freq)リスト画面  FFA(Time)リスト画面
左が[Freq]で、右が[Time]の調整値リスト
周期設定レジスタと同じ値が表示されていて
1カウント毎に調整した16個の値から選択します。
設定されるレジスタはPSMCxFFA[3:0](4ビット使用する)です。
設定完了なら[Hide]ボタンをクリックします。

色々設定して見たが本当に微調整らしくあんまり変らなかった様なぁ、みたいなぁ。
使い方は、周期設定レジスタで調整後、FFAで微調整って感じぃみたいなぁ。

D 出力ピンの設定を行います。
  Toolのメイン画面表示から【Output Control】をクリックします。
OutputControl
チャンネルAのみなのでPSMC1A(RC0)ですね。
赤線枠内AのをクリックしPSMC用ピンに割り当てます。
設定されるレジスタはPSMCxOENです。
設定完了なら[Hide]ボタンをクリックします。

これで可変周波数PWMにおける設定は完了です。

設定情報の収得G 設定した情報を得ます。

 Toolのメイン画面表示の右側に有る[Copy and Show]ボタンを
 クリックします。
 下に各レジスタの設定内容が表示され、
 クリップボードにもコピーされています。
 なのでぇ、後はプログラムにペーストしましょう。

 可変周波数PWMで使用しないレジスタも設定されているので
 見通しが良くないです。

 サンプルプログラムは"FDC.c"を参照下さい。

下記内容がペーストした結果です。(可変周波数PWMではオレンジ色のレジスタが必要です)
	PSMC1CON  = 0x00;
PSMC1MDL = 0x00;
PSMC1SYNC = 0x00;
PSMC1CLK = 0x01;
PSMC1POL = 0x00;
PSMC1BLNK = 0x00;
PSMC1REBS = 0x00;
PSMC1FEBS = 0x00;
PSMC1PHS = 0x00;
PSMC1DCS = 0x00;
PSMC1PRS = 0x01;
PSMC1ASDC = 0x00;
PSMC1ASDL = 0x00;
PSMC1ASDS = 0x00;
PSMC1PHH = 0x00;
PSMC1PHL = 0x00;
PSMC1DCH = 0x00;
PSMC1DCL = 0x00;
PSMC1PRH = 0x0C;
PSMC1PRL = 0x7A;
PSMC1DBR = 0x00;
PSMC1DBF = 0x00;
PSMC1FFA = 0x00;
PSMC1BLKR = 0x00;
PSMC1BLKF = 0x00;
PSMC1STR0 = 0x00;
PSMC1STR1 = 0x00;
PSMC1INT = 0x00;
PSMC1OEN = 0x01;
PSMC1CON = 0x8A;
PIE4 &= 0xEE;
PIE4 |= 0x00;

(出力結果)

このページで設定した内容での出力結果をロジックアナライザで見てみます。

出力結果(調整前)
PSMCxPRH/L=0x0C7F(20KHz)設定なので10KHzそのままの出力です。
尚、EFAは0設定です。
(3199(0x0C7F)+1)*15.625ns=50000ns
2サイクルで1周期なので
50000*2=100us(10KHz)
因みにテスターでの測定は"9.985KHz"
ここで"EFA"を設定して見たがぁ、あんまり変らなかった!

出力結果(調整後)
なのでぇ、PSMCxPRH/L=0x0C7A(20.031KHz)に設定した画面
テスター測定は"10.00KHz"だった。
((0x0C7A+1)*15.625ns)*2=99843.75ns(10.015KHz)
周期レジスタのみ調整でEFAは0のままです。

(その他)

う〜ん、EFAの使い処が今一つ解らない?
PSMCxPRH/L=0x0003(16MHz設定)で8MHz(テスターは7.99MHz)まで位なら出力出来そうですね。
だけどね、カウント値=0x03しかないのでEFAの微調整(1カウントずつ調整するので)は不可ですね。
って事は、EFA調整は1周期に沢山カウント値が有る方が良いという事ですよね。
でもぉ、有りすぎる(低い周波数)とぉ、調整しても大して変化が無いという事ですよね。




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