獣医さんの電子工作とパソコン研究室
 
 39-2.トラ技付録基板 R8C/Tiny オシレーター&周波数カウンタの実験 

 ■ とても便利なR8C/Tinyマイコン

  
 トランジスタ技術の付録でR8C/Tinyマイコンですが、ブレッドボード上でかなりいろいろな実験ができます。また、開発環境が使えば使うほど便利であることがわかってきました。
とにかく、PC上のHEW4からステップ動作で動作を確認しながら開発できるのが、とっても便利ですね。

 当初の目標とは別の方向に向いてきましたが、今回はR8C/Tinyを使って周波数可変式のオシレーターを作ってみました。ついでに周波数カウンタも作って、自分で発振して自分で周波数を測定するなどというばかばかしい実験もしてみました。 

 ■ タイマCを使用し可変式の発振回路を作る
 タイマCを使ってPWMの発振実験をしてみました。これが実に簡単なので、発振周波数を自由に設定できるのではないかと考えましたが・・・。
タイマCはTCカウンタという16ビットのフップカウンタで、アウトプットコンペアモードで使用した場合TM1レジスタにセットされた数値で周期が設定され、TM0レジスタに設定された値でパルスの幅を設定します。単純にデューティ比50%の発振であれば、TM0レジスタはTM1レジスタの半分の数値ということになります。
TCカウンタへのサンプリング・クロックはベースの20MHzと1/8の2.5MHz、1/32の625KHzが選択できます。 エクセルでTM1レジスタの値と発振周波数の関係を計算したものを作ってみました。
最初はDDSのように1KHzステップで1MHzくらいまで発振できるのではないかと簡単に思っていましたが、よく考えればそう簡単なことではないことにはづきました。 基礎を勉強していない私としては、周期と周波数の感覚的なものが頭の中になかったのです。

そこで、1KHzから100KHzまでは1KHzステップで可変し、100KHz以上は50KHzステップで1MHzまで発振できる設計にしました。 

レジスタ設定値と周波数

発振波形の様子

 


発振周波数と実測値

 
 発生した波形を実測してみました。手持ちの周波数カウンタはMETEXテスタしかないので、テスタでの測定値です。
 
左のグラフを見るとTM1レジスタ値が50を切るあたり(400KHz以上)から誤差が大きくなっています。
 
分周比の大きい部分で使用したほうがより精度の良い発振周波数が得られるということがわかります。
  
 ■ 周波数カウンタ
 周波数カウンタ実現のための基本的動作原理は、ある一定のゲートタイムの間にパルスがいくつ入ってきたかを計測するというものです。 R8C/Tiny関係の資料を物色していたら、トランジスタ技術 2005年2月号 連載 第4回 R8C/Tinyマイコン入門 に周波数カウンタの製作記事が出ていましたので、これを参考にさせていただきました。
 
 ゲートタイムは1秒とし、この生成にはタイマZのタイマ・モードを使用します。タイマZは8ビットのダウンカウンタで、クロックの選択は1/1、1/2、1/8、外部のいずれから選べます。 トラ技の記事では高精度水晶発振器を外部につけていますが、今回は実験のためMB-R8CQに内臓の発振子を使います。
20MHzを1/8したものをクロックとしても、最長で約38msの周期にしかなりませんので、タイマZのプリスケーラに250、TZPRレジスタに250を設定して、25ms間隔で割り込みが発生するようにしておき、割り込みが40回発生することで1秒としています。
 実際の入力パルスのカウントはタイマXのイベント・カウンタモードを使用して計数します。 8ビットのダウンカウンタで、プリスケーラカウンタとあわせて16ビット幅の計数しかできませんので、カウンタがアンダーフローを起こしたものをチェックして、16ビット以上の計数を可能にしています。
 上図で、タイマXがスタートするのに1命令の遅れ、タイマZ、40回目の割り込みからタイマXが停止するまでにも数命令分の遅れがありますので、完全に1秒間の計数というわけではありません。
 
 計数値はLCDに表示しますが、3桁ずつのカンマや不必要なゼロを表示しないように工夫してみました。(プログラム参照してください)
まだまだ、表示方法には工夫する余地がありますし、ゲートタイムもいくつか選択できるようにするのも良いかと思います。
 
 ■ LTC1799モジュール基板で周波数カウンタの実測テスト

 ここまでで、自分で発振したものを自分で計測できますが、誤差の程度とかわかりませんので、秋月で販売されているLTC1799オシレーターモジュールをつないで計測してみました。

LTC1799モジュールの発振の様子→

 このオシレータモジュールは外付けの可変抵抗のみで1KHz〜30MHzまで可変できる方形波発振モジュールです。ブレッドボード上での実験のためか、高い周波数では方形波ではなくて三角波〜正弦波になっていました。また、周波数が高くなるにつれ振幅も小さくなってきていました。(20MHzでは2V p.p.程度)

左の表がLTC1799オシレーターモジュールを製作した周波数カウンタで測定した時のものです。LTC1799の出力を直接R8Cに入力しています。30MHzまでは測定できました。
 
METEXのテスタでの測定値と概ね比例していました。誤差が、低い周波数で多くなる傾向がありました。
 

 右の表は自分で発振したものを自分で測定した結果です。
 
 

 ■ 全体の回路図とプログラム
全体の回路は39-1で実験したものと、ほとんど同じですが、出力の関係でLCDのピンを移動しています。
 
出力ポートがなくなってしまったので、圧電ブザーをP1_4端子(LCD)に接続すると、ゲートタイム毎に鳴って動作確認にちょうど良くなりました。

最終的なプログラムはこちらです。 
→ sg_fc.c.txt  (テキストファイルとなっています) 
TABが4桁ですので、ブラウザで開くと見難くなります。

  
オープニング画面、必要ないですね。 発振周波数のセット画面
周波数カウンタの表示方法切替画面 周波数カウンタ、測定中の画面
参考文献
 トランジスタ技術 2005/2 連載 第4回 R8C/Tinyマイコン入門
 トランジスタ技術 2005/5 特集 R8C/Tinyマイコン徹底マスタ
 
 というわけで、簡単な回路で周波数カウンタが組めそうです。 精度の良いものはクロックに高精度の外部発振子を使わなければならないでしょうし、ゲートタイムも変更できるようにしたほうが良いと思われます。
 今回は、R8Cの勉強ということでブレッドボード上での実験にとどまりましたが、とにかくPC上で開発したものをすぐに転送して、ステップ動作で動作確認が出来、たいへん便利であるということに尽きると思います。

 さて、最終目標までに寄り道しましたが、次の実験アイディアが出てきてしまったので、そちらをやってみようと思います。

 
Last up date 2007/7/1

 

This page count Total:17866 / Today:2 / Yesterday:2  

 本業のページ