ArduinoとMCP4922(DAC)で正弦波発生・続き~周波数可変の検討~

前回はArduinoとMCP4922で正弦波発生させる実験をやってみました。

振幅を可変にするのはオペアンプの増幅率で良いとして、周波数可変をどうやれば良いか考えると、ArduinoのADCを使ってボリュームで変化させた電圧値を読めば良いかと思ったんですが、

AD変換が超高速もしくは並列処理できない限り波形発生器としては無理があるというのが結論ですね。

DDS IC(AD9850等)を使って信号発生させる方が簡単かつ時短で完成するっぽいので、そっちを使って作ろうと思います。

ただ、色々やってみて勉強にはなったのでやってみたところを以下に残しておきたいと思います。

回路図

ArduinoでADC値を読みだすための回路図とDAC出力のオペアンプによる増幅回路です。
(キャパシタ等は省略してます。)
Untitled Sketch_回路図

ADCの高速化に関しては以下の記事を参考にしました。
http://ameblo.jp/aretaumitohirunosunahama/entry-12014713486.html

タイマーに関しては以下の記事を参考にしました。
http://miso-engine.hatenablog.com/entry/2015/07/20/221014

可変周波数のためにやってみたこと

1.ADC値を読みだした後に正弦波のサンプリング点に反映

最も単純な考え方と思います。

スケッチは以下の通りです。

30行目の”Samp = analogReadVoltage(A0);”にて周波数を変えられるというものです。

これを実行すると、確かに周波数は変えられるのですが、
・ADCが安定しない
・ADC値の取り込みと反映に時間がかかる
ということもあり、安定した正弦波出力はできません。

波形例が以下です。
黄色:DAC出力 青:オペアンプ出力
wave4

変な周波数が混じっているのがわかります。

ADC値の例を以下にあげます(Timerという関数はこの後でも使っているのですが、ここではそれを使ってADC値を出力してます)。

御覧の通りADC値が安定しません。

原因としては、”リファレンス電圧が不安定”等があると考えられます。

2.タイマー割り込みを使ってADC値を反映

Arduinoはマイコンということもあり、タイマー割り込みが用意されています。

それをある時間ごとに割り込みとしてADC値を反映させて周波数可変するということです。

今回は”MsTimer2.h”を使って、200msごとに割り込みを発生させています(timerという関数)。

スケッチは上記のものとほとんど変わりません。

30行目を44行目に持ってくれば良いだけです。

結果としては、1となんら変わりません。

改善方法

改善するとなると、以下が必要かと思います。
1.ADC値の安定
2.1ができた上で、ADC値が変化したときに割り込み発生

勉強になったこと

・ADC値が安定しないことが割と予想外でした。
・タイマーが簡単に使えること。(PICでタイマーとか使ったときはもっと面倒だった思い出があります。)

おとなしくDDSで波形発生器作ります。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です