相変わらず行き当たりばったり、出たとこ勝負、解説は斜めに読む、で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 (1507 ダウンロード )