PIC24EPの高速PWMについて
(可変抵抗のツマミを回してLEDの点滅速度を可変します)
〔PICの動かせ方入門に戻る〕
24EP256MC202の、高速パルス幅変調(PWM)モジュールについてメモして置きます。
MPLAB X V2.15 と MPLAB(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をお互いに逆に設定すれば
相補出力が可能だが、デッドタイムの設定が有効に出来ないです。
赤色が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出力制御と言います。
赤色が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を開始する
赤色が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.