前の記事のテストでMCCを使えば、PICで簡単にPWMを行うことができることが分かりました。
それでは、PWMの周波数を変えるのにはどうしたらよいのでしょうか。
まず、PWMの動作原理を見てみましょう。PIC12F1822の説明書の解説図です。
![](https://blogimg.goo.ne.jp/user_image/2f/a8/ae6df5a387e8c78c7992d7dbb349d1d4.png)
詳しい説明は、他の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になりました。
![](https://blogimg.goo.ne.jp/user_image/79/c7/b3651fd749571c1cc2844ffe9efd0a7b.png)
ECCPモジュールを開いてみるとTMR2で設定した値が反映されています。
PWMの周期1ms、周波数1KHzになります。
![](https://blogimg.goo.ne.jp/user_image/4a/20/0fa8fb8798ea4fa97f0319f0bbea3d18.png)
Generateして、MCCを終了します。プログラムは、何も書かなくてもOKです。
SYSTEM Initialize()の中で、TMR2とECCPのinitializeが行われ、PWMは自動的にスタートします。
---------------------------------------------
void main(void)
{
// initialize the device
SYSTEM_Initialize();
while (1)
{
{
// initialize the device
SYSTEM_Initialize();
while (1)
{
}
}
---------------------------------------------
build,PICに書き込みをして、周波数を測定してみました。
![](https://blogimg.goo.ne.jp/user_image/06/43/714c4adff2ed0f6979e127f271248eae.jpg)
1000Hzが出力されました。
次に、CWのサイドトーンを意識して、800Hzを発生させてみましょう。
FOSC=4MHz,TMR2 prescaler 1:16としました。
800Hzは、周期では、1/800=0.00125s=1.25ms=1250usとなりますので、1.25msを入力しました。Actual Period は 1.248msとなりました。
![](https://blogimg.goo.ne.jp/user_image/7b/15/7c7939038b5a4ee7637fe835045f0415.png)
ECCPモジュールを見ると
PWM Period 1.248ms.PWM Frequency 801.28Hzとなりました。
![](https://blogimg.goo.ne.jp/user_image/76/2c/9ba5aed64652d64887081bbd96775d8f.png)
実測してみました。
![](https://blogimg.goo.ne.jp/user_image/0f/99/32d2a3e38341bbc581583ce4424f6b2a.jpg)
801Hzが発生しました。
ということで、FOSC,TMR2 prescalerの値と周期の設定で、いろいろな周波数のPWMを発生させることができます。