写真とブレッドボード図は上下が逆です。基板はメイン部と出力部に分けることにした。メイン部は3.3V系で統一、出力部は電池電源(6V~9Vを想定)のなりゆきで使う。メイン部MPUにはATMega328Pを使い、ファームウェアはArduinoでプログラミング。Unoは外部クリスタルを使って16MHz駆動しているが、ATMega328Pの仕様では外部クリスタルを使って10MHz以上で駆動する場合は5V電源が必要となる。今回は、AD9833モジュールとUI系を司るだけなので、高速&正確なクロックは必要がなく、内部RCで8MHz駆動することにした。8MHzなら3.3V電源で間に合う。(参考「ArduinoのスケッチをAVR単体で動作させる。LCD、AD9833モジュールとも3.3V系で動作するので、全体として3.3Vで統一した。電源電圧を監視するために、回路図のC2エリア付近のR2、R3で電源電圧を分圧してAVRのPC0(ADC0)に入力して、LCDに表示するようにしている。9Vぐらいまで測れるようにするか悩み中。出力部は0.6Vp-pの波形を非反転増幅回路で、約5Vp-pまで増幅する。約5Vp-pまで増幅するので、フルスイングOPAMPを使っても電源は6V程度以上は必要で、低電圧タイプのOPAMPは不可となる。メイン部はC基板、出力部は秋月で売っているDタイプのシールドメッシュ基板を試しに使ってみることにする。シールドメッシュ基板の裏面はベタGNDではない(よく見たらベタGNDでした)が、ランド周囲をぐるっとベタパターンが囲んでいて、なんとなくノイズに強そう。EIのポストヘッダーがささらない。電池を外出しにすれば、タカチのプラケース(PB-2)で収まりそうだが、破綻したら秋月の一回り大きいポリカーボネート・ケースにする。波形(Sine/Triangle)切り替えスイッチはタクトスイッチだと、パネル取り付けの加工が難しそうなのでトグルスイッチにした。メモ:レベル調整用のPOTは通信機用のものを使いたい。基板はんだ付け→モックアップ作成→筐体作成。AD9833ファンクションジェネレータ2017年7月27日木曜日AD9833ファンクションジェネレータの構想あまり時間をかけたくないので要件を絞った。(というか実験の結果、簡単にできそうなのを選んだ)単電源波形のサイン波と三角波を出力。出力振幅は3Vp-p程度。出力帯域は可聴帯域から、できる範囲で広く。Objects」さんは、RF帯域のフィルタリングを実験されていて勉強になりますが、私はRFには全く手をつけてなく(手に負えない)、オーディオ帯域のちょっと上ぐらいまでで用は済みそう。AD9833は出力が0.6Vp-pで振幅が小さすぎるので、OPAMPで増幅することを中心にテストしてみた。ブレッドボード配線図Arduinoのひとつ下のブレッドボードがAD9833モジュール用で、ArduinoとSPI接続している。AD9833の出力から10kΩ/BのPOTで出力レベルを減衰させて、そのひとつ下のブレッドボードの出力部につないでいる。出力部は非反転増幅回路で振幅を増幅し、同じOPAMPでボルテージフォロアを組んで出力を増強している。AD9833の出力は単電源波形で出力部の電源も+5Vの単電源としたので、OPAMPは単電源用(もしくはGNDまで出せるフルスイング)のOPAMPを使う。LCDのSPLC792-I2Cと周波数選択用のロータリー・エンコーダーと波形選択用のタクトスイッチ。SPL792-I2Cが3.3V仕様なので、ここは3.3V電源にしている。いうのが出たようだ(ちょっと高い)。秋月のAQM0802AやAQM1602Aもコマンドコンパチなので使えると思う。SPLC792-I2CはオンボードでI2Cのプルアップ抵抗が載っているので、I2CのSCL、SDAは電源電圧の3.3Vでプルアップされる。RESET線はArduinoからの出力レベルが5Vなので、6.8kと12kのRで分圧して3.3Vとしている。high}AD9833の正弦波、三角波の出力レベルは0.6Vp-p、矩形波は出力レベルが電源電圧なので、5V駆動だと0V/5Vの波形になり危険なので使わないことにした。周波数切替は上位1桁を可変することにして、ロジックを考えるのがめんどくさかったのでテーブル参照にした。←まだメモリ余ってますし(^q^;自作のPCM5102ファンクションジェネレータはキーパッドで1Hz単位で周波数を指定できるようにしているが、あんまり使わなくて、上位2桁の増減でほとんど間に合っている。上位2桁でも、周波数を大きく変えるときはロータリーエンコーダーをガチャガチャ回さないといけないのでこういう仕様にした。出力部のOPAMP単電源用のNJM13404、高速単電源用のNJM2742、高精度単電源用のNJM2119、フルスイングのAD8532、AD822を差し替えてようすをみてみた。単電源用の定番のLM358はクロスオーバー歪があるので候補から外した。(ほんとにLM358は難儀な子)周波数は300kHzあたりからOPAMPの品種の違いが顕著になる。ch2:AD9833の出力ダメダメAD8532少しいびつAD822比較的きれいNJM2742スルーレート:10V/us、GBW:2MHz。高速と銘打っているので期待したが、変なノイズが乗っている。すると、ボルテージフォロアに耐えられない?NJM2119高精度だが、300kHzぐらいだと帯域外のようだ。AD822を使ってみる。手持ちの中ではAD822が良さそうなので周波数、波形を変えて測定した。AD9833の出力に入れているPOTは右いっぱいにまわして最大出力とした。ch2:AD9833の出力10kHz100kHz1MHz1MHzになると出力レベルが低下し、ほとんど増幅されない。この辺の帯域は出力部をバイパスしたほうがよさそうだ。三角波1kHz三角波100kHz100kHzになると三角波の上下端がなまり始める。OPAMPの非反転増幅回路を通すと、正弦波で数100kHz程度までしか使えなさそうだが、高周波数のノイズはOPAMPの帯域によって自然と取れるようだ。WaveSpectraWaveSpectraを使って可聴帯域のようすをみてみた。USB経由のノイズを回避するために電池(単3×6)をArduinoの電源とした。同程度になるようにオーディオ・インターフェイスの入力レベルを調整しているので正確ではないと思うが、出力部を通したほうがノイズが小さくなっている。ch2:SCL信号レベルは3.3Vになっている。RESET線の電圧はテスタで測って、3.13Vだった。73mARFアンプとは言わないまでも、OPAMPでもう少し高性能のものもあるが、だいたい両電源なので電源をちゃんと作らないといけない。いずれは試してみるとして、まずは数100kHzまでの単電源波形出力のファンクションジェネレータとして作ってみる。現状だと5V/3.3Vの電源が必要になる。LCDだけに使うのでわざわざ作るのもくやしいが、2014年末に作った可変安定化電源で使っていて実績があるので、しょうがないかな~3.3V電源だけだと出力振幅を稼げない。OPAMP比較2017年7月26日水曜日AD9833モジュールをふたたび使ってみる。以前、かんたんにテストして放置していた、AD9833のモジュールを使ってファンクションジェネレータを作ることを考えた。5LPを使ったファンクションジェネレータをサイン波の生成に使っているが、帯域は192kHzまで(きれいな正弦波を出力できるのは50kHz程度まで)で、両電源波形しか出力できない。AD9833は単電源波形で仕様上は12.5MHz出力できるので使ってみることにした。Owen」さんの記事を参考にしました。UARTでシンプルにテストブレッドボード配線図パラメータの設定はUART経由で行うので配線はシンプル。AD9833モジュールにはREFピンというのがあって、モジュールに載っている水晶のクロック信号が出力されている。Objects」のedyさんにここは接続しないほうがいいよと以前アドバイスいただいたので、はんだ付けしていたピンヘッダをニッパーで切断した。high}出力波形2MHz5MHz12MHz2MHzぐらいまでは正弦波っぽい波形だが、5MHz程度で出力レベルが低下して波形があやしくなり、12MHzではDDSのテーブルのサンプリング値の周期性のためと思われる波が発生している。※オシロの表示値は10.01MHzになっているが設定は12MHz。自作のPCM5102を使ったファンクションジェネレータでもこの現象は経験した。ファンクションジェネレータの出力波形」)DDS方式の波形生成だとナイキスト周波数付近は波形が怪しくなるので、使わないほうが無難かも知れない。WaveSpectraで測定1kHzサイン波を出力して、WaveSpectraでFFTで測定してみた。DACなので可聴帯域でも高調波歪が多い。メモ:UART通信を行うと出力波形にUARTのクロックノイズ(というのか?)が乗るようだ。AD9833は矩形波も出力できるが、正弦波、三角波は0.6Vp-pなのに大して、矩形波は電源電圧いっぱいで出力される。5LP内蔵DACとMCP4922の処理能力を見てみる。ブレッドボード配線図デバッグ情報表示用にキャラクタ液晶を接続している。80MHz駆動するために、20MHzの水晶と22pFのCを接続。水晶をつなぐPinは固定で、P15[0]、P15[1]。MCP4922はSPIの信号線を割り当てた。処理タイミングを計測するPinを割り当てた。内蔵DACの出力はP3[0]。5LPの内蔵DACはVDAC8というコンポーネントを使う。VDAC8の出力は弱いのでOPAMP(Follower)で増強する。F303で試したものとほぼおなじ処理で、事前にサイン波テーブルを生成しておいて、値を連続してDACに出力している。DACに出力する前後でPin_Check1をH/Lさせているので、Highの時間を見れば処理に要した時間がわかる。libraryをリンクする必要がある。Setting...]を選択。ダイアログでコマンドラインオプションに「-lm」を設定する。周波数は1.702MHzで1ループは約587.5ns。周波数は491.0kHzで1ループは約2037ns。5LPの内蔵DACは8bit精度ではあるが処理が速い。F446でSPIクロックが22.44MHzのとき6.74us(6740ns)だったので、こちらもかなり速い。Creatorはグラフィカルで使い易いが、ネイティブなので高速なコードを生成してくれるようだ。出力波形VDAC8サイン波の周波数:4.726kHzMCP4922サイン波の周波数:1.336kHzWaveSpectraで測定VDAC8MCP4922周波数が違うので単純に比較はできないが、VDAC8は高調波歪がはっきり出ている。Masterコンポーネントのクロックに40MHzを入れているがSCKは8.676MHzになっている。ch2:SCKCSがアクティブ(L)の区間は目盛りから読み取って約840ns。1周期は約2026nsでPin_Check1で測定した周期とほぼ同じ。Github:VDAC8https://github.com/ryood/PSoC-Creator-4.1-Test/tree/master/VDAC_Test.cydsnMCP4922https://github.com/ryood/PSoC-Creator-4.1-Test/tree/master/MCP4922_Test.cydsn<追記:2017.07.26>SCKを拡大して測定し直したら、20MHzだった。20MHzになり、たまたま少ない周波数が表示されていただけだと思う。Mode」というプロパティがあり、これをチェックしない場合最大クロック9MHz、チェックすると最大クロック18MHzまで対応する。ch2:出力電圧リードベンダでジャンパ線の加工サンハヤトのリードベンダでジャンパ線の加工をしてみた。リードベンダで所望のピッチでスズメッキ線を曲げる。熱収縮チューブをスズメッキ線に通して、基板の表側になる部分を絶縁する。φ2mmの熱収縮チューブなので収縮させてもガバガバです。径が細い方がいいかも。熱収縮チューブで絶縁しなくても使えますが、基板の表になる部分を絶縁しておくと、何かの拍子にジャンパ線がショートしてしまう可能性を減らせます。設計AD9833ファンクションジェネレータの構想AD9833モジュールをふたたび使ってみる。5LP内蔵DACとMCP4922の処理能力を見てみる。構想ウィーンブリッジ回路をAD8403で制御する。SPI制御VCAを使ってみる。バイパス・スイッチをつけた。