Sahara's WebLog

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

PIC32MM0064GPL028 + MCC でPWMを試してみる。

相変わらず行き当たりばったり、出たとこ勝負、解説は斜めに読む、でPWMをやってみる。
実はこのお題、「PIC32MM0064GPL028 – MCCを使ってMCCPでPWMもどきのLチカ。 –」でもやっているが、見事にかじっただけで放置してある。
今回もそうならないようにしたいという身持ちだけはある、毎回そうだが…。

System Moduleは以下の通り。
ほとんど初期状態で、2つだけ変更してある。

Single output modules (SCCP)とMultiple output modules (MCCP)があって前回はMCCPをかじってみたわけだが、Singleの方が簡単じゃないの?
ってだけの理由で、今回はSCCPをやってみることにした。
MCCPからSCCP2を追加する。

にしてもいろんな項目があって迷うので、ちょっと調べてみた。
すると。ここに「Dual edge compare mode, buffered.」が従来のPWMじゃね?
って書いてる人がいたのでそれを選んでみる。

あと、赤線の部分は適当な値を入れておく。
SCCP2で使うピンが設定できるようになるので、Pin Managerで以下のように出力をRA1に割り当てておく。

Analogの機能も持っているピンの場合はPin ModuleでAnalogのチェックを外しておく。

GenerateしてPICに書き込んで3ピンの出力を調べると下のようになる。

毎度のことだが、ここまでプログラムはまだ1行も書いてない。
出力されるパルスについて詳しく見ると以下の通り。

クロックは8MHzでTimer Periodを0x7FFFに設定した。
1クロック当たり1 ÷ 8000000 = 125nsを32767(0x7FFF)回カウントする。
計算上 125ns × 32767回 = 4ms となって実測値の4ms(244Hz)と合っている。
これがPWMの周期になるということだ。
問題はデューティー比なわけだが、パルスの先頭の幅は、実測では681usとなってクロック換算では5448クロック分となる(681×1000÷125)。
これは、Primary Compare ValueとSecondary Compare Valueの差5461(0x3FFF-0x2AAA)にほぼ等しい値となる。
Secondary Compare Valueだけ変更して0x5000としてみた。

実測値は1196usということだ。
( 0x5000 – 0x2AAA ) × 125ns = 9558 × 125ns = 1195us
となって、これも計算値と合う。
Secondary Compare ValueとPrimary Compare Valueの差でHighの時間が決まるとみていいだろう。
結局のところ、Primary Compare Value分のクロックを数えたらHighにし、Secondary Compare Value分になったらLowにするという作業をTimer Periodの周期で行うってことだろう。

というわけで、何となく出てくるものの様子はわかった。
PWMの定番、LEDを滑らかに点滅させてみる。

ロジアナで出力を見ると上のようにグラデーションになる。

上のプロジェクトのパッケージファイルはこちら。
Project Package of SCCP2 LED Blinking Sample for PIC32MM0064GPL028 (200 ダウンロード)

PIC32MM0064GPL028 関連記事一覧

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

Posted under: PIC32MM0064GPL028


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.