- ベストアンサー
picを用いた周波数の発生回路
- ステッピングモータを回すために、picを使用したパルス発生回路を作成しています。
- PWM機能を使用して、100Hzや1200Hzなど特定の周波数を作成することは可能でしょうか?
- picは18F4680を使用し、コンパイラはC18を使用しています。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
分周を使うとおのずから出力できる周波数が決まってしまうので、自由な周波数を決めるのは困難ですが、タイマー割り込みを使って、タイマーに設定する値を適当な値に可変すれば結構細かな周波数出せますよ。タイマーのタイムアップする毎に出力をON/OFFすれば、単純にその周期での周波数パルスが出力できます。 Timer3を使用すれば、16bitタイマー値がプリロードできます。 8MHzで動かしてプリスケール1:1 1:2 1:4 1:8のどれかを選べばタイマーは1:1の時1/8MHzの時間でカウントするし、1:8の時は1/1MHzの時間でカウントします。16bitタイマーなので(65535-プリロード値)×カウント時間がタイムアップ時間になります。タイマー割り込みの設定をしておけば、プログラムの処理時間に影響せずに、設定したタイムアップ時間周期で割り込みがかかるので、その割り込みの度に出力をON/OFFするのと同時に一度タイマーを止めてプリロード値をロードし、割り込み処理を抜ける時にタイマーを再起動する。この繰り返しで良いです。 ロードする値と、プリスケーラーの組み合わせでかなり自由度の高い様々な周波数を出す事ができます。ただし、最高周波数は割り込み処理を一度実行するのに必要な時間になりますので、そこは、プログラムの組み方で変わってくることを考慮してください。
その他の回答 (5)
富士設計 大曲です PICのCは実行速度の予測が難しいと聞いています、割り込みを使った タイマー処理で正確さを出すのは手間がかかるでしょう(試行錯誤) >360Hzから7200Hzの間で360Hz毎に周期を可変させたいと考えています。 すでに回答があったようにPR2で整数倍の設定はむずかしいと思います。 >きっちりとした値の周波数を作成することは可能なのでしょうか? プリロード可能なタイマーはCCP1しか無いので難しい、 他のプリロード可能な16BitTimerをもったCPUを検討したらいかがでしょうか。
>360Hzから7200Hzの間で360Hz毎に周期を可変させたいと考えています。 PWM Period = [(PR2) + 1] * 4 * TOSC * (TMR2 Prescale Value) なので、 TOSC Freq = PWM Freq * [(PR2) + 1] * (TMR2 Prescale Value) * 4 PWM Freq=360Hz, PR2max=255, (TMR2 Prescale Value)max=16とすれば TOSC Freq = 5.898MHz 以下をメインクロックにすれば良いです。 ただし >360Hzから7200Hzの間で360Hz毎に周期を可変させたいと考えています。 は無理ですね。PR2の設定値で一番近いものを選ぶことになります。 PR2の設定値を小刻みに変える事により平均してもっと近い周波数に見せかけることは可能です。
100Hz・1200Hzきっちりと仰っても、多少の公差を設定して頂かないと工業 製品は成り立ちません。 100Hz± x % ,1200Hz± y %のように記述したときに、許容差 x,yは、 どの程度でしょうか? (%ではなく、ppmでもいいので、数値で表すことが必要です) 周波数がきっちりの値からずれる原因には、クロック周波数の誤差による よるもの、必要な周波数とクロック周波数の比が整数でない場合の誤差(分 周の誤差)、割り込み処理による誤差などがあります。 前の回答者さんがご指摘のとおり、クロック周波数(ベースクロック)が 低い場合は、自由な周波数に設定したいときは分周の誤差が大きくなります。 いずれにしても、クロック周波数の精度を上回る周波数精度は得られません ので、原理をご理解下さるようにお願いします。
まあ、PIC にかぎらず ああいうものはベースクロックがきもになります あとはステート数 http://ww1.microchip.com/downloads/jp/DeviceDoc/39625c.pdf 内部クロックは8MHz なので ステート数による誤差はゴミ? 後は割り込み使えば使えると思います http://www.eleki-jack.com/indoorplane/2008/05/124.html
pic18F4680のデータシートhttp://ww1.microchip.com/downloads/jp/DeviceDoc/39625c.pdf のFIGURE 2-8:および TABLE 15-4 からすると、分周に限界があるようで、もっと高い周波数なら 可能です。 クロックを低くすればできますがプログラムの実行速度が遅くなります。 360Hzから7200Hzの間で階段的に周波数を切り替えますか? 丁度というのあればその精度はどのくらい必要でしょうか? 誤差がでてもいいのであればEQUATION 15-1:の式で全ての 周期を設定できるかひとつひとつ計算していってみてください。 手間ですが、それが一番わかりやすいと思います。
お礼
ご回答ありがとうございます。 360Hzから7200Hzの間で360Hz毎に周期を可変させたいと考えています。 プログラムの実行速度はあまり必要ありませんので,低速でも大丈夫です。 PWM機能のPR2しただけでは,上記のような周波数は生成できないのでしょうか?