PICのTimer/CCPのソースコード作成ツール紹介

〔PICの動かせ方入門に戻る〕


このページでTimerCCP(PWM)の設定を簡単にしてくれるかもしれないみたいなぁ...ツールを軽〜く
紹介して置きます。
尚、TimerとCCP(PWM)関連の実際の設定方法は、"PICの動かせ方入門"の各デバイスの覚書などの
記事を参考にして下さい。

また、[Delay Code Generator(アセンブラ用)]ツールはこちらで紹介しています。

ここのツールは古いので、こちらのMCCプラグインを利用する方法が良いでしょう。 *1)

《PIC PWM Register Calculator》

CCP/ECCPにてPWMを出力する場合は、Timer2/4/6の何れかを使用しますが、
例えばTimer2を使い周波数を発生させるには、T2CONとPR2に値を設定しないとダメですね、
その後でCCP1からの出力なら、CCPR1とCCP1CON(4-5bit)にてデューティ値を設定します。
が、作り出したい周波数値を計算するのがちょっとぉ面倒くさいよねぇって人は必見ですじゃぁ。

[PWM Register Calculator]ツールサイトはこちらです。

PWM Register Calculator

@ "Oscillator Frequency"にPICのシステム周波数を入力します。(例は8MHz)
A "PWM Frequency"に作り出したい周波数を入力します。(例は1KHz)
B "Duty Cycle"にPWMのデューティ値を入力します。(例は50%)
  "○ Percent"チェックで%入力です、"○ Value"チェックで直接数値入力(0-1023)
  但し、直接数値入力はPR2=255の場合が0-1023(10Bit)で、255でない場合は0-255(8Bit)と
  なるので%入力がやりやすいかも?。
C 入力したら[Calculate]ボタンをクリック、計算結果が青枠の場所に表示されます。
  この場合はTimer2でCCP1からの出力ですね。
  T2CONbits.T2CKPS = 0b10 ;   // プリスケーラ16倍
  PR2 = 124 ;
  CCPR1L = 0b00111110 ;       // デューティ値上位8bit、この場合PR2=255でないので下位8bitのみ
  CCP1CONbits.DC1B = 0b10 ;   // デューティ値下位2bit
注意) このツールは"16F877A"を想定している様でプリスケーラの設定がT2CON=0b00000111
     なっているが、通常は16倍なら"10"です、また、"16F877A"は64倍が無い為にこのツールは
     64倍計算が無いんです。(んん、惜しい!)
     なので、16倍も"Too high"が表示された場合は自力で計算です。
     (64倍にしても、8MHzで130Hzまで位辺りまででしょう)

     PR2 = ( クロック周波数 / (PWM周波数 × 4 × TMR2プリスケール値) ) - 1
     PR2 = 239.384 = ( 8,000,000 / (130 × 4 × 64) ) - 1
     PR2レジスターは255までの数値です。

《PIC Timer Calculator and Source Code Generator 》

[Timer Calculator]ツールサイトはこちらですじゃあ。

上記のCCP(PWM)のツールと同じサイトです、なので想定PICも"16F877A"ですのでレジスター設定
には注意が必要でしょう。尚、上記にも書いた様にTimer2のプリスケーラ値は16倍までの計算です。

Timer Calculator

@ "Oscillator Frequencyv"にPICのシステム周波数を入力します。(例は8MHz)
A 後は"Interrupt Frequency(Hz)"や"Interrupt Perion(Sec)"のアンバイを見ながら、
  各スライダーを動かします。
  右側ウインドウに設定値がすぐ反映されます。
  "Interrupt Perion(Sec)"に入力が出来れば凄く便利なのですがぁ...(んん、残念!)
B "□ Include in Source"にチェックをいれ、[Generate Sample Application]ボタンを押せば下に
  雛型ソースコードが表示されます。

まぁ、残念な所も有りますがぁ、指定した周波数で最大/最少の"Interrupt Frequency(Hz)"や
"Interrupt Perion(Sec)"が簡単に判るので良しとして置きますかぁ。

この設定値以上の"Interrupt Perion(Sec)"を得るにはタイマー割り込みが発生した時にその割り込み
回数をカウントする事になります、
例えば、Interrupt Perion(Sec)=100msなら10回割り込みを数えたら1秒みたいなぁ。
或いは、システムクロックを1MHzとか低くすれば"Interrupt Perion(Sec)"は長く出来ますがぁ....




記事追記(*1) 2016/12/23


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.