ファンクションジェネレータを自作

スポンサーリンク

はじめに

オペアンプなどを使って工作しようと思うと、やはりファンクションジェネレータが
欲しくなる。しかし本物を買おうとすると30万とか個人じゃあなかなか難しい。
そこで自作してみようと思い立った。
けっこうファンクションジェネレータを自作した先人たちがいるので、
参考にしながら第一号機を作成してみた。
今回作ったものはBNCコネクタを装備せず出力端子は皮膜線となっており
少し不格好なので、ゆくゆくは第二号機を作成するつもり。

信号発生にはDDSモジュールを使用した。Arduinoから簡単に制御できるので
今回のような場面ではもってこい。Arduinoからの移植が容易なのでマイコンはAtmega328pを使用。

使ったもの

arduino uno
・atmega328p ・AD9833 DDSモジュール

・プラスチックケース
オシロスコープ(IWATSU ss-7802 20MHz)
・16 MHz 水晶振動子
・ユニバーサル基板
・可変抵抗
・トグルスイッチ

AD9833 DDSモジュール使い方

まずは信号発生器AD9833 DDSモジュールの使い方について。
配線は以下のような対応になっている。このモジュールは類似品が複数あるようで、
若干表記や端子の数が異なるようなので、注意してほしい。

DDS Arduino pin
SDATA MOSI(11)
SCLK SCK(13)
FSYNC 10(任意)

配線したらこんな感じ

f:id:shangtian:20210810193701j:plain

コードは以下のサイトより

プログラマブル波形発生器「AD9833」による三角波/サイン波の発生 | TomoSoft

以下のコードでサイン波の出力が可能

#include <SPI.h>

const int SINE = 0x2000;
const int SQUARE = 0x2028;
const int TRAIANGLE = 0x2002;
const float refFreq = 25000000.0;
const int FSYNC = 10;

int waveType = TRAIANGLE;
unsigned long freq = 10000.0;

void setup() {
  Serial.begin(9600);
  Serial.println("AD9833 Test");

  SPI.begin();
  delay(50);

  AD9833reset();
  delay(50);
  AD9833setFrequency(freq, SINE);
}

void loop() {
  
}

void AD9833reset() {
  WriteRegister(0x100);
  delay(10);
}

void AD9833setFrequency(long frequency, int Waveform) {
  long FreqWord = (frequency * pow(2, 28)) / refFreq;

  int MSB = (int)((FreqWord & 0xFFFC000) >> 14);
  int LSB = (int)(FreqWord & 0x3FFF);

  LSB |= 0x4000;
  MSB |= 0x4000;

  WriteRegister(0x2100);
  WriteRegister(LSB);
  WriteRegister(MSB);
  WriteRegister(0xC000);
  WriteRegister(Waveform);
}

void WriteRegister(int dat) {
  SPI.setDataMode(SPI_MODE2);

  digitalWrite(FSYNC, LOW);
  delayMicroseconds(10);

  SPI.transfer(highByte(dat));
  SPI.transfer(lowByte(dat));

  digitalWrite(FSYNC, HIGH);
}

確かにサイン波がしっかり出力している。

f:id:shangtian:20210810193738j:plain

自作ファンクションジェネレータの設計

だいたいのDDSモジュールの使い方は分かったので設計に入っていこう。
基本的な要求は
1 サイン波と三角波が出力できること
2 周波数の変更が出来ること
3 9V角電池で動作 4 電源のON OFFが判別つくようにLEDを使用 5 プラスチックケースに納めカッコよくする

という要求を満たす回路を書いてみた。 三角波とサイン波の切り替えはトグルスイッチで、周波数の制御は可変抵抗を利用する。

f:id:shangtian:20210811103301p:plain

回路が決まったのでコードを書いていく。

さっそく書き込み。Atmega328pにArduino IDEから書き込む装置は
以前自作したので、そちらを使って書き込んでいく。自作した治具を用いて
ものを作っていくのは積み上がっていく感じで楽しい。 www.shangtian.tokyo f:id:shangtian:20210810194225j:plain

半田する前にブレッドボードで試作する。ジャングル配線だね f:id:shangtian:20210810202728j:plain

うまく動作している!! youtu.be

ブレッドボードで組んだ回路がうまく動作したので ユニバーサル基板へ配線していく。

半田してケースに収納

簡単な回路で半田する量はそこまで多くないけれど、
やはりユニバーサル基板へ配線するのは骨がおれる。
いつかはプリント基板に移行していきたいところ。 f:id:shangtian:20210810202637j:plain

ケースの加工途中の写真を全く撮ってなかった。
加工はハンドドリルで行った。プラスチックなのでそこまで大変では
ないのだが、ボール盤が欲しい。 f:id:shangtian:20210810202702j:plain

完成がこちら。 f:id:shangtian:20210810202608j:plain

参考文献

AD9833やAD9851など使えるDDS7選と使い方 | 電子工作

プログラマブル波形発生器「AD9833」による三角波/サイン波の発生 | TomoSoft

www.mgo-tec.com

AD9833波形発生器をArduinoで使う | e-DIYで行こう!