dsPIC33AKシリーズ㉓ 高速PWMモジュールの使い方(MCシリーズ)

dsPIC33Aシリーズ

概要

今回は高速PWMについて紹介します。

dsPIC33AKシリーズのPWMモジュールは、dsPIC33Cシリーズと比較して、PWMの分解能やタイムベースの幅が拡張されています(詳細は下表をご参照ください)。
さらに、レジスタの32bit化により、いくつかのレジスタが統合されていますが、機能自体には大きな変更は見られません。
(2nd Generation のPWMモジュールについては現時点(24/9/17)で不明です)

dsPIC33C
(MCシリーズ)
dsPIC33C
(K,Hシリーズ)
dsPIC33AK
(MCシリーズ)
dsPIC33AK
(2nd Generation)
高分解能PWM(ペア)4848
PWM分解能(ps)2000250125078
PWMタイムベース16bit16bit20bit20bit
コンビネーショントリガ4pair4pair6pair8pair
(fig.0-1)各シリーズの諸元表

関連記事

記事リンク
第1回dsPIC33AKシリーズについてdsPIC33Aシリーズに関して – ぴくおの電子工作的な何かWP (electricpico.com)
第2回開発ボード、コンフィグレーション設定、クロック設定についてdsPIC33AKシリーズ②開発ボード,コンフィグレーション設定,クロック設定について – ぴくおの電子工作的な何かWP (electricpico.com)
第3回CPU性能についてdsPIC33AKシリーズ③CPU性能について – ぴくおの電子工作的な何かWP (electricpico.com)
第4回FPU性能についてdsPIC33AKシリーズ④FPU性能について – ぴくおの電子工作的な何かWP (electricpico.com)
第5回DSPについてdsPIC33AKシリーズ⑤DSPについて – ぴくおの電子工作的な何かWP (electricpico.com)
第6回タイマー1割り込みの使い方dsPIC33AKシリーズ⑥Timer1割り込みの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第7回PMUの使い方dsPIC33AKシリーズ⑦PMUの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第8回高速ADCの使い方dsPIC33AKシリーズ⑧高速ADCの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第9回高速OPAMPの使い方dsPIC33AKシリーズ⑨高速OPAMPの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第10回DMAモジュールの使い方dsPIC33AKシリーズ⑩DMAモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第11回WDTモジュールの使い方dsPIC33AKシリーズ⑪WDTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第12回DMTモジュールの使い方dsPIC33AKシリーズ⑫DMTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第13回I/Oインテグリティモニタモジュールの使い方dsPIC33AKシリーズ⑬I/Oインテグリティモニターモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第14回QEIモジュールの使い方dsPIC33AKシリーズ⑭QEIモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第15回UARTモジュールの使い方dsPIC33AKシリーズ⑮UARTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第16回DSPの使い方1 (デジタルフィルタ)dsPIC33AKシリーズ⑯ DSPの使い方1(デジタルフィルタ) – ぴくおの電子工作的な何かWP (electricpico.com)
第17回DSPの使い方2 (FFT)dsPIC33AKシリーズ⑰ DSPの使い方2(FFT) – ぴくおの電子工作的な何かWP (electricpico.com)
第18回DSPの使い方3 (自己相関アルゴリズム)dsPIC33AKシリーズ⑱ DSPの使い方3(自己相関アルゴリズム) – ぴくおの電子工作的な何かWP (electricpico.com)
第19回DSPの使い方4(LMSアルゴリズム)dsPIC33AKシリーズ⑲ DSPの使い方4(LMSアルゴリズム) – ぴくおの電子工作的な何かWP (electricpico.com)
第20回SPIモジュールの使い方dsPIC33AKシリーズ⑳ SPIモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第21回高速コンパレータモジュールの使い方1dsPIC33AKシリーズ㉑ 高速コンパレータモジュールの使い方1 – ぴくおの電子工作的な何かWP (electricpico.com)
第22回CBGモジュールの使い方dsPIC33AKシリーズ㉒ CBGモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第23回(本記事)高速PWMの使い方投稿を編集 “dsPIC33AKシリーズ㉓ 高速PWMについて” ‹ ぴくおの電子工作的な何かWP — WordPress (electricpico.com)
(fig.1-1)各関連記事リンク
関連記事リンク
高分解能PWMモジュールの使い方1高分解能PWMモジュールの使い方1 – ぴくおの電子工作的な何かWP (electricpico.com)
高分解能PWMモジュールの使い方2高分解能PWMモジュールの使い方2 – ぴくおの電子工作的な何かWP (electricpico.com)
高分解能PWMモジュールの使い方3
(コンビネーションロジック)
高分解能PWMモジュールの使い方3(コンビネーションロジック) – ぴくおの電子工作的な何かWP (electricpico.com)
高分解能PWMモジュールの使い方4
(スロープ補償)
高分解能PWMモジュールの使い方4(スロープ補償) – ぴくおの電子工作的な何かWP (electricpico.com)
高分解能PWMモジュールの使い方5
(PCI機能)
高分解能PWMモジュールの使い方5(PCI機能) – ぴくおの電子工作的な何かWP (electricpico.com)
(fig.1-2)各関連記事リンク

開発環境

開発環境を以下に示します。
今回はCPUボード(EV02G02A)で動作確認を行います。

項目リンク
ベースボードdsPIC33A CURIOSITY PLATFORM
DEVELOPMENT BOARD
dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com)
CPUボード(EV68M17A)EV68M17A – dsPIC33AK128MC106 Motor Control DIMdsPIC33AK128MC106 Motor Control Dual In-Line Module (DIM) Information Sheet (microchip.com)
CPUボード(EV02G02A)dsPIC33AK128MC106 General Purpose Dual In-Line Module (DIM)dsPIC33AK128MC106 General Purpose Dual In-Line Module (DIM) | Microchip Technology
統合開発環境MPLAB X IDE v6.20MPLAB® X IDE | Microchip Technology
コンパイラMPLAB XC DSC v3.10MPLAB® XC DSC Compiler | Microchip Technology
(fig.2-1)本記事の動作確認環境
(fig.2-2)動作環境

PWMモジュールについて

ブロック図

下記にPWMモジュールのブロック図を示します。

(fig.3-1)PWM高位ブロック図
(fig.3-2)PWMジェネレータブロック図

レジスタ

以下にPWMレジスタとその説明を示します。

レジスタ名(x=1~4,y=A~F)機能説明従来からの変更点
PCLKCONクロック制御レジスタPWMクロックを制御
FSCL周波数スケール周期レジスタ周波数スケールモードでの周期設定20bitに拡張(ただし実質16bit)
FSMINPER周波数スケール最小周期レジスタ周波数スケールモードでの最小周期設定20bitに拡張(ただし実質16bit)
MPHASEマスターフェーズレジスタマスターフェーズを設定20bitに拡張
MDCマスターデューティレジスタマスターDutyを設定20bitに拡張
MPERマスター周期レジスタマスター周期を設定20bitに拡張
LFSRリニアフィードバックシフトレジスタ疑似ランダム値
CMBTRIGコンビネーショントリガレジスタコンビネーショントリガの設定レジスタ統合,
LOGCONyロジックコントロールレジスタ組み合わせロジックの制御
PWMEVTyPWMイベントレジスタPWMイベントの制御
PGxCON制御レジスタPGxモジュールの全体制御レジスタ統合,TRGMODビットの拡張
PGxSTATステータスレジスタPGxモジュールのステータス
PGxIOCONIO制御レジスタI/Oピンの設定レジスタ統合,PPSENビット追加
PGxEVTイベントレジスタイベント発生用の設定レジスタ統合,PWMPCIの統合
PGxFPCIフォルトPCIレジスタフォルト時の動作を設定レジスタ統合,TERMPSビット追加
PGxCLPCI電流PCIレジスタカレントリミット時の動作を設定レジスタ統合,TERMPSビット追加
PGxFFPCIFFPCIレジスタF/F時の動作を設定レジスタ統合,TERMPSビット追加
PGxSPCI同期PCIレジスタ同期時の動作を設定レジスタ統合,TERMPSビット追加
PGxLEBブランキングレジスタリーディングエッジブランキング時間を設定レジスタ統合
PGxPHASEフェーズレジスタフェーズを設定20bitに拡張
PGxDCDutyレジスタDutyを設定20bitに拡張
PGxDCADuty調整レジスタDuty調整値を設定12bitに拡張
PGxPER周期レジスタ周期を設定20bitに拡張
PGxTRIGAトリガレジスタAトリガを設定20bitに拡張,
CAHALFビットの統合
PGxTRIGBトリガレジスタBトリガを設定20bitに拡張,
CAHALFビットの統合
PGxTRIGCトリガレジスタCトリガを設定20bitに拡張,
CAHALFビットの統合
PGxDTデッドタイムレジスタデッドタイムを設定15bitに拡張,レジスタ統合
PGxCAPキャプチャレジスタイベント発生時のタイムベースキャプチャ20bitに拡張
(fig.3-3)PWMレジスタ

動作確認

今回はフェーズシフト波形を出力します。
フェーズシフト波形については以前の記事を参考にしてください

下記の通りLED0~LED3に接続されているピンをPWMモジュールに割り当てます。
LED0,LED1はPG3のデフォルト出力ピンですが、LED3はPG4のデフォルト出力ピンではないため、PG4はリマッパブルピン経由で出力します。

構成

(fig.4-1)PWMブロック図

ソースコード

コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。

■コンフィグレーションファイル (config.h)

■クロック設定ソースファイル(Clock_Driver.c)

■クロックヘッダーファイル(clock_driver.c)

■ソースコード全体

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "config.h"
#include "clock_driver.h"
#include <dsp.h>

/*----------------------------------------------------------------------------*/
/**
* @fn          main(int argc, char** argv) 
* @brief       PROJECT_3_2_1_PWM
* @param[in]   argc argument count
* @param[in]   argv argument vector
* @retval      EXIT_SUCCESS 成功
* @retval      EXIT_FAILURE 失敗
* @detail      PWM
* @note        
 */
/*----------------------------------------------------------------------------*/
int main(int argc, char** argv) 
{
    /*-----------------------------------------------------------------------*/
    /*初期化*/
    /*-----------------------------------------------------------------------*/
        vdg_Clock_Set_Register();
		
	//RPOR9bits.RP37R = 6u;		//PWM3L
	//RPOR8bits.RP36R = 5u;		//PWM3H
		
	RPOR9bits.RP38R = 8u;		//PWM4L
	RPOR9bits.RP39R = 7u;		//PWM4H
		
    /*-----------------------------------------------------------------------*/
    /* PWM設定*/
    /*-----------------------------------------------------------------------*/
	PCLKCONbits.MCLKSEL = 0u;
	PCLKCONbits.DIVSEL = 0u;
		
	MPER = 1000;
	MDC = MPER / 2;
		
	PG3PHASE = 0u;
		
	PG3CONbits.MODSEL = 1u; //可変フェーズ
	PG3CONbits.CLKSEL = 1u; //MCLKSEL
	PG3CONbits.TRGCNT = 0u;
	PG3CObits.SOCS = 0u;
	PG3CONbits.TRGMOD = 0u;
	PG3CONbits.UPDMOD = 0u;
	PG3CONbits.MSTEN = 0u;
	PG3CONbits.MPHSEL = 0u;
	PG3CONbits.MPERSEL = 1u; //MPER
	PG3CONbits.MDCSEL = 1u; //MDC

	PG3IOCONbits.DBDAT = 0u;
	PG3IOCONbits.FFDAT = 0u;
	PG3IOCONbits.CLDAT = 0u;
	PG3IOCONbits.FLTDAT = 0u;
	PG3IOCONbits.OSYNC = 0u;
	PG3IOCONbits.OVRDAT = 0u;
	PG3IOCONbits.OVRENL = 0u;
	PG3IOCONbits.OVRENH = 0u;
	PG3IOCONbits.SWAP = 0u;
	PG3IOCONbits.CLMOD = 0u;
	PG3IOCONbits.POLL = 0u;
	PG3IOCONbits.POLH = 0u;
	PG3IOCONbits.PENL = 1u;	//PWMxL Output
	PG3IOCONbits.PENH = 1u;	//PWMxH Output
	PG3IOCONbits.PMOD = 0u;
	PG3IOCONbits.DTCMPSEL = 0u;
	PG3IOCONbits.PPSEN = 0u;
	PG3IOCONbits.CAPSRC = 0u;
			
			
	PG4PHASE = 0;
	PG4CONbits.MODSEL = 1u; //可変フェーズ
	PG4CONbits.CLKSEL = 1u; //MCLKSEL
	PG4CONbits.TRGCNT = 0u;
	PG4CONbits.SOCS = 0u;
	PG4CONbits.TRGMOD = 0u;
	PG4CONbits.UPDMOD = 0u;
	PG4CONbits.MSTEN = 0u;
	PG4CONbits.MPHSEL = 0u;
	PG4CONbits.MPERSEL = 1u; //MPER
	PG4CONbits.MDCSEL = 1u; //MDC

	PG4IOCONbits.DBDAT = 0u;
	PG4IOCONbits.FFDAT = 0u;
	PG4IOCONbits.CLDAT = 0u;
	PG4IOCONbits.FLTDAT = 0u;
	PG4IOCONbits.OSYNC = 0u;
	PG4IOCONbits.OVRDAT = 0u;
	PG4IOCONbits.OVRENL = 0u;
	PG4IOCONbits.OVRENH = 0u;
	PG4IOCONbits.SWAP = 0u;
	PG4IOCONbits.CLMOD = 0u;
	PG4IOCONbits.POLL = 0u;
	PG4IOCONbits.POLH = 0u;
	PG4IOCONbits.PENL = 1u;	//PWMxL Output
	PG4IOCONbits.PENH = 1u;	//PWMxH Output
	PG4IOCONbits.PMOD = 0u;
	PG4IOCONbits.DTCMPSEL = 0u;
	PG4IOCONbits.PPSEN = 1u;//PPS
	PG4IOCONbits.CAPSRC = 0u;
			
	PG3CONbits.ON = 1u;
	PG4CONbits.ON = 1u;

	while (1)
	{
         ;
	}
    return EXIT_SUCCESS;
}

結果

以下の通りフェーズシフト波形が出力されました。

(fig.5-1)CH1:LED0,CH2:LED1,CH3:LED3,CH4:LED2

注意点としてPGモジュール間で同期をとっていない場合は、以下の通りモジュールを有効化した順番や時間差で位相が発生する事です。周波数が高い場合は影響が大きいので注意が必要です。

ONビット個別有効化

各種PGx設定後、PGxCONbits.ON を1に設定
→70nsec程度の遅延

// PG3各種設定
...

  PG3CONbits.ON = 1u;

// PG4各種設定
...

  PG3CONbits.ON = 1u;

ONビットほぼ同時設定

各種設定後、最後にPGxCONbits.ON を1に設定
→35nsec程度の遅延

	
// 各種設定
...

  PG3CONbits.ON = 1u;
  PG4CONbits.ON = 1u;

レジスタ一括設定

ビットアクセスは遅いため、各種パラメータ設定後、最後にPGxCONレジスタを設定
→10nsec程度の遅延

// 各種設定(PGxCON以外)
...
  PG3CON = 0xC0008009;
  PG4CON = 0xC0008009;

記事についての注意点

本記事は慎重に内容を検討し正確さに努めておりますが、内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント

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