Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

PIC32MX120F032B - PWMをやってみる -

例によって、まずは人様のコードをいただいてきて試す。
ここからもらってきた。
コピペしていきなりコンパイルすると、以下の2行でエラーが出た。
軽く検索したが、よくわからない。
コメントアウトして再度コンパイルしたら、エラーが出ずに完了して、書き込んだら動いた。
pic32mx120f032b_pwm_test_01

PIC32MX120F32Bを使って、基本の回路を組む。
16ピンに抵抗とLEDを接続しただけだ。
LEDの場所以外は「PIC32MX250F128B MPLABX XC32 Harmony でLチカしてみた。- 内蔵クロックで駆動 –」の写真と同じだ。

つないだLEDが暗めに点灯するので、確かにPWMで駆動しているようだ。
ロジアナで拾ってみると、周期が約2kHzとなって、16kHzだと書かれているのと食い違いがある。
pic32mx120f032b_pwm_test_02
ただ、デューティー比は合っているので、クロックがらみで違いがあるのだろう。
コメントアウトした部分で何を呼んでいるのかわからないので何とも言えないが、クロック関連をちょっと調べてみる。
以下のようなことがわかる。

PIC32MXではPripheral Bus Clock(PBCLK)によってタイマーがカウントされている。
システム・クロック(SYSCLK)の後にPBDIVで設定されるPrescalorが入ってPBCLKが作られている。
PBDIVの初期値が1:8のようだ。

今回のSYSCLKは40MHzに設定してあって、明示的にPBDIVを設定していないので、PBCLKは5MHzになっている。
というわけで、16kHzのはずが2kHzとなった。

こうやって、謎を解くと、Output Compare(OC)とTimerからPWMを作り出す仕組みもなんとなく理解できる。
今のところの理解では以下のような感じ。

周期はTimer2のPR2の値で決める。
同時にOCのOCxRSの値によってデューティー比も決まるというわけだ。
データシートのこの図がわかりやすい。
pic32mx120f032b_pwm_test_03
OC1とTimer2の例で書く。
(1)TMR2がクリアされ、デューティー比用の値がOC1RSからOC1Rにロードされる。
(2)PBCLKをカウントして、TMR2の値がOC1Rになると、OC1ピンの出力がLowになる。
(3)PBCLKのカウントを続けて、TMR2がPR2を超えると、再びデューティー比用の値がOC1RSからOC1Rにロードされ、OC1の出力がHighになる。
(4)(1)へ。

このエントリーをはてなブックマークに追加

Posted under: PIC32MX120F032B


コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.