PIC24EPの高速PWMについて
(可変抵抗のツマミを回してLEDの点滅速度を可変します)

〔PICの動かせ方入門に戻る〕


24EP256MC202の、高速パルス幅変調(PWM)モジュールについてメモして置きます。
MPLAB X V2.15MPLAB(R) XC16 C Compiler Version 1.24コンパイラ を使用しての記事です。
PWMのPIC24E用日本語リファレンスマニュアルはこちらを参照下さい。

PWMのジェネレータは3個(PWM1/2/3)有り、1個当たり2つのPWMが出力(PWMxL/PWMxH)出来ます

ピンの構成図
24EPxxxMC202のアナログ出力(PWMxL/PWMxH)は6本有ります。
"FLT32"ピンは電流制限のフォルト制御用のピンです。


PWMには以下のモードが有ります。
冗長出力モード
  PWMの各ピンペア(PWMxHとPWMxL)で、同じシングルエンドのPWM信号を2つ出力出来ます。
独立出力モード(24EP256MC202にはこのモードは無い様です)
  2 つのPWM 出力(PWMxH とPWMxL) に異なるデューティサイクルを持たせる事が出来ます。
プッシュプル出力モード
  PWM 出力をPWMxH ピンとPWMxL ピンに交互に出力します。
相補出力モード
  PWMxH 出力はPWMxL 出力の相補信号となります。
  すなわち、何れかがHIGHの時は、相手側はLOWとなります、エッジのデッドバンド設定有。

エッジアラインPWM モード
  通常(標準)のPWM信号を生成します。
センターアラインPWM モード
  基準点を中心にしてPWM信号を生成します。
  すなわち、PWM 信号の前半は基準点より前、後半は基準点より後で生成されます。
  主にモータアプリケーションで使うらしい。

書き込み保護
コンフィギュレーションのビットに"PWMLOCK"が有ります、
これを[ON]にすると、ロック解除シーケンスを実行しないと「IOCONx」「FCLCONx」レジスタには
書き込み出来ません。
[OFF]であれば、ロック解除シーケンス無で書き込み可能です。

クロックのタイムベース
PWMジェネレータの各PWM出力には、マスタタイムベースか独立タイムベースのいずれかを使えます。
マスタタイムベースは、全てのPWMジェネレータ用に共通の参照タイムベースを生成するので、
全てのジェネレータで同期をとる場合に有効でしょう。
独立タイムベースの場合は、各ピンペア(PWMxHとPWMxL)でタイムベース周期を、共通にするのか
別々にするのかを選択出来ます。

タイムベースの1周期は?  ((1秒/システムクロック周波数)X プリスケーラ設定値
 ・Fosc=120MHz(FCY:60MHz)でプリスケーラ=1:1での1周期は
 ((1 / 120MHz) * 1 = 0.00833(8.33ns) → これが最少単位の1周期の時間です。
 で、8.33ns * 周期レジスタ値(16ビット)が1周期の時間です。

以下でのレジスタの詳しい内容は説明を省きます、日本語リファレンスマニュアルを見ましょう。

《冗長出力モード》

単純にPWMを出力するにはこのモードで良いでしょう。
このモードでは、PWM1H/PWM1Lとも同じ周期・デューティサイクルしか出力出来ません。
"IOCON1"レジスタの[POLH][POLL]ビットでアクティブLOW/HIGHをお互いに逆に設定すれば
相補出力が可能だが、デッドタイムの設定が有効に出来ないです。

冗長出力波形図1
赤色がPWM1H、黄色がPWM1Lでの波形です。
この波形の設定値が下記です。
マスタータイムベース・独立タイムベースとも同じ波形の出力となります。

(マスタータイムベース・独立デューティサイクル/独立位相、固定プライマリ周期、エッジアライン)
  PWM1のPWM1L = ON/アクティブLOW PWM1H = ON/アクティブLOW 位相シフト = 0
  1周期 = 8.33us デューティ比 = 50%
     IOCON1  = 0b1111010000000000 ;// PWM1H-ON/PWM1L-ON、アクティブLOW、冗長出力モード
     FCLCON1 = 0b0000000000000011 ;// 電流制限モードは無効、フォルト入力は無効
     PWMCON1 = 0b0000000000000000 ;// マスターのタイムベース、個別のデューティサイクル(PDC1)、エッジアライン、
     PTCON2  = 0x0000 ;  // PWM1入力クロックのプリスケーラ1:1
     PTPER   = 1000 ;    // プライマリマスタータイムベース(Fosc=120MHz,(1000/120)*1=8.33ns,1周期=8.33*1000)
     PDC1    = 500 ;     // PWM1ジェネレータのデューティサイクルは50%
     PHASE1  = 0 ;       // PWM1プライマリ位相シフト(位相のズレは無し)
     DTR1    = 0 ;       // PWM1xHのデッドタイムは0
     ALTDTR1 = 0 ;       // PWM1xLのデッドタイムは0
     PTCONbits.PTEN = 1 ;// PWM1を開始する
(独立タイムベース・独立デューティサイクル/独立周期、位相シフトなし、エッジアライン)
  PWM1のPWM1L = ON/アクティブLOW PWM1H = ON/アクティブLOW 位相シフトは無し
  1周期 = 8.33us デューティ比 = 50%
     IOCON1  = 0b1111010000000000 ;// PWM1H-ON/PWM1L-ON、アクティブLOW、冗長出力モード
     FCLCON1 = 0b0000000000000011 ;// 電流制限モードは無効、フォルト入力は無効
     PWMCON1 = 0b0000001000000000 ;// 独立タイムベース、個別のデューティサイクル(PDC1)、エッジアライン、
     PTCON2  = 0x0000 ;  // PWM1入力クロックのプリスケーラ1:1
     PDC1    = 500 ;     // PWM1ジェネレータのデューティサイクルは50%
     PHASE1  = 1000 ;    // 独立タイムベース(Fosc=120MHz,(1000/120)*1=8.33ns,1周期=8.33*1000)
     DTR1    = 0 ;       // PWM1xHのデッドタイムは0
     ALTDTR1 = 0 ;       // PWM1xLのデッドタイムは0
     PTCONbits.PTEN = 1 ;// PWM1を開始する
PWMのクロックのマスタータイムベースでは、"PTPER"(プライマリマスタタイムベース周期レジスタ)に
セットするが、独立タイムベースでは、"PHASE1"(プライマリ位相シフトレジスタ)にセットします。
この"PHASE1"はマスタータイムベース時は、位相シフトの設定を行うレジスタとなります。

《相補出力モード》

相補出力は、下図の様にPWM1HピンがHIGH時は、PWM1LピンはLOWを出力する様に反転させます
(差動出力)、これを相補PWM出力制御と言います。

相補出力波形図1
赤色がPWM1H、黄色がPWM1Lでの波形です。
PWM1H/PWM1L波形の立下り時にデッドタイムが付いた波形です。
この波形の設定値が下記です。

(マスタータイムベース・独立デューティサイクル/独立位相、固定プライマリ周期、エッジアライン)
  PWM1のPWM1L = ON/アクティブLOW PWM1H = ON/アクティブLOW 位相シフト = 0
  1周期 = 8.33us デューティ比 = 50% 
  PWM1Hのデッドタイム = 50(立下がり時) PWM1Lのデッドタイム = 50(立下がり時)
     IOCON1  = 0b1111000000000000 ;// PWM1H-ON/PWM1L-ON、アクティブLOW、相補出力モード
     FCLCON1 = 0b0000000000000011 ;// 電流制限モードは無効、フォルト入力は無効
     PWMCON1 = 0b0000000000000000 ;// マスタータイムベース、個別のデューティサイクル(PDC1)、エッジアライン、
     PTCON2  = 0x0000 ;  // PWM1入力クロックのプリスケーラ1:1
     PTPER   = 1000 ;    // 独立タイムベース(Fosc=120MHz,(1000/120)*1=8.33ns,1周期=8.33*1000)
     PDC1    = 500 ;     // PWM1ジェネレータのデューティサイクルは50%
     PHASE1  = 0 ;       // PWM1プライマリ位相シフト(位相のズレは無し)
     DTR1    = 50 ;      // PWM1Hのデッドタイムは50(立下がり時)
     ALTDTR1 = 50 ;      // PWM1Lのデッドタイムは50(立下がり時)
     PTCONbits.PTEN = 1 ;// PWM1を開始する

相補出力波形図2
赤色がPWM1H、黄色がPWM1Lでの波形です。
PWM1H/PWM1L波形の立上り時にデッドタイムが付いた波形です。
この波形の設定値が下記です。

(マスタータイムベース・独立デューティサイクル/独立位相、固定プライマリ周期、エッジアライン)
  PWM1のPWM1L = ON/アクティブLOW PWM1H = ON/アクティブLOW 位相シフト = 0
  1周期 = 8.33us デューティ比 = 50% 
  PWM1Hのデッドタイム = 50(立上がり時) PWM1Lのデッドタイム = 50(立上がり時)
     IOCON1  = 0b1111000000000000 ;// PWM1H-ON/PWM1L-ON、アクティブLOW、相補出力モード
     FCLCON1 = 0b0000000000000011 ;// 電流制限モードは無効、フォルト入力は無効
     PWMCON1 = 0b0000000001000000 ;// マスタータイムベース、個別のデューティサイクル(PDC1)、エッジアライン、
     PTCON2  = 0x0000 ;  // PWM1入力クロックのプリスケーラ1:1
     PTPER   = 1000 ;    // 独立タイムベース(Fosc=120MHz,(1000/120)*1=8.33ns,1周期=8.33*1000)
     PDC1    = 500 ;     // PWM1ジェネレータのデューティサイクルは50%
     PHASE1  = 0 ;       // PWM1プライマリ位相シフト(位相のズレは無し)
     DTR1    = 50 ;      // PWM1xHのデッドタイムは50(立上がり)
     ALTDTR1 = 50 ;      // PWM1xLのデッドタイムは50(立上がり)
     PTCONbits.PTEN = 1 ;// PWM1を開始する

《可変抵抗のツマミを回してLEDの点滅速度を可変します》

半固定抵抗とLEDを配線し、半固定抵抗の値からLEDの明るさを可変させます。
PWM1で約1ms(1KHz)を発生させます、接続した半固定抵抗の値(アナログ入力)でデューティ値を
変化させLEDの明るさを変えます。

配線図  アナログ専用電圧AVDD(28番)/AVSS(27番)は
 VDD(13番)/VSS(8・19番)と同じ電源に
 接続しています。

 内蔵のレギュレータ用にVCAP端子(20 番)に、
 10uFのコンデンサーを取付けVSSに落とす
 必要が有ります。

1番ピンはMCLR専用なのでリセット回路を取付けないのなら1K-10KΩ抵抗でVDDに接続します。
LEDはPWM1H(RB14:25番Pin)に接続し、半固定抵抗はAN0(RA0:2番Pin)に接続です。

(プログラム)

アナログ入力に関する記事はこちらのページを参照下さい。

参回路のサンプルソースファイルは↓ここからダウンロードして下さい。
PWM.lzh
 PWMtoLED.c・・・・・・・・・・・本体のサンプルソースプログラム

起動させ、半固定抵抗のツマミを右に回せば明るくなり、左に回せば暗くなります。
pdc = map(ad,0,1023,15002,0) ; // AN0値をデューティ値に変換する
と記述が有ります、これはアナログ値(0-1023)をデューティサイクル(0-15002)に変換しています。
アナログは、10ビット読込みなので0-1023ですが、12ビットにするなら0-4095にします。




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