簡易版テストオッシレーターを作ってみる(3) | お父にゃんの電子工作

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

引き続き、簡易版テストオッシレーターを作っていく。

プログラマブル波形発生器のAD9833モジュールを発注したが、まだ届いていない。届くまで暇だったので、見苦しい空中配線のLCDからOLEDに付け替えてみた。

   

 

やはり、こっちの方が見ためが良い

 

 

あと、ミキサのNJM2934が4.5V以上でないと動作しないのに気が付いたので、電源を5Vに変更。

さらに、こちらのページ↓をよく見ると・・・

「 AM変調では無信号時でも搬送波が必要なので、意図的にキャリアをリークさせる必要があります。 」ということなので、信号側にリーク用の抵抗とVRを追加してある。

 

変更後の回路図はこちら↓

変更後のスケッチ

#include <SPI.h>
#include <AD9833.h>
#include <TimerTC3.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
// AD9833のピン接続
#define FSYNC_PIN 7  // FSYNCピンをデジタル7ピンに接続
#define SCK_PIN 8    // SCKピンをデジタル8ピンに接続
#define MOSI_PIN 10  // MOSIピンをデジタル10ピンに接続
#define SW_PUSH 2    // Push sw
 
// OLED設定
#define SCREEN_WIDTH 128  //OLED 幅指定
#define SCREEN_HEIGHT 64  //OLED 高さ指定
#define OLED_RESET -1     //リセット端子(未使用-1)
 
// I2Cに接続されたSSD1306用「display」の宣言
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 
int sindata[24];
int sincnt;
 
const long test_freq[] = {455000, 600000, 1000000, 1400000, 1620000};
int freq_no = 0;
 
bool PSW = false;
 
//AD9833
AD9833 ad9833(FSYNC_PIN);
 
//-----------------------------------
void setup() {
  pinMode(0, OUTPUT);   //DAC
  pinMode(SW_PUSH, INPUT_PULLUP);  //SW
  pinMode(FSYNC_PIN, OUTPUT);
  digitalWrite(FSYNC_PIN, HIGH);
 
  SPI.begin();   // SPI通信の初期化
  ad9833.begin(); // AD9833の初期化
 
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 
  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(1000); // Pause for 2 seconds
 
  // 初期値 455kHzの出力設定
  ad9833.setFrequency(test_freq[freq_no], 0);
  ad9833.setWave(AD9833_SINE);
 
  Displayout();  // display to OLED
 
  //sin波形データ作成
  for (int n=0; n < 24; n++) {
    sindata[n] = (sin(n*0.26)+1)*127;
  }
  sincnt = 0;
 
  //Timer set
  TimerTc3.initialize(69); //69usタイマー
  TimerTc3.attachInterrupt(SINOUT)  ; //割り込み関数を指定
}
//-------------------------------
// callback function
// sin波形出力
void SINOUT(){
  analogWrite(0,sindata[sincnt]);
  sincnt++;
  if (sincnt == 24){
    sincnt=0;
  }
}
//
//-------------------------------
void loop() {
  push_sw_check();
  if (PSW == true){
    freq_no +=1;
    if (freq_no > 4){
      freq_no = 0;
    }
    ad9833.setFrequency(test_freq[freq_no], 0);
    ad9833.setWave(AD9833_SINE);
 
    Displayout();
  }
  delay(200);
  // wait for Push SW off
  while (PSW == true){
    push_sw_check();
    delay (50);
  }
}
 
//-------------------------------
void push_sw_check(){
  PSW = false;
  if (digitalRead(SW_PUSH) == LOW){
    delay(50);
    if (digitalRead(SW_PUSH) == LOW){  // double check
      PSW = true;
    }
  }
}
 
//-------------------------------
// Display freqency to OLED
//-------------------------------
void Displayout(){
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);     // Start at top-left corner
  display.println("Test oscillator");
 
  display.setCursor(0, 32);
  display.setTextSize(3);
  if (test_freq[freq_no] < 1000000){
    display.print(" ");
  }
  display.print(test_freq[freq_no]/1000); //
 
  display.setCursor(80, 40);
  display.setTextSize(2);
  display.println("KHz");
 
  display.display();
}
 
準備が整ったので、また気長にAD9833モジュールが届くのを待つとする。
 
 
 
「そんなことするより、ご飯くれニャ」