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

お父にゃんの電子工作

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

前回に引き続き、ラジオ調整用テストオッシレータを作ってみる。

 

大まかな仕様は以下

・出力周波数は以下の周波数をSWを押すごとに切り替える。LCDにその時の周波数を表示

 455KHz、522KHz、600KHz、1000KHz、1400KHz、1620KHz

・変調率は30~50%になるように実機で調整してみる

 

 

暫定回路はこちら

 

下準備で、NJM2594は面実装部品なので、変換基板に実装する。

はんだ付けが上手くいかず、熱を加えすぎてしまった。大丈夫だろうか・・・

 

次にSeeeduino XIAOのDACから約600Hzのサイン波を出力させてみる。

テストスケッチはこちら↓

int sindata[24];
int sincnt;
#include <TimerTC3.h>
 
void setup() {
  pinMode(0, OUTPUT);
 
  //sin波形作成
  for (int n=0; n < 24; n++) {
    sindata[n] = (sin(n*0.26)+1)*127;
  }
  sincnt = 0;
 
  TimerTc3.initialize(69); //69usタイマー
  TimerTc3.attachInterrupt(SINOUT)  ; //割り込み関数を指定
}
 
// callback function
void SINOUT(){
  analogWrite(0,sindata[sincnt]);
  sincnt++;
  if (sincnt == 24){
    sincnt=0;
  }
}
 
void loop() {
}
 

以前にも試したことが有るので、狙い通りの波形が出た。

波形はギザギザだがRCで鈍らせれば、ましな波形になるぢゃろう。

 

こちらのページ↓に有るように、信号波形はP-Pで200mVくらいが適当なようだ

抵抗分圧して200mVあたりになるように変更

 

あと、AD9833の出力が、最大0.65V、最小は0.038Vであることに気が付いた。
(p-pで約0.61V)
搬送波でp-pで100mVくらいとすると1/6くらいに分圧しておく必要がありそうだ
これと併せて、回路を変更する。
 
<暫定回路図その2>

 

 

 

次にAD9833を使って狙った周波数を出力するスケッチを書く。

めんどくさいので、ChatGPTにお願いしてみる

-----------------------------------------------------------------

<お願い>

 AD9833を使って455KHzを出力するarduinoのスケッチを書いて

<回答>

AD9833を使用して455kHzの信号を出力するArduinoのスケッチを以下に示します。このスケッチでは、SPI通信を使用してAD9833を制御します。AD9833はシリアルインターフェースを介して設定され、特定の周波数を出力するようにプログラムできます。

まず、必要なライブラリをインストールします。AD9833ライブラリを使用します。Arduino IDEでライブラリをインストールするには、ライブラリマネージャーを使用して「AD9833」で検索し、インストールしてください。

以下は、AD9833を使用して455kHzの信号を出力するArduinoのスケッチです。

#include SPI.h;
#include AD9833.h;
// AD9833のピン接続
#define FSYNC_PIN 10  // FSYNCピンをArduinoのデジタル10ピンに接続
#define SCK_PIN 13    // SCKピンをArduinoのデジタル13ピンに接続
#define MOSI_PIN 11   // MOSIピンをArduinoのデジタル11ピンに接続
 
AD9833 ad9833(FSYNC_PIN);
 
void setup() {
  // SPI通信の初期化
  SPI.begin();
 
  // AD9833の初期化
  ad9833.begin();
 
  // 455kHzの出力設定
  ad9833.setFrequency(AD9833::CHAN_0, 455000);
  ad9833.setWaveType(AD9833::CHAN_0, AD9833::SINE_WAVE);
}
 
void loop() {
  // メインループでは特に処理なし
}
void loop() {
}
このスケッチでは、AD9833ライブラリを使用してAD9833を初期化し、455kHzの正弦波信号を出力するように設定しています。
-----------------------------------------------------------------------
 
にゃるほど。
まずはAD9833ライブラリをインストールする。ライブラリマネージャーから簡単に出来る。
インストールが完了したので、試しにChatGPTの書いたコードをコンパイルしてみる。
すると、「こんなの知らない」的なエラーが出る
また、ChatGPTに嘘のコードをつかまされたようだ。
 
仕方がないので、ライブラリのサンプルコード等をざっくり確認して書き直すとエラーが出なくなった↓
#include <SPI.h>
#include <AD9833.h>
// AD9833のピン接続
#define FSYNC_PIN 10  // FSYNCピンをArduinoのデジタル10ピンに接続
#define SCK_PIN 13    // SCKピンをArduinoのデジタル13ピンに接続
#define MOSI_PIN 11   // MOSIピンをArduinoのデジタル11ピンに接続
 
AD9833 ad9833(FSYNC_PIN);
 
void setup() {
  // SPI通信の初期化
  SPI.begin();
 
  // AD9833の初期化
  ad9833.begin();
 
  // 455kHzの出力設定
  ad9833.setFrequency(455000, 0);
  ad9833.setWave(AD9833_SINE);
}
 
void loop() {
  // メインループでは特に処理なし
}
 
 
 
まだAD9833が届いてないから試せないけど、一旦全体のコードを書いて動かしてみる。
#include <SPI.h>
#include <AD9833.h>
#include <TimerTC3.h>
#include <Wire.h>
#include <I2CLiquidCrystal.h>
 
// AD9833のピン接続
#define FSYNC_PIN 7  // FSYNCピンをデジタル7ピンに接続
#define SCK_PIN 8    // SCKピンをデジタル8ピンに接続
#define MOSI_PIN 10  // MOSIピンをデジタル10ピンに接続
#define SW_PUSH 6    // Push sw
 
int sindata[24];
int sincnt;
 
const long test_freq[] = {455000, 600000, 1000000, 1400000, 1620000};
int freq_no = 0;
 
bool PSW = false;
 
// LCD
I2CLiquidCrystal lcd(30, false); //3.3V
//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);
 
  Wire.begin();
  lcd.begin(8, 2);  //LCD
  SPI.begin();   // SPI通信の初期化
  ad9833.begin(); // AD9833の初期化
 
  // 初期値 455kHzの出力設定
  ad9833.setFrequency(test_freq[freq_no], 0);
  ad9833.setWave(AD9833_SINE);
 
  lcd.setCursor(0, 0);
  lcd.print(test_freq[freq_no]/1000);
  lcd.print("KHz");
 
  //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);
 
    lcd.setCursor(0, 0);
    lcd.print("        ");
    lcd.setCursor(0, 0);
    lcd.print(test_freq[freq_no]/1000);
    lcd.print("KHz");
  }
  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;
    }
  }
}
 
むむむ、LCDが表示しない。
よく見たらI2Cにプルアップが無かった・・・・orz  自分のうっかり加減に嫌になる。
I2Cラインに10Kのプルアップを付けると、ちゃんと表示できるようになった。

 

回路図も修正しておく

<暫定回路図>

 

後はAD9833モジュール↓が届くのを待つだけ

 

中国から輸送するので時間がかかっているようだ。

(トラッキングIDで追跡すると成田には着いたらしい)

 

 

「焦らず寝て待つのニャ」