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 (1506 ダウンロード )

PIC32MM0064GPL028 関連記事一覧

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

Posted under: PIC32MM0064GPL028


コメントを残す

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

Time limit is exhausted. Please reload CAPTCHA.