目次>5章 第2ステップ(色々な実験)>(12)正弦波を作る

正弦波を作る

− 発振では無くD/A変換で −
更新日2006.10.28

D/A変換(デジタルデータをアナログ信号に変換)によりPICで正弦波を作成します。

正弦波は一般的に発振回路により作成しますが、ここでは発振回路は使わずにPICからデジタルデータを出力し、D/A変換回路とローパスフォルタできれいな正弦波を作ってみます。(あえて作成と表現しました。)
sinの計算結果に基づいていますので正確な正弦波が作成できます。

実験回路

今回作成する回路図です。
抵抗がたくさんあり複雑そうに見えますが、注意点は無く回路図通りに作れば必ず動作すると思います。

D/A変換回路(ラダー回路)

RB0〜RB7につながる抵抗群(5KΩ×7本,10KΩ×9本)は、ラダー抵抗回路と呼ばれるD/A変換回路です。
今回は、分解能8ビットとしました。(ポートをONにしたときの電圧を255等分した任意の電圧が出力できます。電源電圧が5Vの場合、約0.019V刻み。)

5KΩと10KΩは、1:2の比率であれば、1KΩと2KΩなどでもかまいません。
正確な出力が要求される場合は、テスターで計り誤差が少ない抵抗を選別しましょう。

ローパスフィルタ

その右の1KΩの抵抗と0.022μFのコンデンサはローパスフィルタで、ここでは出力波形をきれいにするために使っています。

直流分カット

さらに右の47μFのコンデンサは直流分をカットします。

周波数選択

PICの上にあるディップスイッチ(RA0〜RA3)と、RA4のスイッチおよびMCLRのプッシュボタンスイッチは、周波数選択のために使用します。

4つのディップスイッチで、16種類の中から周波数を選択します。
また、正弦波1サイクルを64分割するパターンと128分割する2パターンを用意し、これはRA4のスイッチで選択します。

設定した周波数と分割数は、MCLRのプッシュボタンスイッチを押した時に反映されます。

ブレッドボードに組み込んだ状態

5KΩの抵抗7本は、カラー表示では5.1KΩですが、テスターで4.98〜5.02KΩのものを選別しました。
10KΩの抵抗9本もテスターで測り、誤差の少ないものを選んでいます。

RA4のスイッチは、ブレッドボードで使えるタイプが手元にありませんでしたので、プッシュボタン型にしました。

プログラムの作成
プログラムの概要

正弦波の1サイクルを64分割して作成することを考えます。
下の図は、正弦波を64分割してプロットしたものです。

こちらは、同じものを棒グラフで表しています。

今回作る回路では、PORTBに出力する値(0〜255)に対応した電圧を出力できます。

出力電圧 = 電源電圧を255等分した電圧 × PORTBの値

上の棒グラフの縦軸を0〜255にして表現したものが下の図です。
縦軸の255(PORTBの最大値)は、D/A変換すると電源電圧に近い値になります。

横軸は時間で、1目盛りは正弦波の1サイクルを1/64した時間です。

従って、横軸の1目盛りに相当する時間毎に、対応する縦軸の値をPORTBに出力すると、下図のような正弦波が出力されます。
このように階段状になりますが、ローパスフィルタを介してきれいな正弦波が出力できます。

プログラム全体
今回作成したプログラムはこちらです。
メモ帳などのテキストエディタに取り込んで、SIN.ASMという名で保存し、MPLABでアセンブル&PICライタでPICに書き込んで動かしてみて下さい。

RA4のスイッチにより、1サイクルを64分割とするか128分割にするかを選択し、 ディップスイッチで出力する周波数を選択して、リセットスイッチ(MCLRに接続したプッシュスイッチ)を押すと該当する正弦波が出力されます。

出力波形
この回路での出力波形の例をいくつか載せておきます。
全て、1サイクルを64分割で作成したものです。

こちらはD/A変換の出力で、今回の回路とプログラムで出せる最低周波数の100Hzです。
ローパスフィルタを組む前の状態です。 この段階では、正弦波は前の棒グラフの通り階段状になっています。

100.4Hz
P-P:4.48V

こちらもD/A変換の出力で、最大周波数の4596Hzです。
上と同様に階段状になっています。(時間軸が変わっています。)

4596Hz
P-P:4.48V

こちらは、100Hzをローパスフィルタを通した後です。
ずいぶんきれいになりました。階段状のギザギザはほとんど見られません。

100.4Hz
P-P:4.42V

同様に、4596Hzをローパスフィルタを通した後です。
同じようにきれいな波形になりましたが、ローパスフィルタは高い周波数を抑えますので、振幅は小さくなっています。

4596Hz
P-P:1.12V

上と同じ4596Hzですが、ローパスフィルタのコンデンサを0.022uFから0.01uFに変えたものです。
波形は変わらず、振幅が約2倍にりました。

4596Hz
P-P:2.18V

PICと、D/A変換回路,ローパスフィルタできれいな正弦波を作成できます。


<いずれやってみたい追加実験>
  1. 1サイクルを64分割しているが、低い周波数(1KHz以下)では128分割にすると、よりきれいになる。
    (上記回路,プログラムで対応済み。こちらで波形の比較をしています。)

  2. 逆に、1サイクルを32分割や16分割にして高い周波数(最大で約20KHz)を作って見る。(ギザギザがはっきり見えてしまうかも)
    こちらで波形の比較をしています。

  3. 出力ピンが多いPIC16F876AやPIC16F877Aを使い、D/A変換の分解能を8ビットから10〜12ビットにすると更にきれいな波形が得られる。
    (分解能を高めるよりも分割数を増やした方がきれいな波形になると思います)

  4. 正弦波発生用と周波数決定用でPICを別々に使うと、ボリュームなどで自由に周波数を変えられる。
    PIC16F88でA/D変換し、周波数を決定してPORTBに出力。これをPIC16F876AのPORTCで受け、PORTBから正弦波のデータを出力する。 など
    考え方や回路はこちらです。

  5. 低い周波数の時と高い周波数の時で、ローパスフィルタのコンデンサ容量を変えると、出力電圧を変えずに安定したきれいな出力が得られる。

  6. 正弦波発振回路(CR発振など)の出力との比較。
    こちらでCR発振との比較をしています。

  7. 三角波やノコギリ波を作る。

  8. この回路の出力は電流を取り出せないので、トランジスタかオペアンプを追加する。
    (オペアンプをボルテージフォロアで使うと簡単にインピーダンス変換できます)