JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC12F1822 MCC PWM テストその2

2021-05-21 15:52:39 | MPLAB X MCC
 前の記事のテストでMCCを使えば、PICで簡単にPWMを行うことができることが分かりました。

 それでは、PWMの周波数を変えるのにはどうしたらよいのでしょうか。
 まず、PWMの動作原理を見てみましょう。PIC12F1822の説明書の解説図です。
 詳しい説明は、他のWebサイトを見ていただくか、私のホームページのここを見てください。

 PWMの周期を決めているのは、TMR2とPR2です。根本的には、システムクロックFOSCで、更にTMR2に接続されているプリスケーラ(分周期)も関係しています。

 FOSCの周波数を決定し、prescalerの比率が決まれば、PWMの周期の上限と下限が決まります。次に、PR2の値を設定すれば周期が決まることになります。MCCでは、周期の上限と下限の間で周期を決めると、PR2の値を算出しセットしてくれます。

 例として、FOSC=16MHz,prescaler 1:16とし、PWM period=1000us=1msとしてみます。

 TMR2モジュールで、Timer ClockのPrescalerを1:16とするとTimer Periodの設定範囲が4us以上1.024ms以下と表示されます。1msを入力するとActual Period(実際の周期)は1msになりました。

ECCPモジュールを開いてみるとTMR2で設定した値が反映されています。
PWMの周期1ms、周波数1KHzになります。

Generateして、MCCを終了します。プログラムは、何も書かなくてもOKです。
SYSTEM Initialize()の中で、TMR2とECCPのinitializeが行われ、PWMは自動的にスタートします。
---------------------------------------------
void main(void)
{
// initialize the device
SYSTEM_Initialize();

while (1)
{
}
}
---------------------------------------------
build,PICに書き込みをして、周波数を測定してみました。


 1000Hzが出力されました。

次に、CWのサイドトーンを意識して、800Hzを発生させてみましょう。
FOSC=4MHz,TMR2 prescaler 1:16としました。
800Hzは、周期では、1/800=0.00125s=1.25ms=1250usとなりますので、1.25msを入力しました。Actual Period は 1.248msとなりました。
ECCPモジュールを見ると
PWM Period 1.248ms.PWM Frequency 801.28Hzとなりました。


実測してみました。

 801Hzが発生しました。

 ということで、FOSC,TMR2 prescalerの値と周期の設定で、いろいろな周波数のPWMを発生させることができます。