引き続き、簡易版テストオッシレーターを作っていく。
プログラマブル波形発生器の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モジュールが届くのを待つとする。
「そんなことするより、ご飯くれニャ」